Erros, bugs, perguntas - página 1343

 
StrategyTester:

Olá.

Pergunta sobre o MT5 e o seu Testador.

Tenho um Expert Advisor de múltiplas moedas autoescrito, que chama um indicador de múltiplas moedas autoescrito que calcula alguns rácios entre dois pares de moedas. Durante os testes e depuração encontrei um problema: no Terminal em algum momento a linha "A" é superior à linha "B", enquanto no Testador de Estratégia no mesmo momento e com as mesmas configurações de indicadores com visualização ligada, a linha "A" é inferior à linha "B". E em geral: o aparecimento das linhas indicadoras no Terminal é fundamentalmente diferente do que consta no Testador de Estratégia. Pergunta: Isto é uma falha do Testador MT5 ou um erro no código?


Deixem-me esclarecer: estou a ver um redesenho do indicador.

 
Karputov Vladimir:
O indicador é sempre desenhado da forma como está no terminal. Talvez no testador seja necessário experimentar várias modalidades (todas as carraças, preços matemáticos e assim por diante).
Experimentei "All ticks", "OHLC on M1", "Preço de abertura apenas". O resultado é o mesmo - o indicador é redesenhado. A opção"Cálculos Matemáticos" não está activa, não está disponível.
 
StrategyTester:
Testado "Todas as carraças", "OHLC na M1", "Apenas preços de abertura". O resultado é o mesmo - o indicador ruiva. A opção"Cálculos Matemáticos" não está activa, não está disponível.
Nesse caso, por favor, forneça-me o código.
 

Pergunta aos criadores: Sob que condições é o histórico do símbolo considerado dessincronizado, ou seja, a sérieInfoInteger(símbolo, ponto, SÉRIE_SYNCHRONIZED) retorna falso?

A questão é que ocasionalmente encontro uma situação em que valores falsos são devolvidos por um determinado símbolo em todos os períodos de tempo, apesar de existir um histórico para este símbolo (as barras e outras funções devolvem valores não zero). Qual pode ser a razão?

 

Existe também um problema deste tipo. Ao ler o histórico de vários símbolos / prazos no indicador através de CopyTime, CopyClose, etc., o indicador pisca frequentemente.Isto não é o resultado de renderização (não há recálculo de barras), mas apenas a imagem inteira desaparece por uma fracção de segundo, e depois aparece novamente. E por vezes não para fracções, mas para segundos inteiros. Normalmente é observado durante a rolagem do gráfico. Se as séries cronológicas solicitadas forem pequenas, o problema não ocorre.

Gostaria de ouvir os criadores comentarem como isto pode ser relacionado.

 
Karputov Vladimir:
Nesse caso, queira fornecer o código.

Anexo uma ilustração das diferenças no terminal e no testador e o código do indicador.

//+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property  indicator_color1 SkyBlue
#property  indicator_color2 Yellow
#property  indicator_type1 DRAW_LINE
#property  indicator_type2 DRAW_LINE
//---
enum TT{_close=0,_open=1,_high=2,_low=3};
//---
input string activ1="GBPUSD",activ2="EURUSD";
input TT PriceType=_close;
input int Len=100;
//---
double ratio[],avr[];string NN[]={"rr1","rr2","aa1","aa2"};
//---
void setv(int i,double v){ObjectSetDouble(0,NN[i],OBJPROP_PRICE,v);}
//---
int OnInit()
{
   SetIndexBuffer(0,ratio);
   PlotIndexSetString(0,PLOT_LABEL,"Ratio");
   SetIndexBuffer(1,avr);
   PlotIndexSetString(1,PLOT_LABEL,"Avr");
   ArraySetAsSeries(ratio,1);
   ArraySetAsSeries(avr,1);
   for(int i=0;i<4;i++)ObjectCreate(0,NN[i],22,0,0,0);
return(INIT_SUCCEEDED);
}
//---
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
int limit=0;double zz[4];

  if(prev_calculated==0){limit=MathMin(Bars(activ1,0),Bars(activ2,0));limit--;}
  else limit=rates_total-prev_calculated;
  if(limit==0)limit=1;
  double Price1[],Price2[]; ArraySetAsSeries(Price1,1); ArraySetAsSeries(Price2,1);
  getV(Price1,Price2,limit);
  for(int i=0;i<limit;i++){if(Price1[i]>0&&Price2[i]>0)ratio[i]=Price1[i]/Price2[i];else ratio[i]=ratio[i+1];}
  
  double sred=0,sum=0; 
  for(int i=0;i<limit;i++)
      {
      sred=0;
      avr[i]=SimpleMA(i,Len,ratio);
      
      for(int j=i;j<i+Len;j++)
        {
        if(j>=ArraySize(ratio))break;
      if(ratio[j]==0||ratio[j]==EMPTY_VALUE){sred=0;break;}
      sred=1;
        }
      }
      
  if(prev_calculated!=0)for(int i=0;i<10;i++)if(ratio[i]==0)ratio[i]=ratio[i+1];
  
zz[0]=ratio[1];zz[1]=ratio[2]; zz[2]=avr[1];zz[3]=avr[2];
for(int i=0;i<4;i++)setv(i,zz[i]);
return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
{
if(PriceType==_close){CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_open){CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_high){CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_low){CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);}
}
//---
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
      //--- calculate value
      if(position+period+1>ArraySize(price))return(0);
      for(int i=0; i<period; i++) result+=price[position+i];
      result/=period;
   return(result);
  }
//---
 

Em geral, com funções

Copy

têm outros problemas,

Deparei-me com o facto de que quando esta função é chamada pode "congelar" a EA, escrevi um programa usando um grande número de símbolos e fiz cálculos sobre a história durante literalmente os últimos 3 dias em cada símbolo,

Costumava ter momentos em que tudo ficava pendurado durante alguns minutos, mal percebi que era a função Copiar. A função manipulava com segurança 150-200 símbolos, depois desligava, pendurava em símbolos diferentes ...

O tempo de espera variava entre 5 segundos e 2-3 minutos.

 
As funções de cópia em EAs são síncronas e esperam a paginação de dados se não estiverem disponíveis.
 
StrategyTester:

Estou a anexar uma ilustração das diferenças no terminal e no testador e o código do indicador.

Há um erro na função:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
  {
   if(PriceType==_close)
     {
      CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_open)
     {
      CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_high)
     {
      CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_low)
     {
      CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
  }

Está a tentar copiar os dados de outro símbolo à pressa. Não deve fazer isto. Os dados devem primeiro ser descarregados, preparados e verificados. Aqui está a descrição:Organização do acesso aos dados

 
Karputov Vladimir:

Há um erro na função:

Está a tentar copiar os dados de outro personagem à pressa. Esta não é a forma de o fazer. Os dados devem primeiro ser carregados, preparados, assegurados... Aqui está a descrição:Organização do acesso aos dados

Obrigado pela dica. Vou dar uma vista de olhos.