在虚拟机中使用MT4? - 页 5

 
DayTrader:

是的,这本身就很好,但直到至少我的经纪人(最好是更多的经纪人)提供MT5,我甚至不会考虑重写我所有的代码。

同时,我将通过W7/64的+4倍速度来完成工作,再加上跳过刻度的10倍,....,我们的速度增加 了约40 倍。

你的代码确实跳过了刻度线,但它跳过的方式可能会使重要的 信息丢失。

使用这样的代码。

bool SkipTick(){
   static datetime curr=0;
   static double askHi=0;
   static double askLo=0;
   static double bidHi=0;
   static double bidLo=0;
   if(curr!=Time[0]){
      curr=Time[0];
      askHi=Ask;
      askLo=Ask;
      bidHi=Bid;
      bidLo=Bid;
      return (false);
   }else{
      if(Ask>askHi || Ask<askLo){
         askHi=MathMax(Ask,askHi);
         askLo=MathMin(Ask,askLo);
         return(false);
      }
      if(Bid>bidHi || Bid<bidLo){
         bidHi=MathMax(Bid,bidHi);
         bidLo=MathMin(Bid,bidLo);
         return(false);
      }
   }
   return(true);
}

在不丢失重要信息的情况下跳过刻度线。

所有条形图的打开,以及新的高点和新的低点都不会被跳过。

 
好主意!
 
zzuegg:

你的代码确实跳过了刻度,但它跳过的方式可能会使重要信息丢失。

使用这样的代码。

在不丢失重要信息的情况下跳过点位。

所有条形图的开口以及新高和新低都不会被跳过。


我不知道这是否是一个等价物。默认情况下,它将使用最小的O-H-L-C或4-Ticks,这有助于加快回测的速度。

沿着这个思路,有没有人试过在M1数据导入过程中输入比如100的成交量?我的猜测是,如果它有效的话,这应该是Tick-Data的一个可行的替代品。我打算测试一下,但一直没有动手 :)

 
zzuegg:
所有条形图的打开,以及新的高点和新的低点都不会被跳过。
另外,请参阅提高策略测试器的速度 - MQL4论坛
 

我的经纪人现在已经在真实账户上启用了MT5,这使得它变得不那么学术。我昨晚写了我的第一个MQL5指标(显示点差),今天晚上我尝试着转换了本主题第一页中的速度测试EA。这里是...

// MQL5 code

const int SECONDSPERHOUR=3600;

input int stops = 250;

double lots= 0.0;

//+-------------------------------------------------------------------------------------------+
int OnInit(){
    lots = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
    return(0);
}
//+-------------------------------------------------------------------------------------------+
void OnDeinit(const int reason){ 
}
//+-------------------------------------------------------------------------------------------+
void OnTick(){
    static long lastHour=0;
    
    datetime now= TimeCurrent();
    long hourNow = SECONDSPERHOUR *(((long)now) / SECONDSPERHOUR); 
    
    if( lastHour== hourNow )
        return;
    
    lastHour= hourNow;
    
    MqlTick lastTick;
    SymbolInfoTick(_Symbol,lastTick);
    
    MqlTradeResult result={0};
    
    MqlTradeRequest requestA={0};
    requestA.action=TRADE_ACTION_DEAL;
    requestA.symbol= Symbol();
    requestA.type = ORDER_TYPE_BUY;
    requestA.volume= lots;                  
    requestA.sl=    NormalizeDouble( lastTick.ask - stops*_Point, _Digits );
    requestA.tp=    NormalizeDouble( lastTick.ask + stops*_Point, _Digits );

    OrderSend(requestA,result);
    if( result.retcode != TRADE_RETCODE_DONE )
        Print("BUY order failed: " + IntegerToString(result.retcode));
    
    SymbolInfoTick(_Symbol,lastTick);
      
    MqlTradeRequest requestB={0};
    requestB.action=TRADE_ACTION_DEAL;
    requestB.symbol= Symbol();
    requestB.type = ORDER_TYPE_SELL;

    requestB.volume= lots;                  
    requestB.sl=    NormalizeDouble( lastTick.bid + stops*_Point, _Digits );
    requestB.tp=    NormalizeDouble( lastTick.bid - stops*_Point, _Digits );
    
    OrderSend(requestB,result);
    if( result.retcode != TRADE_RETCODE_DONE )
        Print("SELL order failed: " + IntegerToString(result.retcode));
    
    return;
}

现在的想法是在策略测试器中 比较速度,做类似的交易。当然,我忘记了MQL5中最根本的变化。你不能进行对冲。事实上,从表面上看,你只能在每个符号上开一个头寸。这意味着用MAGIC_NUMBERS分隔的多策略,似乎是不可能的。

我的测试EA惨遭失败,因为它只是每小时进行一次交易,看看需要多长时间。这样做一个类似的比较是不可能的 :-(