Erreurs, bugs, questions - page 1935

 
fxsaber:
La branche est un exemple de déclaration constructive que chacun peut reproduire.

Je comprends - je posterais bien le code, mais il utilise une classe pour les fonctions commerciales que je n'ai pas encore payée...

Lors du rendu, j'observe un ralentissement progressif - presque deux secondes par barre à la vitesse maximale - une idée de ce que cela pourrait être ?

Pas de contrôle antivirus, disque SSD, espace disponible...

 
Aleksey Vyazmikin:

Réécriture d'un EA de MT4 à MT5

L'histoire est la même, les tests par points de contrôle sur procès-verbal.

MT5

2017.07.20 20:01:38.059 Core 1 Si-9.17,M1 : 107509 ticks, 35385 barres générées. Environnement synchronisé à 0:00:00.078. Test passé en 0:03:52.707 (incluant le prétraitement des ticks 0:00:00.031).

MT4

2017.07.20 20:02:32.696 RUBRUR,M1 : 225314 événements tick (35701 barres, 231783 états de barre) traités en 0:00:04.259 (temps total 0:00:11.310)

Et où est la vitesse louée de MT5 ?
Montrez-moi le code des deux conseillers experts. Vous avez l'émulateur MQL4 paresseux au lieu du MQL5 natif, non ?
 
Renat Fatkhullin:
Vous montrez le code des deux EAs. Vous avez l'émulateur MQL4 paresseux au lieu du MQL5 natif, non ?

Pas encore prêt à montrer le code en raison de

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Aleksey Vyazmikin, 2017.07.20 23:28


Je comprends - je posterais bien le code, mais il utilise une classe pour les fonctions de négociation que je n'ai pas encore payée...

Mais je suis prêt à montrer les résultats du profilage à partir de MT5 - si je comprends bien, les fonctions de trading sont hors de question.



Pour l'environnement OHLC, j'utilise les fonctions suivantes

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
Peut-être que je fais quelque chose de mal ?
 
Aleksey Vyazmikin:

Je ne suis pas encore prêt à montrer le code en raison de

Mais je suis prêt à montrer les résultats du profilage à partir de MT5 - comme je comprends les fonctions de trading sont hors de question.

Pour l'environnement OHLC, j'utilise les fonctions suivantes

Peut-être que je fais quelque chose de mal ?
double iOpen(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyOpen(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iClose(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyClose(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyHigh(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iLow(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyLow(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }
 

Vous copiez toutes les barres disponibles dans l'histoire, mais vous n'avez besoin que de l'index que vous recherchez.

CopyOpen(Symbol(),0,index,Bars(Symbol(),0)1,Open);
 
Vitaly Muzichenko:

Vous copiez toutes les barres disponibles dans l'histoire, mais vous n'avez besoin que de l'index que vous recherchez.

Je l'ai modifié selon votre recette et EA a cessé d'ouvrir les commandes... Peut-être que j'ai encore tout gâché ?


//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,index,1,Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyHigh(symbol,timeframe,index,1,CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }
 
Aleksey Vyazmikin:

Vous avez changé votre recette et l'EA a cessé d'ouvrir les commandes... Peut-être que j'ai encore tout gâché ?


double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,index,1,Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }

Close != High


PS. Veuillez écrire ici, ce n'est pas le sujet

Je demande aux modérateurs de déplacer les messages vers le bon sujet, et non de détruire celui-ci.

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Vitaly Muzichenko:

Close != High

PS. Postez ici, ce n'est pas le bon sujet.

Je demande aux modérateurs de déplacer les messages vers le bon sujet, et non de jeter la pagaille dans celui-ci.

Merci - corrigé.

Le code est le suivant.

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

Le temps passé dans le testeur a augmenté - fatigué d'attendre :)

 

Je compte les lots échangés dans l'historique pour le mois en cours.

   double lots=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
         if(TimeMonth(OrderCloseTime())==TimeMonth(TimeCurrent()))
            if(OrderType()<2)
               lots+=OrderLots();

Il s'avère que si j'affiche les ordres pour une période donnée dans l'historique du terminal, par exemple pour les trois derniers jours, alorsOrdersHistoryTotal() ne voit que les trois derniers jours.

Je pense que ce n'est pas correct.OrdersHistoryTotal() devrait voir toutes les commandes de l'historique complet, mais le filtrage par dates et périodes devrait être effectué par un développeur.

Sinon, un masquage incorrect de l'historique par l'utilisateur peut entraîner des problèmes .....

 
Aleksey Vyazmikin:

Je ne suis pas encore prêt à montrer le code en raison de

Mais je suis prêt à montrer les résultats du profilage à partir de MT5 - si je comprends bien, les fonctions de trading sont hors de question.



Pour l'environnement OHLC, j'utilise les fonctions suivantes

Peut-être que je fais quelque chose de mal ?

Malheureusement, vous vous y prenez mal.

Au lieu d'écrire un code MQL5 natif et efficace, vous utilisez un émulateur MQL4 terriblement inefficace qui décuple la lenteur du travail.

Le problème, c'est que vous ne savez même pas ce que vous faites, puisque vous posez des questions sur la vitesse.
Raison: