Apprendre et écrire ensemble en MQL5 - page 10

 

Je ne sais pas si c'est la bonne question.

Est-il possible de combiner le débogage et le testage ? Par exemple, si je commence avec F5, le testeur ne commence pas bien sûr. Et si je lance l'exercice dans le testeur, les points d'arrêt sont ignorés. Ou est-ce que je fais quelque chose de mal ?

 
Lunatic:

Je ne sais pas si c'est la bonne question.

Est-il possible de combiner le débogage et un testeur ?

Pas pour le moment.
 
alexvd:
Pas pour le moment.

Donc seulement en temps réel sur la démo ? Qu'en est-il du débogage dans des situations intéressantes ?

J'étais tellement excité par le débogueur au début, mais je suis en train de revenir au débogage des impressions. Aucune autre technique de débogage n'est visible. - C'est frustrant.

 

Si l'on étudie le conseiller expert fourni à titre d'exemple, MovingAverage, tout est beau. Question sur le testeur.

Cet EA analyse le chandelier uniquement sur le premier tick, j'ai remarqué que certaines situations sont glissées sans traitement. Il s'avère qu'un chandelier rare naît dès le premier tick. Est-ce un effet de connectivité, mon défaut ou celui du testeur ?

Apparemment, afin de ne traiter une bougie qu'à sa naissance, c'est-à-dire une seule fois, la dernière bougie traitée devrait être stockée dans une variable statique?

P/S/ Je commence tout juste à apprendre la langue, d'où des questions aussi fastidieuses.

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

Bonjour, je suis en train d'écrire un EA pour voir si je peux le faire à temps pour le championnat. J'ai écrit un code simple et utilisé 2 indicateurs personnalisés, mais les valeurs de ces indicateurs sont à 0 et aucune transaction n'est exécutée.

//+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

input int period =48;
input int period1 =30;
input int sl=200;
input double lot=0.1;
input long magicBUY1=102;
input int magicSELL1=202;
input string sim="eur";

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   hind1=iCustom("EURUSD",PERIOD_H1,"trend_v3_5",period);
   hind2=iCustom("EURUSD",PERIOD_H1,"trend_v3",4);



   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
IndicatorRelease(hind1);
IndicatorRelease(hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick()
  {
  
 int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
 MqlTradeResult mresult;
   MqlTick latest_price;   
 


ArraySetAsSeries(ind1,true);
ArraySetAsSeries(ind2,true);
MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

SymbolInfoTick(_Symbol,latest_price);
//BUY


   if (PositionSelect(_Symbol)==1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){jj=1;} //определяет если позиция BUY
   if (jj==0 ){
if ( ind2[1]>ind1[1]){ // условие на покупку
Print("индикатор=",ind2[1]," ",ind1[1]);
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - sl*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(0,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

GlobalVariableSet( "k11"+sim,Bars2);
GlobalVariableSet( "bar11"+sim,Bars("EURUSD",NULL));
}}
   
  
  }
//+------------------------------------------------------------------+
 

Lunatic:

Cet EA analyse une bougie uniquement sur le premier tick. J'ai remarqué que certaines situations passent sans être traitées. Il s'avère qu'un chandelier rare naît dès le premier tick. Est-ce un effet de connectivité, mon défaut ou celui du testeur ?

Apparemment, pour traiter un chandelier uniquement à la naissance, c'est-à-dire une fois, nous devrions stocker le dernier chandelier traité dans une variable statique?

Il est préférable de suivre l'apparition d'une nouvelle barre en modifiant l'heure de la barre, en la stockant préalablement dans une variable statique.

Vous trouverez des exemples dans l'article IsNewBar et dans l'article Limitations et contrôles dans les EA.

 
Automated-Trading:

On peut mieux suivre l'apparition d'une nouvelle barre en changeant l'heure de la barre, en l'ayant préalablement enregistrée dans une variable statique.

Vous trouverez des exemples dans IsNewBar et dans l'article Limites et contrôles dans les EA.

Merci, c'est clair.

Mais voici ce que je ne comprends pas : comment déboguer les EA. Il est clair que ce n'est pas le système qui est testé, mais les bogues du programme. Par exemple, il n'est pas clair pourquoi le programme n'entre pas dans une certaine branche - pourquoi ? Dois-je mettre différents tampons de débogage, puis les chercher dans le journal, puis mettre d'autres tampons, attendre un certain temps jusqu'à ce que le programme fonctionne, puis regarder à nouveau dans le journal ?

Quelle est la meilleure façon de rechercher des erreurs de programme ?

 
m_a_sim:

Bonjour, je suis en train d'écrire un EA pour voir si je peux le faire à temps pour le championnat. J'ai écrit un code simple, il utilise 2 indicateurs personnalisés, mais la valeur de ces indicateurs est 0, donc le trade n'est pas fait.

Pour déboguer votre code, j'ai remplacé les indicateurs personnalisés par MA :

   hind1=iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE);
   hind2=iMA("EURUSD",PERIOD_H1,40,0,MODE_SMA,PRICE_CLOSE);

Et correction de la copie des valeurs dans le tableau :

MAX=CopyBuffer(hind1,0,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

Il existe maintenant des valeurs indicatrices :

//+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

input int period =48;
input int period1 =30;
input int sl=200;
input double lot=0.1;
input long magicBUY1=102;
input int magicSELL1=202;
input string sim="eur";

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   hind1=iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE);
   hind2=iMA("EURUSD",PERIOD_H1,40,0,MODE_SMA,PRICE_CLOSE);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
IndicatorRelease(hind1);
IndicatorRelease(hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick()
  {
  
int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
MqlTradeResult mresult;
   MqlTick latest_price;  



ArraySetAsSeries(ind1,true);
ArraySetAsSeries(ind2,true);
MAX=CopyBuffer(hind1,0,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

SymbolInfoTick(_Symbol,latest_price);
//BUY


   if (PositionSelect(_Symbol)==1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){jj=1;} //определяет если позиция BUY
   if (jj==0 ){
if ( ind2[1]>ind1[1]){ // условие на покупку
Print("индикатор=",ind2[1]," ",ind1[1]);
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - sl*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(0,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

}}
  
  
  }
//+------------------------------------------------------------------+
 
AM2:

Pour déboguer votre code, j'ai remplacé les indicateurs personnalisés par des MA :

Et corrigé la copie des valeurs dans le tableau :

Il existe maintenant des valeurs indicatrices :

Tout est donc une question d'indicateurs ? Le testeur me donne une erreur

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Tableau hors limites dans 'trend_v3.mq5' (71,9)
2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Tableau hors limites dans 'trend_v3_5.mq5' (83,9)

 

A m_a_sim

Je pense qu'il est plus correct de vérifier le caractère handicapant des poignées avant de copier les informations des indices. Il serait également préférable de vérifier la disponibilité de ces données .....

MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);
Raison: