Aprender e escrever juntos em MQL5 - página 10

 

Não sei se esta é a pergunta certa.

É possível combinar depuração e teste? Isto é, se eu começar com F5, o testador não começa, claro. E se eu começar o exprrt no testador, os pontos de ruptura são ignorados. Ou estou a fazer algo de errado?

 
Lunatic:

Não sei se esta é a pergunta certa.

É possível combinar a depuração e um testador?

Neste momento, não.
 
alexvd:
Neste momento, não.

Então só em tempo real na demonstração? E a depuração em situações interessantes?

No início estava tão entusiasmado com o depurador, mas estou a deslizar de volta para as impressões de depuração. Nenhuma outra técnica de depuração é visível. - Frustrante.

 

O estudo do Expert Advisor fornecido como exemplo, MovingAverage. Tudo sobre ele é bonito. Pergunta sobre o testador.

Esta EA analisa o candelabro apenas no primeiro tick. Notei que algumas situações são escorregadias sem processamento. Acontece que um castiçal raro nasce do primeiro tique. É um efeito de conectividade, a minha falha ou a do testador?

Aparentemente, para processar uma vela apenas no nascimento, ou seja, uma vez, a última vela processada deve ser armazenada numa variável estática?

P/S/ Apenas a começar a aprender a língua, daí as perguntas tão enfadonhas.

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

Olá, estou a escrever um EA para ver se consigo chegar a tempo do campeonato. Escrevi algum código simples, utiliza 2 indicadores personalizados, mas o valor destes indicadores é 0, pelo que a troca não é feita.

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

Esta EA analisa uma vela apenas no primeiro tique. Notei que algumas situações escapam sem processamento. Acontece que um castiçal raro nasce do primeiro tique. É um efeito de conectividade, a minha falha ou a do testador?

Aparentemente, para processar um castiçal apenas no nascimento, ou seja, uma vez, o último castiçal processado deve ser armazenado numa variável estática?

É melhor acompanhar o aparecimento de um novo bar alterando o tempo do bar, armazenando-o previamente numa variável estática.

Exemplos podem ser encontrados no artigo IsNewBar, e no artigo Limitações e verificações em EAs.

 
Automated-Trading:

O aparecimento de um novo bar é melhor rastreado alterando o tempo do bar, tendo-o previamente guardado numa variável estática.

Exemplos podem ser encontrados em IsNewBar, e o artigo Limites e verificações em EAs.

Obrigado, isso é claro.

Mas eis o que eu não entendo: como depurar EAs. É evidente que não é o sistema que está a ser testado, mas sim os bugs no programa. Por exemplo, não é claro porque é que o programa não entra num determinado ramo - porquê? Preciso de colocar selos de depuração diferentes, depois procurá-los no diário, depois colocar outros selos, esperar um certo tempo até que o programa esteja a funcionar e depois procurar novamente no diário?

Qual é a melhor maneira de procurar erros de programa?

 
m_a_sim:

Olá, estou a escrever um EA para ver se consigo chegar a tempo do campeonato. Escrevi algum código simples e usei 2 indicadores personalizados, mas os valores destes indicadores são 0 e nenhuma negociação é executada.

Para depurar o seu código, substituí 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);

E cópia corrigida de valores em matriz:

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

Agora existem 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 o seu código, substituí os indicadores personalizados por MA:

E corrigiu a cópia dos valores para a matriz:

Agora existem valores indicadores:

Então é tudo sobre os indicadores? O testador está a dar-me um erro

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:00:01 Array fora de alcance em 'trend_v3.mq5' (71,9)
2010.09.01 19:44:36 Core 1 2010.06.01 00:00:00:01 Array fora de alcance em 'trend_v3_5.mq5' (83,9)

 

Para m_a_sim

Acho que é mais correcto verificar a deficiência das pegas antes de copiar a informação dos índices. Seria também melhor verificar a disponibilidade destes dados ....

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