Erros, bugs, perguntas - página 561

 

ArrayInitialize não funciona código de trabalho é anexado, se descomentarmos o laço, tudo está bem.

E ao declarar variáveis na classe e indicador a nível global com o mesmo nome - surge um aviso.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Durante o fim-de-semana, enquanto não houve ticks, depurei o indicador em contas de demonstração, executando-o na última construção de duas instâncias de terminal MT5, mas de empresas diferentes: MetaQuotes e EGlobal. As definições são as mesmas em todo o lado. Para ter a certeza, verifiquei-o fora de linha, pelo que o factor "tick" está excluído.

O problema é que o código mais simples do "subindicador" (para não mencionar o indicador completo e mais complexo) apresenta um número diferente de resultados em diferentes terminais de diferentes empresas:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

1. EGlobal. 2. MetaCotações.EGlobalMetaCotações

Descarreguei completamente ambos os terminais (verificado com o Task Manager por processos de memória), carreguei-os novamente e recompilei ambos os códigos só por precaução. No final - sem alterações.

 
Não é surpreendente, é assim que deve ser.
 

MathRound() funciona de forma diferente em 4 e 5, e deve ser o mesmo.

Código de 4p:

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

Código de 5 segundos:

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound() funciona de forma diferente em 4 e 5, e deve ser o mesmo.

Código de 4 segundos:

Código de 5 segundos:

O problema está aqui:

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

Este valor é arredondado de forma diferente em 4 e 5.

 
Loky:
Não é uma surpresa, é assim que deve ser.
E mais especificamente?
 

Porque é que o MT5 não guarda o histórico de encomendas, etc., se os testes são interrompidos? Em MT4 foi salvo.

Também não há nenhum posicionamento no histórico de encomendas a partir do gráfico de testes - foi conveniente visualizar as encomendas na área de grandes drawdowns, clicando no gráfico.

 

Boa noite.

Pode explicar-me, por favor, como funciona o método SLeep()?

Deveria fazer uma pausa no Expert Advisor durante um certo período de tempo, ou estarei eu errado?


{for (int sleep=0;sleep<10000;sleep++)

se(BarsCalculated(Handle)>=o_bars_reoptimize)

{ Imprimir(BarsCalculated(Handle)); pausa; } else Sleep(100);}

Para este código, espero o resultado - se o número de barras calculado para um determinado indicador for superior a um determinado valor, o laço é quebrado; caso contrário, há um atraso de 100ms na continuação da execução do código. O atraso total total possível é de 100*10000ms....É tempo suficiente para o cálculo do indicador. Então porque é que o código continua a correr? (que segue este ciclo) Ou, no testador, esta função não funciona como eu presumo. Obrigado desde já pelo esclarecimento.

 
mi__x__an:

Boa noite.

Pode explicar-me, por favor, como funciona o método SLeep()?

Deveria fazer uma pausa no Expert Advisor durante um certo período de tempo, ou estarei eu errado?


{for (int sleep=0;sleep<10000;sleep++)

se (BarsCalculated(Handle)>=o_bars_reoptimize)

{ Imprimir(BarsCalculated(Handle)); pausa; } else Sleep(100);}

Para este código, espero o resultado - se o número de barras calculado para um determinado indicador for superior a um determinado valor, o laço é quebrado; caso contrário, há um atraso de 100ms na continuação da execução do código. O atraso total total possível é de 100*10000ms....É tempo suficiente para o cálculo do indicador. Então porque é que o código continua a correr? (que segue este ciclo) Ou, no testador, esta função não funciona como eu presumo. Obrigado desde já pelo esclarecimento.

Dormir não funciona em indicadores
 

A documentação, por exemplo, CopyBuffer, provoca o ruído cerebral: "Se quiser fazer uma cópia parcial dos valores indicadores para outro array (não o buffer de indicadores), deve utilizar o array intermédio para este fim, no qual os valores necessários são copiados. E já a partir desta matriz intermédia, efectua-se a cópia elemento por elemento do número de valores necessários para os locais certos da matriz receptora. "

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

Se obuffer_num for explicitamente referido, a necessidade de ligação preliminar da matriz receptora ao buffer indicador com um ou outro número sequencial através de SetIndexBuffer está certamente implícita. Mas,"se quisermos copiar alguns valores do indicador para outro array (não o buffer do indicador)", não podemos falar debuffer_num, uma vez que não é indicador e nós, por definição, não o ligámos a nada.

Uma contradição?

Ambiguidade?

Ou talvez eu esteja completamente programado?

Tentei encontrar uma definição clara de um tampão indicador e falhei. É realmente algum buffer ligado via SetIndexBuffer ou não é suficiente e deve ser um array com o identificador INDICATOR_DATA?