Erreurs, bugs, questions - page 343

 
Kairoser:

Bonjour !

Après la mise à niveau vers la version 420, j'ai commencé à tester mon EA et j'ai remarqué qu'il a commencé à "perdre" pour une raison quelconque. J'ai analysé mes trades et j'ai remarqué que le stop loss est déclenché à des prix inexistants. Par exemple, j'ai fixé le stop loss à 1.06520 sur EURUSD, mais cela fonctionne, bien que le prix maximal soit de 1.05920. En regardant plus loin, je vois beaucoup d'offres de ce type. Le Take Profit est déclenché par le même principe (à des prix inexistants) - le delta est le même - 600 points. Dans le testeur sur le graphique, les flèches vers le haut et vers le bas "pendent" dans l'air, loin des barres.

Une capture d'écran est jointe.

Faites des tests sur MetaQuotes-Demo, s'il vous plaît. Alpari a un historique graphique manifestement erroné (dans les spreads).
 
Renat:
Faites des tests sur MetaQuotes-Demo, s'il vous plaît. Alpari a un historique graphique manifestement erroné (dans les spreads).
Oui, en effet, tout fonctionne bien sur le serveur MetaQuotes-Demo. Merci pour votre aide.
 

Quelques questions sont intéressantes.

1. Si des indicateurs sont utilisés dans le testeur de stratégie, comment le système fonctionne-t-il ? D'abord, tous les indicateurs pour lesquels les poignées sont calculées et seulement ensuite OnTick est lancé ?

2. Si oui, il serait bon de démarrer OnTick d'abord, puis d'exécuter une commande pour calculer les indicateurs joints. Ainsi, par exemple, je n'ai pas besoin de calculer des indicateurs sur chaque tick à cinq chiffres, mais seulement sur quatre chiffres. Lorsque je lance OnTick, je vérifie le prix actuel et le prix précédent et je décide de lancer ou non le calcul des indicateurs.

Car s'il y en a beaucoup et qu'ils sont assez "lourds", ils consomment des ressources en mode optimisation...

Cependant, vous pouvez essayer de créer des poignées dans ontick et de supprimer les indicateurs à la fin et au prochain début d'ontick (si nécessaire) créer à nouveau des poignées - et il n'est pas certain que cela améliore les performances...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
olyakish:

Quelques questions sont intéressantes.

1. Si des indicateurs sont utilisés dans le testeur de stratégie, comment le système fonctionne-t-il ? D'abord, tous les indicateurs pour lesquels les poignées sont calculées et seulement ensuite OnTick est exécuté ?

Oui. La réponse la plus générale est que toutes les valeurs des indicateurs sont calculées avant chaque appel du gestionnaire d'événement :

  • OnTick
  • OnTimer
  • OnChartEvent et ainsi de suite
 
olyakish:
2. Si c'est le cas, il serait très utile d'exécuter d'abord OnTick et ensuite d'exécuter le calcul des indicateurs attachés avec cette commande. Par exemple, je n'ai pas besoin de calculer les indicateurs à chaque tick à cinq chiffres, mais seulement à quatre chiffres. Lorsque je lance OnTick, je vérifie le prix actuel et le prix précédent et je décide de lancer le calcul des indicateurs ou non.

Car s'il y en a beaucoup et qu'ils sont assez "lourds", ils consomment des ressources en mode optimisation...

Vous ne pouvez pas faire ça. Vous pouvez utiliser des modes de génération de tics plus rapides pour les tests :

  1. Prix OHLC sur les barres minutes
  2. Seulement les prix ouverts de la période testée
 
Rosh:

Tu ne peux pas le faire de cette façon. Vous pouvez utiliser des modes de génération de tics plus rapides pour les tests :

  1. Prix OHLC sur les barres minutes
  2. Prix d'ouverture de la période testée uniquement
Je connais ces modes et leurs particularités. Je voulais juste accélérer l'optimisation d'une manière raisonnable (probablement optimale).
 

Aide, les fonctions de conversion de données ne veulent pas fonctionner, j'ai écrit un script simple pour le tester. Build 420, 64 bit OS.

void OnStart()
  {
//---
   int i=0;
   bool res=false;
   string stroka1;
   string stroka2;
   string stroka3;
   string stroka4;
   string stroka5;

   datetime buf1;
   double   buf2;
   double   buf3;
   double   buf4;
   double   buf5;
   
   int filehandle=FileOpen("56451.csv",FILE_READ|FILE_CSV|FILE_ANSI,',',CP_UTF8);

   if(filehandle==INVALID_HANDLE)Print("Ошибка № - ",GetLastError());
   else
     {

      while(!res)
        {
         stroka1 = FileReadString(filehandle);
         stroka2 = FileReadString(filehandle);
         stroka3 = FileReadString(filehandle);
         stroka4 = FileReadString(filehandle);
         stroka5 = FileReadString(filehandle);

         buf1 = StringToTime(stroka1);
         buf2 = StringToDouble(stroka2);
         buf3 = StringToDouble(stroka3);
         buf4 = StringToDouble(stroka4);
         buf5 = StringToDouble(stroka5);

         res=FileIsEnding(filehandle);
         i++;
        }
      FileClose(filehandle);
     }
  }
//+------------------------------------------------------------------+
Dossiers :
56451.zip  16 kb
 
sergey1294:

Aide, les fonctions de conversion de données ne veulent pas fonctionner, j'ai écrit un script simple pour le tester. Build 420, 64 bit OS.


Débarrassez-vous des guillemets à n'importe quelle étape....
 
AlexSTAL:
Débarrassez-vous des guillemets à n'importe quelle étape....
Comment faites-vous cela ?
 
sergey1294:
Comment faites-vous ?

Il faut soit s'assurer qu'ils ne sont pas initialement dans le fichier, soit appliquer une fonction supplémentaire lors de la lecture, par exemple :

string StringWithoutQuotes(string Value)
{
   StringTrimLeft(Value);
   StringTrimRight(Value);
   return(StringSubstr(Value, 1, StringLen(Value) - 2));
}

..........

         stroka1 = StringWithoutQuotes(FileReadString(filehandle));
         stroka2 = StringWithoutQuotes(FileReadString(filehandle));
Raison: