MT4 in einer virtuellen Maschine? - Seite 5

 
DayTrader:

Ja, dass gut an sich, aber bis mindestens MEIN Broker (und vorzugsweise mehr von ihnen) bieten MT5 Ich werde nicht einmal daran denken, alle meine Code neu zu schreiben.

In der Zwischenzeit werde ich die Arbeit durch die +4-fache Steigerung der Geschwindigkeit in W7/64, kombiniert mit der 10-fachen Steigerung von Tick-Skipping.... erhalten wir etwa 40-fache Steigerung der Geschwindigkeit.

Ihr Code überspringt zwar Ticks, aber auf eine Art und Weise, bei der wichtige Informationen verloren gehen könnten.

Verwenden Sie einen Code wie diesen:

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);
}

um Ticks zu überspringen, ohne wichtige Informationen zu verlieren.

Alle Bar-Eröffnungen, sowie neue Hochs und neue Tiefs werden nicht übersprungen.

 
Gute Idee!
 
zzuegg:

Ihr Code überspringt zwar Ticks, aber auf eine Art und Weise, bei der möglicherweise wichtige Informationen verloren gehen könnten.

Verwenden Sie einen Code wie diesen:

um Ticks zu überspringen, ohne wichtige Informationen zu verlieren.

Alle Bar-Eröffnungen sowie neue Hochs und neue Tiefs werden nicht übersprungen.


Ich weiß nicht, ob dies ein Äquivalent wäre. Allerdings könnte man beim Importieren von Daten in mt4 die Volume-Informationen entfernen. Standardmäßig werden die minimalen O-H-L-C oder 4-Ticks verwendet, das hilft, das Backtesting zu beschleunigen.

Entlang dieser Linien, hat jemand versucht, die Eingabe von Volume(s) von sagen wir 100 während einer M1-Daten importieren? Ich vermute, dass dies eine brauchbare Alternative zu Tick-Data sein sollte, wenn es funktioniert. Ich hatte vor, es zu testen, bin aber nie dazu gekommen :)

 
zzuegg:
Alle Balkeneröffnungen sowie neue Hochs und neue Tiefs werden nicht übersprungen.
Alternativ siehe Geschwindigkeit für Strategietester erhöhen - MQL4 Forum
 

Mein Broker hat jetzt MT5 auf Live-Konten aktiviert und das macht es weniger akademisch. Ich habe gestern Abend meinen ersten MQL5-Indikator (zur Anzeige des Spreads) geschrieben und heute Abend habe ich versucht, den Geschwindigkeitstest-EA von der ersten Seite dieses Threads zu konvertieren. Hier ist er ...

// 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;
}

Nun, die Idee war, die Geschwindigkeiten im Strategietester zu vergleichen, indem man gleichartige Trades durchführt. Natürlich habe ich die grundlegendste Änderung in MQL5 vergessen. Sie können nicht hedgen. Tatsächlich kann man immer nur eine Position pro Symbol offen haben, so wie es aussieht. Das bedeutet, dass Multi-Strategien, getrennt durch MAGIC_NUMBERS, unmöglich zu sein scheinen.

Mein Test-EA ist kläglich gescheitert, da er nur jede Stunde einen Handel platziert, um zu sehen, wie lange es dauert. Ein Like-for-Like-Vergleich ist auf diese Weise nicht möglich :-(