如何使MetaTrader4终端实时导出到CSV?

如何使MetaTrader4终端实时导出到CSV?,csv,export-to-csv,metatrader4,metatrader5,algorithmic-trading,nanomsg,zeromq,Csv,Export To Csv,Metatrader4,Metatrader5,Algorithmic Trading,Nanomsg,Zeromq,我刚刚完成构建算法,但现在我需要每分钟将数据从MetaTrader终端导出到CSV文件中,我的算法可以读取并运行预测 在线上有多种方法可以将MetaTrader数据实时导出到CSV文件,但我找不到任何方法可以让我在新蜡烛形成后立即导出它的开盘价 我想在一分钟内出口最后10支OHLC蜡烛和当前第11支蜡烛的开盘价。当前蜡烛的开盘价仍在形成中,尚未收盘。蜡烛一亮我就要这个的开价 有什么想法吗?我被困在这里了 更新 我添加了代码。 当前代码是一个MetaTrader脚本,它获取过去10支OHLCV蜡烛

我刚刚完成构建算法,但现在我需要每分钟将数据从MetaTrader终端导出到CSV文件中,我的算法可以读取并运行预测

在线上有多种方法可以将MetaTrader数据实时导出到CSV文件,但我找不到任何方法可以让我在新蜡烛形成后立即导出它的开盘价

我想在一分钟内出口最后10支OHLC蜡烛和当前第11支蜡烛的开盘价。当前蜡烛的开盘价仍在形成中,尚未收盘。蜡烛一亮我就要这个的开价

有什么想法吗?我被困在这里了

更新

