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

 
Pode mostrar o código que imprime o preço da paragem de compra e da paragem de venda mais próxima ?
 
ilyav:
Pode mostrar o código que imprime o preço da paragem de compra e da paragem de venda mais próxima?

Apenas o preço? Para que serve? E decifrar a palavra "mais próximo" - a quem, o quê ...

 
Vladimir Karputov:

Apenas o preço? Para que serve? E decifrar a palavra "mais próximo" - a quem, o quê ...

Apenas o preço.

Veja.

Temos agora 10 paragens de compra a 100 pips do preço actual.

Temos agora 10 stops de venda a 100 pips do preço actual.

Preciso de mostrar o preço da paragem de compra e da paragem de venda mais próximas relativamente ao preço actual em Impressão.

Tentei fazê-lo, mas não funcionou.

O preço da paragem de compra mais próxima é produzido correctamente, mas o preço da paragem de venda mais próxima é produzido por alguma razão.

Esta funçãom_order.PriceOpen(); mostra sempre o preço de paragem de compra. Embora lhe peça para me dar o preço da paragem de venda após o pedido de paragem de compra.

Isto é feito para mais lógica...

Divido por 2 o preço da paragem de compra mais próxima e o preço da paragem de venda mais próxima.

O Conselheiro Especialista continuará o seu trabalho com base na figura obtida.

A função completa é

//+------------------------------------------------------------------+
void TradeMode3()
  {
   int TotalGridBuyOrders=0;
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic && m_order.OrderType()==ORDER_TYPE_BUY_STOP)
            TotalGridBuyOrders++;
   Print("Количество buy ордеров grid ",TotalGridBuyOrders);
   if(TotalGridBuyOrders>=1)
     {
      grid_buy_price_memory=m_order.PriceOpen();
      Print("Цена ближайшего buy grid ордера: ",grid_buy_price_memory);

      int TotalGridSellOrders=0;
      Print(__FUNCTION__);
      for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
         if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
            if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic && m_order.OrderType()==ORDER_TYPE_SELL_STOP)
               TotalGridSellOrders++;
      Print("Количество sell ордеров grid ",TotalGridSellOrders);
      if(TotalGridSellOrders>=1)
        {
         grid_sell_price_memory=m_order.PriceOpen();
         Print("Цена ближайшего sell grid ордера: ",grid_sell_price_memory);
        }
     }
  }
//+------------------------------------------------------------------+
 

Agora tentei alterar o código.

//+------------------------------------------------------------------+
void TradeMode3()
  {
     {
      int TotalGridBuyOrders=0;
      Print(__FUNCTION__);
      for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
         if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
            if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic && m_order.OrderType()==ORDER_TYPE_BUY_STOP)
               TotalGridBuyOrders++;
      Print("Количество buy ордеров grid ",TotalGridBuyOrders);
      if(TotalGridBuyOrders>=1)
        {
         double grid_buy_price_memory=m_order.PriceOpen();
         Print("Цена ближайшего buy grid ордера: ",grid_buy_price_memory);
        }
     }
     {
      int TotalGridSellOrders=0;
      Print(__FUNCTION__);
      for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
         if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
            if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic && m_order.OrderType()==ORDER_TYPE_SELL_STOP)
               TotalGridSellOrders++;
      Print("Количество sell ордеров grid ",TotalGridSellOrders);
      if(TotalGridSellOrders>=1)
        {
         double grid_sell_price_memory=m_order.PriceOpen();
         Print("Цена ближайшего sell grid ордера: ",grid_sell_price_memory);
        }
     }
  }
//+------------------------------------------------------------------+

Sem alterações. Produz apenas o preço de paragem de compra

 
ilyav:

Agora tentei alterar o código.

Sem alterações. Apresenta apenas o preço de paragem de compra.

Vamos escrever o código primeiro. Começaria por dizer que a função de pesquisa Buy Stop and Sell Stop precisa de passar o preço - caso contrário, como se faz a pesquisa? ...

Além disso, precisamos de esclarecer: "mais próximo" - acima ou abaixo do preço? Ou será apenas a diferença entre o preço fixado e a encomenda pendente?

 
Vladimir Karputov:

Vamos escrevê-lo primeiro. Começaria por dizer que a função de pesquisa Buy Stop and Sell Stop precisa de passar o preço - caso contrário, como se faz a pesquisa? ...

É assim que eu o faço.

for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
         if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
            if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic && m_order.OrderType()==ORDER_TYPE_SELL_STOP)
               TotalGridSellOrders++;

A função produz perfeitamente o número actual de paragens de venda.

A seguir, seleccionámos a paragem de venda mais próxima. Pedimos para afixar o seu preço e imprimi-lo

double grid_sell_price_memory=m_order.PriceOpen();    
Print("Цена ближайшего sell grid ордера: ", grid_sell_price_memory);

Está escrito na ajuda.

A classe COrderInfo

PriceOpen

Obtém o preço da encomenda.

doublePriceOpen()const

Valor devolvido

Encomendar preço aberto.

Nota

A encomenda deve ser pré-seleccionada para acesso usando os métodos Select(por bilhete) ouSelectByIndex(por índice).


O que é que está errado? Seleccionámos a encomenda. O preço da instalação é solicitado.

Ou estou a interpretar mal alguma coisa? Porque é que recebo um preço de paragem de compra se não o faço correctamente?

 
Vladimir Karputov:

Além disso, precisamos de esclarecer: o "mais próximo" é a parte superior ou inferior do preço? Ou será apenas a diferença entre o preço fixado e a encomenda pendente?

Aqui está o preço da paragem de compra e venda de que preciso

 
ilyav:

Aqui está o preço de que preciso Buy Stop and Sell Stop I

Esta função procura a paragem de compra mais próxima acima do preço "preço" e a paragem de venda mais próxima abaixo do preço "preço":

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price>0.0 && m_order.PriceOpen()-price<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }
              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price-m_order.PriceOpen()>0.0 && price-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
              }
           }
  }
 

Agora outro problema)

Eu costumava chamar a minha função assim -

//|  Выбран режим торговли 3 ? Тогда торгуем его    
      if(РежимТорговли==3)
        {
         TradeMode3();
        }

Inseriu o seu código e alterou a minha função para

 //|  Выбран режим торговли 3 ? Тогда торгуем его    
      if(РежимТорговли==3)
        {
        CalculateAllPendingOrders();
        }
     

Agora há um erro ao compilar(

'CalculateAllPendingOrders' - wrong parameters count
 
ilyav:

Agora outro problema)

Eu costumava chamar a minha função assim -

Inseriu o seu código e alterou a minha função para

Agora há um erro na sua compilação(

Tem de passar um PREÇO para a função, em torno da qual será feita a pesquisa de ordens pendentes.

Para além deste preço, é necessário passar duas variáveis:

void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)
Razão: