代码之家  ›  专栏  ›  技术社区  ›  Keith Power

mql4将对象保存到数组,然后保存到文件

  •  0
  • Keith Power  · 技术社区  · 5 年前

    我有一个arrayobject类,当创建或删除新记录时,我会保存信息。然后在ea初始化时加载回数据

    我不确定如何从对象创建多数组以保存/加载文件

    main.mql4

    #include <CTrade.mqh>
    
    CArrayObj* listOfTrades=NULL;
    
    int OnInit()
      {
        //initialise listOfTrades and load saved data from file
        listOfTrades = new CArrayObj;
    
     }
    void OnDeinit(const int reason)
      {
    
       if(CheckPointer(listOfTrades)==POINTER_DYNAMIC)
          delete(listOfTrades);
    
      }
    void OnTick(){ checkTPHit(listOfTrades); }
    

    信号.mql4

    void Trigger()
      {
             //Create Order
             int newTicket=NewOrder(symbol, order, LotSize, price, takeprofit2, stoploss, comment, 5000);
             if(newTicket>0)
             {
                for(int i=listOfTrades.Total()-1;i>=0;i--){
                   CTrade *trade=listOfTrades.At(i);
                   if(!trade.isTicketExist())
                      {listOfTrades.Delete(i);continue;}
                }
                listOfTrades.Add(new CTrade(ticket,entry, tp1, tp2, tp3, sl));
                listOfTrades.saveToFile;
                listOfTrades.printTrades;
             } 
    }
    

    CTrade.mql4

    #include <Object.mqh>
    #include <Arrays\ArrayObj.mqh>
    
    class CTrade : public CObject
       {
    private:
       string file = "CTrade.csv"
    
    public:
       int      m_ticketId;
       double   m_entry, m_tp1, m_tp2, m_tp3, m_sl;
    
               CTrade(const int ticket, entry, tp1, tp2, tp3, sl){
                  m_ticketId=ticket;
                  m_oop=entry;
                  m_tp1=tp1;
                  m_tp2=tp2;
                  m_tp3=tp3;
                  m_sl=sl;
               }
      bool     isTicketExist(){
                 if(OrderSelect(m_ticketId,SELECT_BY_TICKET))
                       return(OrderCloseTime()==0);
                 else return(false);//or GetLastError()!=4108
               }
    
               saveToFile (){
                //save data to file everytime add/delete, to load when the ea is initilaized again
    
                //create multidimensional array and get its size to save to file from objects
    
                //save to file
                 int handle=FileOpen(file,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON);
                 if(handle!=INVALID_HANDLE)
                   {
                    //--- write array data to the end of the file
                    FileSeek(handle,0,SEEK_END);
                    FileWriteArray(handle,arr,0,arraySize);
                    //--- close the file
                    FileClose(handle);
                   }
                 else
                    Print("Failed to open the file, error ",GetLastError());            
    
               }
    
               loadData () {
                // load data on the ea's initilization
               }
    
               printTrades(){
                //method to print to terminal while in testing phase
                CArrayObj* _listOfTrades
                for(int i=_listOfTrades.Total()-1;i>=0;i--)
                  {
                   CTrade* trade=_listOfTrades.At(i);
                   // action with CTrade object
                   printf(trade.m_ticketId);
                  }            
               }
       };
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Daniel Kniaz    5 年前

    我用 JAson.mqh 用于将数据保存到json的库-它更简单。我使用json.mqh(如果需要,可以在SOF上使用以前的消息,或者从以下网址下载 http://lordy.co.nf )用于反序列化,因为第一个库在解析数组时有一个错误(或者可能已经修复,不知道)。 如果您需要反序列化示例,请在评论中索取链接

    #include <JAson.mqh>  //https://www.mql5.com/en/code/13663
    class CTrade : public CObject{
       //...
    
       public:
          static void jsonList(CArrayObj* list, CJAVal &js)
          {
             for(int i=0;i<list.Total();i++)
             {
               CTrade *trade=list.At(i);
               js["array"].Add(trade.json());
             }
          }
          CJAVal         json()const
          {
             CJAVal result;
                result["ticketId"]=(string)m_ticketId;
                result["entry"]=DoubleToString(m_entry,_Digits);
                result["tp1"]=DoubleToString(m_tp1,_Digits);
                result["tp2"]=DoubleToString(m_tp2,_Digits);
                result["tp3"]=DoubleToString(m_tp3,_Digits);
                result["sl"]=DoubleToString(m_sl,_Digits);
             return result;
          }
     };
    
     void save(CArrayObj* list)
     {
        int handle=FileOpen(generateFileName(InpMagicNumber,_Symbol),FILE_WRITE);
        if(handle==INVALID_HANDLE){Print(__LINE__,__FILE__," error# ",_LastError);return;}
        FileWriteString(handle,CTrade::jsonList(list).Serialize());
        FileClose(handle);
     }