Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 863

 
Puoi mostrare il codice che stampa il prezzo del buy stop più vicino e il sell stop più vicino?
 
ilyav:
Puoi mostrare il codice che stampa il prezzo del buy stop più vicino e del sell stop più vicino?

Solo il prezzo? A cosa serve? E decifrare la parola "più vicino" - a chi, cosa ...

 
Vladimir Karputov:

Solo il prezzo? A cosa serve? E decifrare la parola "più vicino" - a chi, cosa ...

Solo il prezzo.

Guarda.

Ora abbiamo 10 buy stop con incrementi di 100 pips dal prezzo corrente.

Ora abbiamo 10 sell stop a 100 pip di distanza dal prezzo corrente.

Ho bisogno di visualizzare il prezzo dello stop di acquisto più vicino e lo stop di vendita più vicino rispetto al prezzo corrente in Stampa.

Ho provato a farlo ma non ha funzionato.

Il prezzo dello stop di acquisto più vicino viene emesso correttamente, ma il prezzo dello stop di vendita più vicino viene emesso per qualche motivo.

Questa funzionem_order.PriceOpen(); visualizza sempre il prezzo di stop all'acquisto. Anche se gli chiedo di darmi il prezzo del sell stop dopo la richiesta di buy stop.

Questo viene fatto per ulteriori logiche.

Divido per 2 il prezzo del buy stop più vicino e il prezzo del sell stop più vicino.

L'Expert Advisor continuerà il suo lavoro sulla base della cifra ottenuta.

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

Ora ho provato a cambiare il codice.

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

Nessun cambiamento. Emette solo il prezzo di stop all'acquisto

 
ilyav:

Ora ho provato a cambiare il codice.

Nessun cambiamento. Mostra solo il prezzo di stop all'acquisto.

Scriviamo prima il codice. Comincerei dicendo che la funzione di ricerca Buy Stop e Sell Stop ha bisogno di passare il prezzo - altrimenti come si fa a cercare? ...

Inoltre, dobbiamo chiarire: "più vicino" - sopra o sotto il prezzo? O è solo la differenza tra il prezzo impostato e l'ordine pendente?

 
Vladimir Karputov:

Scriviamolo prima. Comincerei dicendo che la funzione di ricerca Buy Stop e Sell Stop ha bisogno di passare il prezzo - altrimenti come si fa a cercare? ...

Ecco come faccio io.

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 funzione emette perfettamente il numero attuale di stop di vendita.

Successivamente, abbiamo selezionato il Sell Stop più vicino. Chiediamo di visualizzare il suo prezzo e di stamparlo

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

È scritto nell'aiuto.

La classe COrderInfo

PriceOpen

Ottiene il prezzo dell'ordine.

doppioPriceOpen()const

Valore restituito

Prezzo aperto dell'ordine.

Nota

L'ordine dovrebbe essere preselezionato per l'accesso usando i metodi Select(per biglietto) oSelectByIndex(per indice).


Cosa c'è che non va? Abbiamo selezionato l'ordine. Viene richiesto il prezzo dell'installazione.

O sto fraintendendo qualcosa? Perché ottengo un prezzo di stop all'acquisto se non lo faccio bene?

 
Vladimir Karputov:

Inoltre, dobbiamo chiarire: il "più vicino" è la parte superiore o inferiore del prezzo? O è solo la differenza tra il prezzo impostato e l'ordine pendente?

Ecco il prezzo di quale buy stop e sell stop ho bisogno

 
ilyav:

Ecco il prezzo di quale Buy Stop e Sell Stop ho bisogno

Questa funzione cerca il Buy Stop superiore più vicino dal prezzo "prezzo" e il Sell Stop inferiore più vicino dal prezzo "prezzo":

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

Ora un altro problema)

Chiamavo la mia funzione in questo modo -

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

Ho inserito il tuo codice e ho cambiato la mia funzione in

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

Ora c'è un errore durante la compilazione (

'CalculateAllPendingOrders' - wrong parameters count
 
ilyav:

Ora un altro problema)

Chiamavo la mia funzione in questo modo -

Ho inserito il tuo codice e ho cambiato la mia funzione in

Ora c'è un errore durante la compilazione (

Dovete passare un PREZZO alla funzione, intorno al quale verrà eseguita la ricerca degli ordini in sospeso.

Oltre a questo prezzo dovete passare due variabili:

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