Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 848

 
Artyom Trishkin:

Quais cálculos?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

Percebi, pergunta retirada, ouvi de você e percebi que declarar uma variável na área OnTick() é ruim, e os cálculos também podem ser feitos dentro do loop.

Feito, tudo funciona graças, agora eu só preciso obter os preços. Muito obrigado.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky:

Percebi, pergunta retirada, ouvi de você e percebi que declarar uma variável na área OnTick() é ruim, e os cálculos também podem ser feitos dentro do loop.

Feito, tudo funciona graças, agora eu só preciso obter os preços. Muito obrigado.

Não são cálculos dentro do laço, mas sim a obtenção dos dados necessários, que é para o que este laço é projetado.

Mas os cálculos dentro do laço devem ser evitados.

Na verdade, você precisa reconsiderar sua abordagem imediatamente. Você está recebendo dados no loop. O loop é interrompido após os primeiros dados encontrados. Tudo isso está inteiramente dentro do conceito de uma função - devolver o resultado solicitado.

Faça todo o laço em uma função e devolva o número da barra se ela for encontrada ou WRONG_VALUE - se ela não for encontrada.

então: n=Func();

e depois usar n para seu propósito se não for igual a WRONG_VALUE. Nomeie a função com um nome "falante". E o código em OnTick() será mais curto e a lógica será mais clara - não será sobrecarregado com nada desnecessário.

 
Artyom Trishkin:

Formar todo o laço em uma função, e retornar o número de barra a partir dele, se encontrado, ou WRONG_VALUE, se não for encontrado.

Em seguida: n=Func();

e depois usar n como previsto, se não for igual a WRONG_VALUE. Nomeie a função com um nome "revelador". E o código em OnTick() será mais curto e a lógica será mais clara - não será sobrecarregado com coisas desnecessárias.

Você vive e aprende. Muito interessante, vou tentar à noite. Enquanto isso, como relatório e com grande gratidão a vocês, recebi os preços de..... Foi um bom dia :-))

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 

Gente que pode ajudar com esta pergunta https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - o comentário já foi longe? Há também uma questão de como criar um loop que pode funcionar em qualquer direção, se você precisa correr incremental se você precisa correr decremental? Aqui está um esquema de exemplo de como isso funcionaria.

Se (algo aconteceu) {atribuição de valores às variáveis} então o laço será chamado e conterá um corpo, cujos cálculos dependerão dos valores do laço

para( dependendo das variáveis acima de incremento ou decremento)

{corpo }

Não há como duplicar a condição, ela tem que ser especificada uma vez no laço. Será possível fazer isso?

 

Boa noite novamente. Eu ainda não cheguei a uma função, mas tenho uma nova pergunta. Na foto em anexo você pode ver que há um novo sinal (Flecha), mas nos comentários você pode ver que a EA não o aceita, ela ainda considera aquele de 11 velas atrás como a Flecha Suprema.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky:

11 velas atrás.

Acontece que o indicador já deu um novo sinal (está funcionando paralelamente à EA no gráfico), não há outros eventos na EA além do OnTick, e a EA não vê o sinal.

 
Sergey Voytsekhovsky:

Boa noite novamente. Eu ainda não cheguei a uma função, mas tenho uma nova pergunta. Na foto anexa você pode ver que há um novo sinal (Flecha), mas nos comentários você pode ver que a EA não o aceita, ela ainda considera aquele de 11 velas atrás como a Flecha Suprema.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

Quando encontrar um valor de buffer não vazio, imprima no registro o tempo correspondente à barra n. Você verá qual barra ele encontra. É bem possível que você esteja lendo o buffer de trás para frente.

 

Por favor, informe por que a EA não vê a seta, ela já está no buffer indicador, a julgar pela janela de dados, a EA consulta a OnTick, o que mais ela precisa? Código completo acima.


 
Artyom Trishkin:

Ao encontrar um valor de buffer não vazio, imprima no registro o tempo correspondente à barra n. Ele mostrará qual barra encontra. É bem possível que você esteja lendo o buffer de trás para frente.

OK, feito, o tempo mostra o tempo correto, o tempo de abertura da vela sobre a qual a seta está acesa. Código anexado, foto anexada.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }


 

se você não consegue ver o log na foto, aqui estão algumas entradas extremas


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00


Razão: