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

 

Pessoal, olá a todos os profissionais e a quem sabe como!

Tenho um problema com a obtenção de dados de um indicador - por favor, me ajudem, quem pode fazer isso....

Objetivo da função: Calcular a distância média em pontos entre as linhas externas do indicador"Bollinger Bands", para o período especificado.

A essência do problema: Não consigo obter os valores reais do preço nas linhas do indicador para a barra especificada, porque, por algum motivo, o mesmo valor de preço é gravado em diferentes buffers do indicador, o que também não corresponde aos valores reais de nenhuma das linhas dessa barra. E, como resultado, algum valor de preço desconhecido é gravado em diferentes buffers (em diferentes solicitações), o que anula todo o trabalho adicional da função.
Além disso, usando exatamente o mesmo método dessa função, consegui obter indicadores de quaisquer outros indicadores, mas aqui não funciona....

int Bollinger_Bands(int _Average_Period, int _Number)
{
   double   Buffer_BASE_LINE[];                                                                          // Массив Буффера Линии BASE_LINE
   double   Buffer_UPPER_BAND[];                                                                         // Массив Буффера Линии UPPER_BAND
   double   Buffer_LOWER_BAND[];                                                                         // Массив Буффера Линии LOWER_BAND
   int      Bar_Cash             = _Average_Period;                                                                       // Количество плучаемых значений от индикатора
   int      Bands_Handel         = 0;                                                                       // Хендл индикатора Bollinger_Bands
   //---//
   double   Base_Line            = 0;                                                                       // Значение линии BASE_LINE
   double   Upper_Line           = 0;                                                                       // Значение линии UPPER_BAND
   double   Lower_Line           = 0;                                                                       // Значение линии LOWER_BAND
   //---//
   double   Band_Size_Buffer[];											// Буфер расчётных значений разницы между линиями индикатора 
   int      Band_Size_Total      = 0;										// Итог среднего значения расстояния между линиями в пунктах
   ENUM_APPLIED_PRICE   applied_price = PRICE_CLOSE; // тип цены 
   //---//
      ArrayResize(Band_Size_Buffer,_Average_Period+1);  
      ArrayResize(Buffer_UPPER_BAND,_Average_Period+1);
      ArrayResize(Buffer_LOWER_BAND,_Average_Period+1);
      //---//
         Bands_Handel = iBands(_Symbol,PERIOD_CURRENT,20,2,0,applied_price);
         //---//      
            CopyBuffer(Bands_Handel,0,_Number,_Average_Period,Buffer_BASE_LINE);       ArraySetAsSeries(Buffer_BASE_LINE,true);
            CopyBuffer(Bands_Handel,1,_Number,_Average_Period,Buffer_UPPER_BAND);      ArraySetAsSeries(Buffer_UPPER_BAND,true);
            CopyBuffer(Bands_Handel,2,_Number,_Average_Period,Buffer_LOWER_BAND);      ArraySetAsSeries(Buffer_LOWER_BAND,true);
            //---//

         //---//  Тут получение значений для выбранного номера бара из переменной которая передаётся в функцию (использовал как проверку получения данных по линиям)
         Base_Line   = NormalizeDouble(Buffer_BASE_LINE[_Number], _Digits);      //Alert("Base_Line[",_Number,"] = ",Base_Line);
         Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[_Number], _Digits);     //Alert("Upper_Line[",_Number,"] = ",Upper_Line);
         Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[_Number], _Digits);     //Alert("Lower_Line[",_Number,"] = ",Lower_Line);
             //---//
         
         
         //---// ** А это расчёт среднего расстояния между внешними линиями Боллинджера за указанный период. Получается 0 потому что одно число отнимается само от себя.
         for(int i=_Average_Period; i>=0; i--) { 
         //---//
            Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[i], _Digits);     //Alert("Upper_Line[",i,"] = ",Upper_Line);
            Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[i], _Digits);     //Alert("Lower_Line[",i,"] = ",Lower_Line);
            //---//
               Band_Size_Buffer[i] = NormalizeDouble( ((Upper_Line - Lower_Line) / _Point), 2);     //Alert("Band_Size_Buffer[",i,"] = ",Band_Size_Buffer[i]);
              }//---//
         
               Band_Size_Total = (int) MathMean(Band_Size_Buffer);
               //---//

   
 return(Band_Size_Total);
}
 

Há uma confusão com o uso da biblioteca padrão.
Como obter um tíquete depois de abrir um pedido usando a biblioteca padrão?
Posso ter certeza de que a resposta do servidor já foi recebida aqui? O terminal trava enquanto aguarda uma resposta do servidor? Isso não está claro.

                     if(!m_trade.BuyLimit(...))
                       {
                        ...
                       }
                     else
                       {
                       int ticket=m_trade.RequestOrder();  // ??? 
                        ...
                        a[n]=ticket; 
                       }

