Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 864

 
Vladimir Karputov:

Dovete passare un PREZZO alla funzione, attorno al quale verranno cercati gli ordini pendenti.

Oltre a questo prezzo dovete passare due variabili:

Mi arrendo, hai un Expert Advisor pronto che stampa i prezzi di quegli ordini pendenti che ho mostrato con le frecce nello screenshot?

Non capisco perché questa funzione funziona senza passare alcun prezzo.

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:

Mi arrendo, non hai un Expert Advisor già pronto che emette una stampa dei prezzi di quegli ordini che ho mostrato con le frecce nello screenshot?

Vi ho dato una funzione già pronta. Dovete passarci dentro:

  • il prezzo corrente
  • una variabile in cui sarà scritto il prezzo del prossimo Buy stop
  • una variabile in cui sarà scritto il prezzo del prossimo Sell stop

Cos'è che non capisci?

 
Capisco. A quanto pare non fa per me.
 
ilyav:

Mi arrendo, non hai un Expert Advisor già pronto che possa produrre una stampa dei prezzi di quegli ordini pendenti che ho mostrato con le frecce nello screenshot?

Non capisco perché questa funzione funziona senza inviare alcun prezzo.

???

Tu mostri un codice impraticabile - almeno non si compila - perché ha una mancata corrispondenza tra parentesi di apertura e di chiusura. E in secondo luogo = logica rotta.

 
Vladimir Karputov:

Stai mostrando un codice impraticabile - almeno non compila - perché ha una mancata corrispondenza tra parentesi di apertura e di chiusura. E in secondo luogo = logica rotta.

Ho riscritto il tuo codice.

Ma produce ordini pendenti lontani dal prezzo

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:

Ho riscritto il tuo codice.

Ma distribuisce ciondoli più lontani dal prezzo

Le stampe dovrebbero venire dopo il cicloOrdersTotal.

E cos'è il prezzo1? Come si ottiene?
 

E in questa versione, stampa tutti i

//+------------------------------------------------------------------+
//| 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:

Le stampe devono venire dopo il cicloOrdersTotal.

E cos'è il prezzo1? Come si ottiene?
//|  Выбран режим торговли 3 ? Тогда торгуем его    

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

        {

        price1=m_symbol.Bid();

        TradeMode3();

E nell'intestazione dell'EA ho scritto

double price1;
double price_nearest_buy_stop;
double price_nearest_sell_stop;

Se tutto è corretto, ecco la variante finale

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

Tutto sembra funzionare. Ditemi se ci sono errori. Grazie mille.

 

Per favore aiutatemi a risolvere questo problema.

Supponiamo che io abbia un timeframe corrente M1, ho bisogno di sapere l'ora dell'ultima barra N della data barra di qualsiasi TF superiore, l'ora può non essere 60 minuti, ma 45 o qualsiasi altra ora, e inoltre ci sono i fine settimana, ho bisogno di sapere la data dell'ultima barra del TF corrente da qualsiasi TF.

Come implementarlo?

 
ilyav:

E nell'intestazione del consulente c'è scritto

E se tutto è corretto, ecco la variante finale

Tutto sembra funzionare. Ditemi se ci sono errori. Grazie mille.

Prima della linea

price1=m_symbol.Bid();

è necessario aggiornare le citazioni:

if(!RefreshRates())
   return;