我添加了代码。
当前代码是一个MetaTrader脚本,它获取过去10支OHLCV蜡烛和我提到的第11支蜡烛。
但是,这个脚本有三个问题:

  • 它不允许我覆盖现有的csv
  • 它不会实时运行并不断更新
  • 第11支蜡烛不是最新的(蜡烛仍在形成中)
  • 有什么帮助吗

    //+------------------------------------------------------------------+
    #include <stdlib.mqh>
    #include <stderror.mqh>
    //+------------------------------------------------------------------+
    //| Input Parameters Definition                                      |
    //+------------------------------------------------------------------+
    extern int    BarCount = 11;
    extern string Pairs = "EURUSD";
    extern string delimiter = ",";
    //+------------------------------------------------------------------+
    //| Local Parameters Definition                                      |
    //+------------------------------------------------------------------+
    datetime lastExport[];
    string pairs[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
    {
      //------------------------------------------------------------------
      Split(Pairs, pairs, ",");
      //------------------------------------------------------------------
      if (ArraySize(pairs) == 0 || StringTrimLeft(StringTrimRight(pairs[0])) == "")
      {
        Alert("Pairs are not entered correctly please check it...");
        return (0);
      }
      //------------------------------------------------------------------
      ArrayResize(lastExport, ArraySize(pairs));
      ArrayInitialize(lastExport, 0);
      //------------------------------------------------------------------
      Comment("quote exporter is active :)");
      //------------------------------------------------------------------
      return(0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
    {
      //------------------------------------------------------------------
      Comment("");
      //------------------------------------------------------------------
      return(0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int start()
    {
      //------------------------------------------------------------------
      if (ArraySize(pairs) == 0 || StringTrimLeft(StringTrimRight(pairs[0])) == "") return (0);
      //------------------------------------------------------------------
      BarCount = MathMin(Bars, BarCount);
      //------------------------------------------------------------------
      for (int j = 0; j < ArraySize(pairs); j++)
      {
        if (lastExport[j] == Time[0]) continue;
        lastExport[j] = Time[0];
        if (StringTrimLeft(StringTrimRight(pairs[j])) == "") continue;
        if (MarketInfo(pairs[j], MODE_BID) == 0) { Alert("symbol " + pairs[j] + " is not loaded"); continue; }
        //------------------------------------------------------------------
        string file = pairs[j] + "_" + GetTimeFrameName(0) + ".csv";
        int log = FileOpen(file, FILE_CSV|FILE_WRITE, "~");
        if (log < 0) { Alert("can not create/overwrite csv file " + file + "!"); continue; }
        string buffer;
        buffer = "Date"+delimiter+"Time"+delimiter+"Open"+delimiter+"High"+delimiter+"Low"+delimiter+"Close"+delimiter+"Volume";
        FileWrite(log, buffer);
        int digits = MarketInfo(pairs[j], MODE_DIGITS);
        for (int i = BarCount; i >= 1; i--)
        {
          buffer = TimeToStr(Time[i], TIME_DATE)+delimiter+TimeToStr(Time[i], TIME_MINUTES)+delimiter+DoubleToStr(iOpen(pairs[j], 0, i), digits)+delimiter+DoubleToStr(iHigh(pairs[j], 0, i), digits)+delimiter+DoubleToStr(iLow(pairs[j], 0, i), digits)+delimiter+DoubleToStr(iClose(pairs[j], 0, i), digits)+delimiter+DoubleToStr(iVolume(pairs[j], 0, i), 0);
          FileWrite(log, buffer);
        }
    }
      //------------------------------------------------------------------
      return(0);
    }
    //+------------------------------------------------------------------+
    string GetTimeFrameName(int TimeFrame)
    {
      switch (TimeFrame)
      {
        case PERIOD_M1: return("M1");
        case PERIOD_M5: return("M5");
        case PERIOD_M15: return("M15");
        case PERIOD_M30: return("M30");
        case PERIOD_H1: return("H1");
        case PERIOD_H4: return("H4");
        case PERIOD_D1: return("D1");
        case PERIOD_W1: return("W1");
        case PERIOD_MN1: return("MN1");
        case 0: return(GetTimeFrameName(Period()));
      }
    }
    //+------------------------------------------------------------------+
    void Split(string buffer, string &splitted[], string separator)
    {
      string value = "";
      int index = 0;
      ArrayResize(splitted, 0);
      if (StringSubstr(buffer, StringLen(buffer) - 1) != separator) buffer = buffer + separator;
      for (int i = 0; i < StringLen(buffer); i++)
        if (StringSubstr(buffer, i, 1) == separator)
    
        {
          ArrayResize(splitted, index + 1);
          splitted[index] = value;
          index ++;
          value = "";
        }
        else
          value = value + StringSubstr(buffer, i, 1);
    }
    //+------------------------------------------------------------------+
    
    //+------------------------------------------------------------------+
    #包括
    #包括
    //+------------------------------------------------------------------+
    //|输入参数定义|
    //+------------------------------------------------------------------+
    外部int BarCount=11;
    外部字符串对=“欧元美元”;
    外部字符串分隔符=“,”;
    //+------------------------------------------------------------------+
    //|局部参数定义|
    //+------------------------------------------------------------------+
    datetime lastExport[];
    字符串对[];
    //+------------------------------------------------------------------+
    //|自定义指示器初始化功能|
    //+------------------------------------------------------------------+
    int init()
    {
    //------------------------------------------------------------------
    拆分(对,对,“,”);
    //------------------------------------------------------------------
    if(ArraySize(pairs)==0 | | StringTrimLeft(StringTrimRight(pairs[0]))==“”)
    {
    警告(“配对输入不正确,请检查…”);
    返回(0);
    }
    //------------------------------------------------------------------
    ArrayResize(lastExport,ArraySize(pairs));
    阵列初始化(上次导出,0);
    //------------------------------------------------------------------
    注释(“报价导出器处于活动状态:)”;
    //------------------------------------------------------------------
    返回(0);
    }
    //+------------------------------------------------------------------+
    //|自定义指示器去初始化功能|
    //+------------------------------------------------------------------+
    去离子剂()
    {
    //------------------------------------------------------------------
    注释(“”);
    //------------------------------------------------------------------
    返回(0);
    }
    //+------------------------------------------------------------------+
    //|自定义指标迭代函数|
    //+------------------------------------------------------------------+
    int start()
    {
    //------------------------------------------------------------------
    if(ArraySize(pairs)==0 | | StringTrimLeft(StringTrimRight(pairs[0]))===“”)返回(0);
    //------------------------------------------------------------------
    BarCount=MathMin(条数,BarCount);
    //------------------------------------------------------------------
    对于(int j=0;j=1;i--)
    {
    buffer=TimeToStr(Time[i],Time\u DATE)+定界符+TimeToStr(Time[i],Time\u MINUTES)+定界符+DoubleToStr(iOpen(pairs[j],0,i),digits)+定界符+DoubleToStr(iLow(pairs[j],0,i),digits)+定界符+DoubleToStr(iOpen(iOpen(pairs[j],0,i),digits)+定界符+DoubleToStr(iVolume(pairs[j],0,i),0);
    文件写入(日志、缓冲区);
    }
    }
    //------------------------------------------------------------------
    返回(0);
    }
    //+------------------------------------------------------------------+
    字符串GetTimeFrameName(int时间段)
    {
    交换机(时间范围)
    {
    案例期间_M1:返回(“M1”);
    案例周期_M5:返回(“M5”);
    案例期间_M15:返回(“M15”);
    案例期间:返回(“M30”);
    案例期间_H1:返回(“H1”);
    案例周期_H4:返回(“H4”);
    案件期间_D1:返还(“D1”);
    案例期间:返回(“W1”);
    案例期间:返回(“MN1”);
    案例0:返回(GetTimeFrameName(Period());
    }
    }
    //+------------------------------------------------------------------+
    无效拆分(字符串缓冲区、字符串和拆分[]、字符串分隔符)
    {
    字符串值=”;
    int指数=0;
    ArrayResize(拆分,0);
    如果(StringSubstr(buffer,StringLen(buffer)-1)!=分隔符)buffer=缓冲区+分隔符;
    对于(int i=0;i//+------------------------------------------------------------------+
    #include <stdlib.mqh>
    #include <stderror.mqh>
    //+------------------------------------------------------------------+
    extern int      BarCount  =  11;
    extern string   Pairs     =  "EURUSD";
    extern string   delimiter =  ",";
           datetime lastExport[];
           string   fileNAME[];                                         // USE INSTEAD OF REPETITIVE RE-ASSIGNMENTS
           string   pairs[];
    //+------------------------------------------------------------------+
    int init() {
        //--------------------------------------------------------------
        Split( Pairs, pairs, "," );                                     // REF. BELOW FOR A PROPER APPROACH
        //--------------------------------------------------------------
        if (   0 == ArraySize( pairs )
           || "" == StringTrimLeft( StringTrimRight( pairs[0] ) )
              ){    Alert( "WARN: Pairs are not entered correctly please check it..." ); // !BLOCKS!
                    return( 0 );
        }
        //--------------------------------------------------------------
        ArrayResize(     lastExport, ArraySize( pairs ) );
        ArrayInitialize( lastExport, 0 );
        ArrayResize(     fileNAME,   ArraySize( pairs ) );              // POPULATE
        for ( int j = 0;         j < ArraySize( pairs ); j++ ) fileNAME = StringFormat( "%s_M1.CSV", pairs[j] );
        //--------------------------------------------------------------
        Comment( "INF: Script started. A quote exporter is active :)" );
        //--------------------------------------------------------------
        return( 0 );
    }
    //+------------------------------------------------------------------+
    int deinit() {                                                      // USE OnDeinit(){...} SYNTAX WITH REASON PARAMETER
        //--------------------------------------------------------------
        Comment( "INF: Script will terminate." );
        //--------------------------------------------------------------
        return( 0 );
    }
    //+------------------------------------------------------------------+
    int start() {
        //--------------------------------------------------------------
        if (  0  == ArraySize( pairs )
           || "" == StringTrimLeft( StringTrimRight( pairs[0] ) )
              ) return( 0 );
        //--------------------------------------------------------------
        for ( int j  = 0;
                  j <  MathMin( ArraySize( pairs ), CHART_MAX - 1 );
                  j++ ) //--------------------------------------------------iterateOverAllListedINSTRUMENTs:
            ChartOpen( pairs[j], PERIOD_M1 );                            // enforce MT4 DataPumps to pre-load & collect QUOTEs
        //------------------------------------------------------------------
        while ( True ) { //-------------------------------------------------iterateINFINITELY: 
                ulong loopSTART = GetMicrosecondCount();
                for ( int j = 0; j < ArraySize( pairs ); j++ ) { //---------iterateOverAllListedINSTRUMENTs:
                      if (            "" == StringTrimLeft( StringTrimRight( pairs[j] ) ) )                                        continue;   // .LOOP-NEXT INSTRUMENT
                      else                  RefreshRates();                                                                                    // .REFRESH   MT4 DataPumps
                      if (             0 == MarketInfo( pairs[j], MODE_BID ) ) { Alert( "symbol " + pairs[j] + " is not loaded" ); continue; } // .LOOP-NEXT INSTRUMENT         // !BLOCKS!
                      if ( lastExport[j] ==      iTime( pairs[j], PERIOD_CURRENT, 0 ) )                                            continue;   // .LOOP-NEXT INSTRUMENT
                      else lastExport[j]  =      iTime( pairs[j], PERIOD_CURRENT, 0 );
                      int         digits  = MarketInfo( pairs[j], MODE_DIGITS );
                      //----------------------------------------------------
                      int    logFH   = FileOpen(     fileNAME[j], FILE_CSV|FILE_WRITE, delimiter );
                      if (   logFH  == INVALID_HANDLE ) { Alert( StringFormat( "INF: Can not create / overwrite csv file(%s)! Errno(%d)", fileNAME[j], GetLastError() ) ); continue; } // !BLOCKS!
                      //----------------------------------------------------fileIO RTO:
                                                        FileWrite( logFH, "Date", "Time", "Open", "High", "Low", "Close", "Volume" );
                      for ( int i    = MathMin( BarCount,                                 iBars( pairs[j], PERIOD_CURRENT ) ); i >= 1; i-- )
                                                        FileWrite( logFH,  TimeToStr(     iTime( pairs[j], PERIOD_CURRENT, i ), TIME_DATE    ),
                                                                           TimeToStr(     iTime( pairs[j], PERIOD_CURRENT, i ), TIME_MINUTES ),
                                                                           DoubleToStr(   iOpen( pairs[j], PERIOD_CURRENT, i ), digits ),
                                                                           DoubleToStr(   iHigh( pairs[j], PERIOD_CURRENT, i ), digits ),
                                                                           DoubleToStr(    iLow( pairs[j], PERIOD_CURRENT, i ), digits ),
                                                                           DoubleToStr(  iClose( pairs[j], PERIOD_CURRENT, i ), digits ),
                                                                           DoubleToStr( iVolume( pairs[j], PERIOD_CURRENT, i ), 0      )
                                                                           );
                      //----------------------------------------------------fileIO DONE
                                                        FileClose( logFH );// @ a cost ~ 15-18 [ms]
                }
                //----------------------------------------------------------loopIO DONE
                Comment( StringFormat( "INF: Last loopIO-TAT took %d [us]. Will sleep past aNewBarEVENT( M1 )... ~ %s ( + %d [s] )",
                                        GetMicrosecondCount()-loopSTART,
                                        TimeToStr(      TimeLocal(), TIME_MINUTES ),
                                        ( 60 - MathMod( TimeLocal(), 60 ) )
                                        )
                         );
                Sleep( 250 + 1000 * ( 60 - MathMod( TimeLocal(), 60 ) ) );
                //----------------------------------------------------------loopWAIT past aNewBarEVENT
        }
        //------------------------------------------------------------------
        return( 0 );
    }
    //+------------------------------------------------------------------+
    string GetTimeFrameName( int TimeFrame ) {
           switch( TimeFrame ) { case PERIOD_M1:  return(  "M1"  );
                                 case PERIOD_M5:  return(  "M5"  );
                                 case PERIOD_M15: return(  "M15" );
                                 case PERIOD_M30: return(  "M30" );
                                 case PERIOD_H1:  return(  "H1"  );
                                 case PERIOD_H4:  return(  "H4"  );
                                 case PERIOD_D1:  return(  "D1"  );
                                 case PERIOD_W1:  return(  "W1"  );
                                 case PERIOD_MN1: return( "MN1"  );
                                 case 0:          return( GetTimeFrameName( Period() ) );
            }
    }
    //+------------------------------------------------------------------+
    void Split( string buffer, string &splitted[], string separator ) {
         string value = "";
         int    index = 0;
         ArrayResize( splitted, 0 );
         if (  StringSubstr( buffer, StringLen( buffer ) - 1 ) != separator ) buffer = buffer + separator;
         for ( int i  = 0;
                   i <  StringLen( buffer );
                   i++ )
                   if (  StringSubstr( buffer, i, 1 ) == separator          // a case, when (string) buffer[i] is actually a next (string) separator
                      || StringLen(    buffer )       == i                  // a case, when (string) buffer does not end with   a (string) separator
                         ){ //----------------------------------------------// ONCE A MANUAL FIX ENABLED TO PARSE A SINGLE-INSTRUMENT (string) buffer:
                         ArrayResize( splitted, index + 1 );
                         splitted[index] = StringTrimLeft( StringTrimRight( value ) );
                         index++;
                         value = "";
                   }
                   else
                         value = value + StringSubstr( buffer, i, 1 );
    
         /* **************************************************************** WORTH READING THE DOCUMENTATION:
         USING A BUILT-IN FUNCTION WOULD BE MUCH SIMPLER AND SAFER:
         >          
         >      int  StringSplit(  const string   string_value,             // A string to search in
         >                         const ushort   separator,                // A separator using which substrings will be searched
         >                         string        &result[]                  // An array passed by reference to get the found substrings
         >                         );
    
         int SplitINSTRUMENTs( string buffer, string &splitted[], string separator ){
             return( StringSplit(     buffer,
                                      StringGetCharacter( separator ),
                                      splitted
                                      )
                     ); // -------------------------------------------------WOULD LOVELY FIX THE WHOLE CIRCUS
         }
         */
    }
    //+------------------------------------------------------------------+