MT4 dans une machine virtuelle ? - page 5

 
DayTrader:

Oui, c'est bien en soi, mais tant qu'au moins mon courtier (et de préférence un plus grand nombre) ne proposera pas MT5, je ne penserai même pas à réécrire tout mon code.

En attendant, je vais faire le travail grâce à la vitesse multipliée par 4 dans W7/64, combinée à la vitesse multipliée par 10 du tick skipping.... combinée, nous obtenons une vitesse multipliée par 40.

Votre code saute effectivement les ticks, mais il le fait d'une manière qui peut entraîner la perte d'informations importantes.

Utilisez un code comme celui-ci :

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

pour sauter les ticks sans perdre d'informations importantes.

Toutes les ouvertures de barres, ainsi que les nouveaux sommets et les nouveaux creux ne sont pas ignorés.

 
Bonne idée !
 
zzuegg:

Votre code permet de sauter des ticks, mais il le fait d'une manière qui peut entraîner la perte d'informations importantes.

Utilisez un code comme celui-ci

pour sauter les ticks sans perdre des informations importantes.

Toutes les ouvertures de barres, ainsi que les nouveaux sommets et les nouveaux creux ne sont pas ignorés.


Je ne sais pas si cela serait équivalent. Cependant, on pourrait supprimer les informations sur le volume lors de l'importation des données dans mt4. Par défaut, il utilisera le minimum de O-H-L-C ou 4-Ticks, ce qui permet d'accélérer le back-testing.

Dans le même ordre d'idées, quelqu'un a-t-il essayé d'entrer un ou des volumes de 100 pendant une importation de données M1 ? Je pense que cela devrait être une alternative viable aux Tick-Data si cela fonctionne. J'avais prévu de le tester mais je ne l'ai jamais fait :)

 
zzuegg:
Toutes les ouvertures de barres, ainsi que les nouveaux sommets et les nouveaux creux, ne sont pas ignorés.
Alternativement, voir Augmenter la vitesse du testeur de stratégie - Forum MQL4
 

Mon courtier a maintenant activé MT5 sur les comptes Live, ce qui rend les choses moins académiques. J'ai écrit mon premier indicateur MQL5 (pour afficher le spread) la nuit dernière et ce soir j'ai essayé de convertir l'EA de test de vitesse de la première page de ce fil. Le voici ...

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

L'idée était de comparer les vitesses dans le testeur de stratégie en faisant des transactions similaires. Bien sûr, j'ai oublié le changement le plus fondamental dans MQL5. Vous ne pouvez pas vous couvrir. En fait, vous ne pouvez avoir qu'une seule position ouverte par symbole, à ce qu'il semble. Cela signifie que le multi-stratégie, séparé par MAGIC_NUMBERS, semble être impossible.

Mon EA de test a échoué lamentablement car il ne fait que placer une transaction toutes les heures pour voir combien de temps cela prend. Il n'est pas possible de faire une comparaison à l'identique de cette manière :-(