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

 
Vladimir Karputov:

Debe pasar un PRECIO a la función, alrededor del cual se buscarán las órdenes pendientes.

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

Me rindo, ¿tienes un Asesor Experto preparado que imprima los precios de esas órdenes pendientes que mostré con flechas en la captura de pantalla?

No entiendo por qué esta función funciona sin pasar ningún precio.

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

???

 
ilyav:

Me rindo, ¿no tienes un Asesor Experto ya hecho que saque una impresión de los precios de esas órdenes que mostré con flechas en la captura de pantalla?

Te he dado una función ya hecha. Tienes que pasar en él:

  • el precio actual
  • una variable en la que se escribirá el precio de la siguiente parada de compra
  • una variable en la que se escribirá el precio de la siguiente parada de venta

¿Qué es lo que no entiendes?

 
Ya veo. Aparentemente no es lo mío.
 
ilyav:

Me rindo, ¿no tienes un Asesor Experto ya hecho que te imprima los precios de esas órdenes pendientes que mostré con flechas en la captura de pantalla?

No entiendo por qué esta función funciona sin enviar ningún precio.

???

Muestras un código inviable -al menos no compila- porque tiene un desajuste de paréntesis de apertura y cierre. Y en segundo lugar = lógica rota.

 
Vladimir Karputov:

Estás mostrando un código inviable -al menos no compila- porque tiene un desajuste de paréntesis de apertura y cierre. Y en segundo lugar = lógica rota.

Reescribí tu código.

Pero produce órdenes pendientes lejos del precio

void TradeMode3()
  {
   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()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 
                 }
               Print("buy : ",price_nearest_buy_stop);
                return;  
              }
              
               
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
                 Print("sell : ",price_nearest_sell_stop);
                 return;
              }
           }
  }
  
 
 
ilyav:

Reescribí tu código.

Pero da colgantes más lejos del precio

Las impresiones deben venir después del bucleOrdersTotal.

¿Y qué es el precio1? ¿Cómo se consigue?
 

Y en esta versión, imprime todas las

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void TradeMode3()
  {
   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()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }
                 Print("buy : ",price_nearest_buy_stop);
                 
              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
                 Print("sell : ",price_nearest_sell_stop);
                 
              }
           }
  }
 
Vladimir Karputov:

Las impresiones deben venir después del bucleOrdersTotal.

¿Y qué es el precio1? ¿Cómo se consigue?
//|  Выбран режим торговли 3 ? Тогда торгуем его    

      if(РежимТорговли==3)

        {

        price1=m_symbol.Bid();

        TradeMode3();

Y en la cabecera del EA he escrito

double price1;
double price_nearest_buy_stop;
double price_nearest_sell_stop;

Si todo es correcto, esta es la variante final

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void TradeMode3()
  {
   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()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }

              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }

              }

           }
   Print("Цена ближнего SELL_STOP : ",price_nearest_sell_stop);
   Print("Цена ближнего BUY_STOP : ",price_nearest_buy_stop);
  }
//+------------------------------------------------------------------+

Todo parece funcionar. Dime si hay algún error. Muchas gracias.

 

Por favor, ayúdenme a resolver este problema.

Supongamos que tengo un timeframe actual M1, necesito saber la hora de la última barra N de la barra dada de cualquier TF superior, la hora puede no ser de 60 minutos, sino de 45 o cualquier otra, y además hay fines de semana, necesito saber la fecha de la última barra del TF actual de cualquier TF.

¿Cómo aplicarlo?

 
ilyav:

Y en la cabecera del asesor dice

Y si todo es correcto, aquí está la variante final

Todo parece funcionar. Dime si hay algún error. Muchas gracias.

Antes de la línea

price1=m_symbol.Bid();

hay que actualizar las cotizaciones:

if(!RefreshRates())
   return;