Erreurs, bugs, questions - page 119

 
J'ai lu quelque part sur un forum que les commentaires pendant les tests ne sont pas écrits dans le journal (afin d'économiser de l'espace disque). Ma question est donc la suivante : comment puis-je déboguer le programme dans le testeur ? J'ai essayé printf et PrintFormat - rien ne fonctionne dans le testeur, j'ai même essayé Alert.
 
Scriptong:
J'ai lu quelque part sur un forum que les commentaires pendant les tests ne sont pas écrits dans le journal (afin d'économiser de l'espace disque). Ma question est donc la suivante : comment puis-je déboguer le programme dans le testeur ? J'ai essayé printf et PrintFormat - rien ne fonctionne dans le testeur, j'ai même essayé Alert.
Regardez les journaux des agents de test - tout y est écrit, mais seulement pour les agents locaux. Les agents distants n'écrivent pas la sortie Print() dans les journaux pour des raisons de sauvegarde de l'information.
Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Общие функции / Print - Документация по MQL5
 

Vérifié. Mon agent est local (du moins, il est répertorié dans Local). Après avoir exécuté Expert Advisor en mode"Every tick", le contenu de l'onglet "Log" correspond au contenu du fichier journal de l'agent (Expert Advisor et fichiers journaux joints).

Oui, j'ai oublié. La période de test est "le mois dernier".

Dossiers :
test.mq5  2 kb
 

Votre journal indique "debug version of 'test.ex5', please recompile it".

Cela signifie qu'un EX5 destiné au débogage (en appuyant sur F5 dans l'éditeur, on obtient un EX5 avec des informations de débogage) ne peut pas être exécuté dans le testeur.

Nous ferons une recompilation automatique de ces EAs. En attendant, recompilez manuellement votre EA.

 
alexvd:
Et vous pouvez apporter le code complet ?

Et j'ai probablement fait remonter tout ça, je ne vois pas d'autre raison...

Je vais essayer de décrire la situation de manière plus détaillée.

Il y a une classe simple "CMqlTimer", la tâche de cette classe est de suivre le moment de changement de différents intervalles de temps : heure, jour, semaine, mois, année.

Tout est réalisé avec des primitives très simples, par exemple, si les minutes sont égales à 0, c'est qu'il y a une "nouvelle heure" ; si le numéro du jour de la semaine ne correspond pas à celui stocké dans la variable, c'est qu'il y a alternance de jours ("00:00:00" à l'heure du serveur). Et ainsi de suite.

L'analyse est effectuée lorsque le timer est déclenché, avec un intervalle de 1 seconde, le travail est effectué dans CMqlTimer::OnTimer(). Si l'intervalle de temps change, la fonction doit être exécutée. Par exemple, si c'est un "nouveau" jour, la fonction CMqlTimer::OnRolloverDay() doit être exécutée.


Si nous supprimons le reste du code et n'écrivons que OnRolloverDay(), le résultat sera le suivant :

//Function CMqlTimer.OnRolloverDay
bool CMqlTimer::OnRolloverDay()
//Дневной ролловер
{
//----------------------------------------------------------------------------//
//Work variables
string MessageText; //Text for message
int    UserEventID; //Identifier of the user event  

bool Result; //Returned importance
//----------------------------------------------------------------------------//

Result = true;

ResetLastError();

RolloverCountDay = RolloverCountDay+1;

UserEventID = CHARTEVENT_CUSTOM+15;
MessageText = StringFormat("Rollover Day (№ %d)",RolloverCountDay); //Можно просто "Rollover Day"
//We refer user event of the work chart
EventChartCustom(0,(ushort)UserEventID-CHARTEVENT_CUSTOM,0,0,MessageText);

//Checking for presence of the errors
  if(_LastError!=0)
  //В результате работы произошла ошибка
  {
  Result = false;  
  }
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}

Tous les événements de l'utilisateur sont suivis et transmis pour traitement à la classe principale.

Cela ressemble à quelque chose comme ceci

void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
//                          Processing user events                            //
//----------------------------------------------------------------------------//
  if(id>CHARTEVENT_CUSTOM)
  //User event is received
  {
  Expert.OnEvent(id,lparam,dparam,sparam);
  }
//----------------------------------------------------------------------------//  
}

Ainsi, les événements n'atteignent pas OnChartEvent en mode test, c'est-à-dire que l'Expert Advisor ne peut pas traiter un événement envoyé en utilisant EventChartCustom en mode test. Je l'ai vérifié en affichant tous les événements dans le journal.

PS

La chose la plus intéressante est que la démo tous les événements atteindre, mais dans le testeur est de travail refuse.

Avant le 319, tout fonctionnait et dans le testeur, les événements étaient traités avec succès. C'est vrai que la dernière version où ça a marché, je ne peux pas dire...

 
stringo:

Votre journal indique "debug version of 'test.ex5', please recompile it".

Cela signifie qu'un EX5 destiné au débogage (en appuyant sur F5 dans l'éditeur, on obtient un EX5 avec des informations de débogage) ne peut pas être exécuté dans le testeur.

Nous ferons une recompilation automatique de ces EAs. En attendant, recompilez manuellement votre EA.

Merci. Je ne savais pas qu'il y avait une différence entre les fichiers obtenus en appuyant sur F5 et F7.
 
Interesting:

Et j'ai probablement fait remonter tout ça, je ne vois pas d'autre raison...

Je vais essayer de décrire la situation de manière plus détaillée.

...
Merci. Nous allons y réfléchir.
 

Je ne comprends pas ce qui ne va pas, EA fonctionne dans le testeur sans erreurs et dans la machine de test de l'organisateur passe aussi sans erreurs.

Lorsque je l'exécute sur un compte de démonstration, j'obtiens une erreur lorsque j'essaie d'ouvrir un ordre :

2010.09.06 13:26:50 Trades '101894' : échec de l'achat instantané de 0.10 USDJPY à 84.179 [Mode de remplissage non supporté].
2010.09.06 13:26:45 Trades '101894' : échec de l'achat instantané de 0.10 USDCAD à 1.03689 [Mode de remplissage non supporté].
2010.09.06 13:26:39 Trades '101894' : échec de l'achat instantané de 0.10 USDJPY à 84.174 [Mode de remplissage non supporté].
2010.09.06 13:26:34 Trades '101894' : échec de l'achat instantané de 0.10 USDCAD à 1.03685 [Mode de remplissage non supporté].
2010.09.06 13:26:28 Trades '101894' : échec de l'achat instantané de 0.10 USDJPY à 84.174 [Mode de remplissage non pris en charge].
2010.09.06 13:26:23 Trades '101894' : échec de l'achat instantané de 0.10 USDCAD à 1.03688 [Mode de remplissage non supporté].
2010.09.06 13:26:18 Trades '101894' : échec de l'achat instantané de 0.10 USDJPY à 84.181 [Mode de remplissage non supporté].

Demande de vente :

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_BID);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_SELL;
         request.type_filling=ORDER_FILLING_CANCEL

Demande de BUY :

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_ASK);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_BUY;
         request.type_filling=ORDER_FILLING_CANCEL;

OrderCheck ne trouve pas d'erreur.


 

Remplacé la requête ORDER_FILLING_CANCEL par la requête ORDER_FILLING_AON, l'expert fonctionne.

Mais le problème reste entier, pourquoi y a-t-il une telle différence dans le fonctionnement du testeur et du serveur.


Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

Quelle blague si le serveur du championnat devient l'inverse.