Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 890

 

C'è un Expert Advisor che permette di determinare quando un ordine pendente è scattato

https://www.mql5.com/ru/code/17610

Lo uso per ottenere un biglietto per un ordine SELL_STOP

Ho cambiato il codice in

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      Print("Attempt number ",counter);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error#",GetLastError());
        }
      counter++;
     }
  }

Tutto va bene fino ad un certo momento. Finché non appare un altro tipo di ordine nella storia.

Per esempio, SELL_LIMIT.

ESEMPIO

Non appena SELL_LIMIT appare nella storia, non posso ottenere un biglietto dell'ultimo SELL_STOP.

L'Expert Advisor lancia un errore.

L'ordine 9 non è pendente

Anche se c'è SELL_STOP nella storia

E perché devo fare con il 9° se ho bisogno del 7° biglietto?

Sembra che l'Expert Advisor cerchi l'ordine necessario non attraverso tutta la storia, ma solo per l'ultimo
TypePendingOrderTriggered
TypePendingOrderTriggered
  • voti: 21
  • 2017.02.14
  • Vladimir Karputov
  • www.mql5.com
()   {    (bln_find_order)      {        counter=;       (,counter);       ();         {          (type_order== || type_order== ||             type_order== ||type_order==)            {             (,ul_find_order,,                   (()(ul_find_order,)));             bln_find_order=;                     counter=;             ;            }...
 

Salve. Ottengo un errore seStopLoss_=0

failed modify #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [fermate non valide]


 if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     if(StopLoss_<=0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }

                     if(StopLoss_>0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }
                    }
                 }
semetto zero al posto dim_position.StopLoss(), stesso errore. Cosa c'è che non va?
 
Sile Si:

Salve. Ottengo un errore seStopLoss_=0

failed modify #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [fermate non valide]

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
        {
         if(StopLoss_<=0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_position.StopLoss(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }

         if(StopLoss_>0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }
        }
     }

semetto zero al posto dim_position.StopLoss(), stesso errore. Che cos'è?

Logica errata nella scrittura del programma.

Quando StopLoss_=0, scatta la condizione superiore - un tentativo di modificare TakeProfit. L'errore è che si sottrae dal PREZZO APERTO - in questo caso il livello di TakeProfit può essere superiore al PREZZO CORRENTE e questo è un errore.

Nel tuo caso, sottrai dal PREZZO GIUSTO (m_position.PriceCurrent).

 
Vladimir Karputov:

Una posizione di vendita è stata aperta e il selllimit è stato attivato, ho bisogno di spostare il tp rispetto al nuovo prezzo della posizione, non rispetto al prezzo corrente.

Che tipo di controllo devo fare per evitare di provare a modificare un prezzo non valido?

 
Sile Si:

Una posizione di vendita è stata aperta e il selllimit è stato attivato, ho bisogno di spostare il tp rispetto al nuovo prezzo della posizione, non rispetto al prezzo corrente.

Che tipo di controllo devo fare per non provare a modificare un prezzo non valido?

Controllare:

if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent()
   {
    m_trade.PositionModify(m_position.Ticket(),
                           m_position.StopLoss(),
                           m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                           );
...
 
Vladimir Karputov:

Controllare:

Grazie, ma l'errore rimane.

aqa

Potrebbe essere inaccettabilmente vicino al prezzo attuale. Come posso controllare questo?

 
Sile Si:

Grazie, ma l'errore rimane.

Potrebbe essere inaccettabilmente vicino al prezzo attuale. Come si controlla questo?

Non ho accesso a uno scambio, quindi o lo fai da solo o lavori su strumenti forex. Mi dispiace.


Aggiunto: introdurre un altro controllo - per una posizione di vendita il nuovo TakeProfit (valore calcolato) non deve essere più alto o uguale all'attuale TakeProfit della posizione.

 
Vladimir Karputov:

Non ho accesso a uno scambio, quindi o lo fai da solo o lavori su strumenti forex. Mi dispiace.


Aggiunto: introdurre un altro controllo - per una posizione di vendita il nuovo TakeProfit (valore calcolato) non deve essere più alto o uguale all'attuale TakeProfit della posizione.

Probabilmente il prezzo di apertura (POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

Probabilmente il prezzo di apertura (POSITON_PRICE_OPEN) ?

Questa opzione era sopra. Vedi i post sopra. Hai risposto nel bel mezzo della conversazione.

 
Vladimir Karputov:...inserire un altro controllo - per una posizione Sell il nuovo TakeProfit (valore calcolato) non deve essere ALTO o UGUALE all'attuale TakeProfit della posizione.

Does not fit, modify by ATR Quali altri controlli si possono fare per questo errore? Tutto possibile. In mt4 c'èSTOPLEVEL, ma qui cosa?

Motivazione: