Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 863

 
¿Puedes mostrar el código que imprime el precio del stop de compra más cercano y el stop de venta más cercano?
 
ilyav:
¿Puedes mostrar el código que imprime el precio del stop de compra más cercano y el stop de venta más cercano?

¿Sólo el precio? ¿Para qué sirve? Y descifrar la palabra "más cerca" - a quién, qué ...

 
Vladimir Karputov:

¿Sólo el precio? ¿Para qué sirve? Y descifrar la palabra "más cerca" - a quién, qué ...

Sólo el precio.

Mira.

Ahora tenemos 10 paradas de compra a 100 pips del precio actual.

Ahora tenemos 10 stops de venta a 100 pips del precio actual.

Necesito mostrar el precio de la parada de compra más cercana y la parada de venta más cercana en relación con el precio actual en la impresión.

He intentado hacerlo pero no ha funcionado.

El precio de la parada de compra más cercana se emite correctamente, pero el precio de la parada de venta más cercana se emite por alguna razón.

Esta funciónm_order.PriceOpen(); siempre muestra el precio de stop de compra. Aunque le pido que me dé el precio del stop de venta después de la solicitud de stop de compra.

Esto se hace para una mayor lógica-

Divido por 2 el precio del stop de compra más cercano y el precio del stop de venta más cercano.

El Asesor Experto continuará su trabajo basándose en la cifra obtenida.

La función completa es

//+------------------------------------------------------------------+
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);
        }
     }
  }
//+------------------------------------------------------------------+
 

Ahora he probado a cambiar el 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);
        }
     }
  }
//+------------------------------------------------------------------+

No hay cambios. Sólo emite el precio de parada de compra

 
ilyav:

Ahora he probado a cambiar el código.

No hay cambios. Sólo muestra el precio de parada de compra.

Primero escribamos el código. Empezaría diciendo que la función de búsqueda de Buy Stop y Sell Stop tiene que pasar por el precio - si no, ¿cómo se busca? ...

Además, hay que aclarar: "lo más cercano", ¿por encima o por debajo del precio? ¿O es sólo la diferencia entre el precio fijado y la orden pendiente?

 
Vladimir Karputov:

Vamos a escribirlo primero. Empezaría diciendo que la función de búsqueda de Buy Stop y Sell Stop tiene que pasar por el precio - si no, ¿cómo se busca? ...

Así es como lo hago yo.

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++;

La función emite perfectamente el número actual de paradas de venta.

A continuación, hemos seleccionado el Sell Stop más cercano. Pedimos mostrar su precio e imprimirlo

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

Está escrito en la ayuda.

La clase COrderInfo

PrecioAbierto

Obtiene el precio del pedido.

doublePriceOpen()const

Valor devuelto

Precio de apertura del pedido.

Nota

La orden debe ser preseleccionada para su acceso mediante los métodos Select(por ticket) oSelectByIndex(por índice).


¿Qué ocurre? Hemos seleccionado la orden. Se solicita el precio de la instalación.

¿O he entendido algo mal? ¿Por qué me sale un precio de compra si no lo hago bien?

 
Vladimir Karputov:

Además, hay que aclarar: ¿el "más cercano" es el superior o el inferior del precio? ¿O es sólo la diferencia entre el precio fijado y la orden pendiente?

Aquí está el precio de qué stop de compra y stop de venta necesito

 
ilyav:

Aquí está el precio de qué Buy Stop y Sell Stop necesito

Esta función busca el tope de compra más cercano a partir del precio "precio" y el tope de venta más cercano a partir del precio "precio":

//+------------------------------------------------------------------+
//| 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();
                 }
              }
           }
  }
 

Ahora otro problema)

Solía llamar a mi función así -

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

Inserté tu código y cambié mi función a

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

Ahora hay un error al compilar(

'CalculateAllPendingOrders' - wrong parameters count
 
ilyav:

Ahora otro problema)

Solía llamar a mi función así -

Inserté tu código y cambié mi función a

Ahora hay un error al compilarlo(

Hay que pasar un PRECIO a la función, en torno al cual se realizará la búsqueda de órdenes pendientes.

Además de este precio hay que pasar dos variables:

void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)