No MQ4 tudo era simples:

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas uso da biblioteca padrão.
Como obter um tíquete depois de abrir um pedido usando a biblioteca padrão?
Posso ter certeza de que a resposta do servidor já foi recebida aqui? O terminal trava enquanto aguarda uma resposta do servidor? Não estou entendendo.

No MQ4 tudo era simples:

É melhor usar o tratamento do evento OnTradeTransaction()

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Функции обработки событий - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

É melhor usar o manipulador de eventos OnTradeTransaction()

Obrigado! Então terei que refazer algumas funções.

Talvez você tenha visto em algum lugar uma função para calcular a derrapagem no mql5?

 
Nauris Zukas #:

Obrigado! Terei que refazer algumas funções então.

Você viu em algum lugar uma função para calcular a derrapagem no mql5?

Por que procurar por ela? Em OnTradeTransaction, você captura o evento de colocação da ordem, lê o preço da ordem, depois captura a negociação, lê o preço da negociação e obtém a diferença desses preços.

Você também pode criar uma variável em nível global, gravar o preço nela no momento do envio da ordem e, em OnTradeTransaction, obter o preço da transação...

 

Alexey Viktorov #:

Você também pode criar uma variável em nível global, gravar o preço nela quando a ordem for enviada e obter o preço da transação em OnTradeTransaction....

Essa opção está definitivamente descartada. Se eu precisar de um preço sem um tíquete e enviar muitas ordens, como a OnTradeTransaction lidará com isso?

 
Nauris Zukas #:

Essa opção está definitivamente descartada. Qual é o preço sem um tíquete se eu enviar muitas ordens? Como a OnTradeTransaction lidará com isso?

Por ID de posição, isso será resolvido sem problemas.

Você obtém uma negociação, obtém o ID da posição, extrai ordens e negociações do histórico por esse ID e lê os preços da ordem e da negociação.

Leia a documentação. Você pode encontrar muitas coisas interessantes lá.

 

Alexey Viktorov #:

Você obtém uma negociação, obtém o ID da posição, extrai ordens e negociações do histórico por esse ID e lê os preços da ordem e da negociação.

Está claro! Mas a segunda opção com o preço salvo, durante o envio de uma ordem, no nível global e, em seguida, em OnTradeTransaction, obter o preço da transação... isso não está claro para mim. Por que salvar um preço que não está vinculado (à ordem) durante o envio da ordem?


Resumindo, farei dessa forma: obtenho a negociação e, em seguida, retiro todo o resto dela.

 
Adam Dee "Bollinger Bands", para o período especificado.

A essência do problema: Não consigo obter os valores reais do preço nas linhas do indicador para a barra especificada, porque, por algum motivo, o mesmo valor de preço é gravado em diferentes buffers do indicador, o que também não corresponde aos valores reais de nenhuma das linhas dessa barra. E, como resultado, algum valor de preço desconhecido é gravado em diferentes buffers (em diferentes solicitações), o que anula todo o trabalho adicional da função.
Além disso, usando exatamente o mesmo método dessa função, consegui obter indicadores de quaisquer outros indicadores, mas aqui não funciona....

Bolinger é SMA +- N*standard_deviations.

Há seus próprios indicadores sobre desvio padrão e SMA. Mas tudo é calculado sem eles - pegue um livro de referência e aqui está uma fórmula. Nela, você encontra a "distância média em pontos entre as linhas", que é igual a 4 sigma no momento, de acordo com os valores padrão.
E a média (para qual período?), você se preocupa em calculá-la?

De fato, você quer saber a média do desvio padrão.

 
Nauris Zukas #:

Isso está claro! Mas a segunda opção de salvar o preço ao enviar a ordem, em nível global, e depois em OnTradeTransaction para obter o preço da transação... não está clara para mim. Por que salvar um preço que não está vinculado (à ordem) durante o envio da ordem?


Resumindo, farei dessa forma: obtenho a negociação e, em seguida, retiro todo o resto dela.

Isso foi dito sobre a negociação tranquila, quando tudo estará no tempo certo... Sem levar isso em consideração

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Perguntas de iniciantes MQL5 MT5 MetaTrader 5

Nauris Zukas, 2022.06.11 17:49

Essa opção está definitivamente fora de questão. Qual é o preço para mim sem um bilhete se eu enviar muitas ordens, como a OnTradeTransaction lidará com isso?