Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 466

 

Saudações a todos. Tenho uma pergunta a fazer. Tenho um indicador (fractais modificados), quando carregado num gráfico tudo está correcto, funciona como deveria, mas quando tento utilizá-lo num EA, diz que o tampão está vazio. Ao mesmo tempo, ao passar o tampão em Deinit, armazena os valores correctos.

O código fonte do indicador está anexado. Estou pronto a ouvir dicas e sugestões sobre o que estou a fazer mal.

Código da EA:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
Arquivos anexados:
 
Karputov Vladimir:

Pode substituir o "se" no final por "se":

(se for tão simples como isso,:)

Obrigado

 
Maxim Dobrovolskii:

Saudações a todos. Tenho uma pergunta a fazer. Tenho um indicador (fractais modificados), quando carregado num gráfico tudo está correcto, funciona como deveria, mas quando tento utilizá-lo num EA, diz que o tampão está vazio. Ao mesmo tempo, ao passar o tampão em Deinit, armazena os valores correctos.

O código fonte do indicador está anexado. Estou pronto a ouvir dicas e sugestões sobre o que estou a fazer mal.

Código da EA:

Um olhar muito rápido sobre o assunto. Pergunta: Posso ter um fractal na barra de zero ? Mas em OnDeinit(), você laça através das barras e naturalmente encontra um fractal (não um valor tampão vazio).
 
Artyom Trishkin:
Um olhar muito rápido. Pergunta: pode um fractal estar numa barra de zero ? Mas em OnDeinit() você laça através das barras e naturalmente encontra um fractal (não um valor tampão vazio).
Em Deinit, eu também faço loop through 4-6 e tudo está no seu lugar e tem valores.
 
Maxim Dobrovolskii:
Em Deinit, eu também passo por 4-6 e tudo está no seu lugar.

Em OnDeinit() corre-se num loop (de 0 a 100) através das barras à procura de um valor diferente de zero e regista-se o valor encontrado.

Em OnTick() tenta-se produzir apenas as últimas 6 barras de tampão 0. Pode não haver fractal neles.

Primeiro, encontrar a barra com o fractal e depois imprimir o valor dessa barra.

 
Artyom Trishkin:

Em OnDeinit() corre-se num loop (de 0 a 100) através das barras à procura de um valor diferente de zero e regista-se o valor encontrado.

Mas em OnTick(), tenta-se imprimir apenas as últimas 6 barras de tampão 0. Pode não haver fractal neles. Primeiro, encontrar a barra com o fractal e depois imprimir o valor desta barra.

A 6ª barra é suposta conter fractal.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 fractal Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 fractal Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 fractal Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 fractal Up: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Função Deinit
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi! teste iniciado

O teste começou, o Expert Advisor trabalhou, Deinit foi carregado e fractal foi encontrado às 6. Não sei como abordar o tampão indicador.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

reprodução de imagens.

Arquivos anexados:
 
Maxim Dobrovolskii:

a 6ª barra deve conter um fractal.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 fractal Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 fractal Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 fractal Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 fractal Up: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Função Deinit
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi! teste iniciado

Este é o início do registo. início do teste, o Conselheiro Especialista trabalhou, Deinit começa, e imediatamente na 6ª posição encontra um fractal.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

Não sei como abordar o tampão indicador.

Este aqui:

if(Time[0] == prevtime) return;
   prevtime = Time[0];

do

prevtime = Time[0];

mesmo no final

 
Artyom Trishkin:

Isto:

do

mesmo no final.

como é que isto o pode afectar? infelizmente, nada mudou.

como imagino o processo: o indicador é carregado, começa a verificar cada condição de tick/bar, se a condição é satisfeita, coloca o valor no buffer ou buffers seleccionados, então a EA chama o indicador pelo número do buffer ao valor com um determinado offset e toma o valor. Certo?

 
Maxim Dobrovolskii:

como é que isto o pode afectar? infelizmente, nada mudou.

como imagino o processo: o indicador é carregado, começa a verificar a condição a cada tique/barra, se for cumprido, coloca o valor no buffer ou buffers seleccionados, depois a EA chama o indicador pelo número do buffer para o valor com um determinado desvio e toma o valor. Certo?

E porque é que existe uma nova barra no indicador? Aparentemente, não há cálculos complexos
 
Victor Nikolaev:
Porque é que existe um novo controlo de barras no indicador? Aparentemente, não há cálculos complicados
controlo de uma nova barra no EA que utiliza o indicador.
Razão: