Imparare e scrivere insieme in MQL5 - pagina 10

 

Non so se questa è la domanda giusta.

È possibile combinare debug e tester? Cioè se inizio con F5, il tester non parte ovviamente. E se avvio l'exprrt nel tester, i breakpoint vengono ignorati. O sto facendo qualcosa di sbagliato?

 
Lunatic:

Non so se questa è la domanda giusta.

È possibile combinare il debug e un tester?

Non al momento.
 
alexvd:
Non al momento.

Quindi solo in tempo reale sulla demo? E il debugging in situazioni interessanti?

All'inizio ero così entusiasta del debugger, ma sto scivolando indietro al debug delle stampe. Non sono visibili altre tecniche di debug. - Frustrante.

 

Studiando l'Expert Advisor fornito come esempio, MovingAverage, tutto è bellissimo. Domanda sul tester.

Questo EA analizza la candela solo sul primo tick. Ho notato che alcune situazioni sono scivolate senza elaborazione. Si scopre che una rara candela nasce dal primo tick. È un effetto della connettività, un mio difetto o quello del tester?

Apparentemente, per elaborare una candela solo alla nascita, cioè una volta, l'ultima candela elaborata dovrebbe essere memorizzata in una variabile statica?

P/S/ Sto iniziando a imparare la lingua, da qui queste domande noiose.

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

Ciao, sto scrivendo un EA per vedere se riesco a fare in tempo per il campionato. Ho scritto del semplice codice e ho usato 2 indicatori personalizzati, ma i valori di questi indicatori sono 0 e non vengono eseguiti trade.

//+------------------------------------------------------------------+
//|                                                  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:

Questo EA analizza una candela solo sul primo tick. Ho notato che alcune situazioni scivolano senza essere elaborate. Si scopre che una rara candela nasce dal primo tick. È un effetto della connettività, un mio difetto o quello del tester?

Apparentemente, per elaborare una candela solo alla nascita, cioè una volta, l'ultima candela elaborata dovrebbe essere memorizzata in una variabile statica?

È meglio tracciare l'apparizione di una nuova barra cambiando il tempo della barra, memorizzandolo precedentemente in una variabile statica.

Esempi possono essere trovati nell'articolo IsNewBar e nell'articolo Limitazioni e controlli negli EA.

 
Automated-Trading:

L'apparizione di una nuova barra è meglio tracciata cambiando il tempo della barra, avendolo precedentemente salvato in una variabile statica.

Esempi possono essere trovati in IsNewBar, e nell'articolo Limiti e controlli negli EA.

Grazie, è chiaro.

Ma ecco quello che non capisco: come fare il debug degli EA. È chiaro che non è il sistema ad essere testato, ma i bug del programma. Per esempio, non è chiaro perché il programma non entra in un certo ramo - perché? Devo mettere diversi timbri di debug, poi cercarli nel diario, poi mettere altri timbri, aspettare un certo tempo finché il programma funziona e poi cercare di nuovo nel diario?

Qual è il modo migliore per cercare gli errori del programma?

 
m_a_sim:

Ciao, sto scrivendo un EA per vedere se riesco a fare in tempo per il campionato. Ho scritto del semplice codice, usa 2 indicatori personalizzati, ma il valore di questi indicatori è 0, quindi il trade non viene fatto.

Per eseguire il debug del tuo codice ho sostituito gli indicatori personalizzati con MA:

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

E copia corretta dei valori nell'array:

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

Ora ci sono valori indicatori:

//+------------------------------------------------------------------+
//|                                                  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:

Per eseguire il debug del tuo codice ho sostituito gli indicatori personalizzati con MA:

E ha corretto la copia dei valori nell'array:

Ora ci sono valori indicatori:

Quindi è tutta una questione di indicatori? Il tester mi dà un errore

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Array out of range in 'trend_v3.mq5' (71,9)
2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Array out of range in 'trend_v3_5.mq5' (83,9)

 

A m_a_sim

Penso che sia più corretto controllare l'handicap delle maniglie prima di copiare le informazioni dagli indici. Sarebbe anche meglio controllare la disponibilità di questi dati ....

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