Aprender y escribir juntos en MQL5 - página 10

 

No sé si esta es la pregunta correcta.

¿Es posible combinar la depuración y el comprobador? Es decir, si inicio con F5, el probador no se inicia por supuesto. Y si inicio el exprrt en el tester, los puntos de ruptura son ignorados. ¿O estoy haciendo algo mal?

 
Lunatic:

No sé si esta es la pregunta correcta.

¿Es posible combinar la depuración y un probador?

No por el momento.
 
alexvd:
No por el momento.

¿Sólo en tiempo real en la demo? ¿Qué pasa con la depuración en situaciones interesantes?

Al principio estaba muy entusiasmado con el depurador, pero estoy volviendo a depurar impresiones. No se ve ninguna otra técnica de depuración. - Frustrante.

 

Estudiando el Asesor Experto suministrado como ejemplo, MovingAverage. Todo en él es hermoso. Pregunta sobre el probador.

Este EA analiza la vela sólo en el primer tick. He notado que algunas situaciones se deslizan sin procesar. Resulta que un raro candelabro nace del primer tick. ¿Es un efecto de conectividad, un fallo mío o del probador?

Aparentemente, para procesar una vela sólo al nacer, es decir, una vez, la última vela procesada debería almacenarse en una variable estática?

P/S/ Apenas empiezo a aprender el idioma, de ahí las preguntas tan tediosas.

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

Hola, estoy escribiendo un EA para ver si puedo llegar a tiempo para el campeonato. Escribí un código simple, que utiliza 2 indicadores personalizados, pero el valor de estos indicadores es 0, por lo que el comercio no se hace.

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

Este EA analiza una vela sólo en el primer tick. Me he dado cuenta de que algunas situaciones se cuelan sin procesar. Resulta que un raro candelabro nace del primer tick. ¿Es un efecto de conectividad, un fallo mío o del probador?

Aparentemente, para procesar una vela sólo al nacer, es decir, una vez, la última vela procesada debería almacenarse en una variable estática?

Es mejor seguir la aparición de una nueva barra cambiando el tiempo de la misma, almacenándolo previamente en una variable estática.

Se pueden encontrar ejemplos en IsNewBar, y en el artículo Limitaciones y comprobaciones en los EAs.

 
Automated-Trading:

La aparición de una nueva barra se rastrea mejor cambiando la hora de la barra, habiéndola guardado previamente en una variable estática.

Se pueden encontrar ejemplos en IsNewBar, y en el artículo Límites y controles en los EAs.

Gracias, está claro.

Pero esto es lo que no entiendo: cómo depurar los EAs. Está claro que no es el sistema lo que se está probando, sino los fallos del programa. Por ejemplo, no está claro por qué el programa no entra en una determinada rama, ¿por qué? ¿Tengo que poner diferentes sellos de depuración, luego buscarlos en el diario, luego poner otros sellos, esperar un tiempo determinado hasta que el programa funcione y volver a buscar en el diario?

¿Cuál es la mejor manera de buscar errores en los programas?

 
m_a_sim:

Hola, estoy escribiendo un EA para ver si puedo llegar a tiempo para el campeonato. Escribí un código simple, que utiliza 2 indicadores personalizados, pero el valor de estos indicadores es 0, por lo que el comercio no se hace.

Para depurar su código he sustituido los indicadores personalizados por MA:

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

Y se ha corregido el copiado de valores en el array:

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

Ahora hay valores indicadores:

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

Para depurar su código he sustituido los indicadores personalizados por MA:

Y corregido el copiado de valores en el array:

Ahora hay valores indicadores:

¿Así que se trata de los indicadores? El probador me da un error

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Array fuera de rango en 'trend_v3.mq5' (71,9)
2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 Array fuera de rango en 'trend_v3_5.mq5' (83,9)

 

A m_a_sim

Creo que es más correcto comprobar la hándicap de las asas antes de copiar la información de los índices. También sería mejor comprobar la disponibilidad de estos datos ....

MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);
Razón de la queja: