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

 

Existe un Asesor Experto que permite determinar cuándo se ha activado una orden pendiente

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

Lo uso para obtener un ticket para una orden SELL_STOP

He cambiado el código a

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

Todo va bien hasta un determinado momento. Hasta que aparezca otro tipo de orden en el historial.

Por ejemplo, SELL_LIMIT.

EJEMPLO

En cuanto aparece SELL_LIMIT en el historial, no puedo obtener una entrada del último SELL_STOP.

El Asesor Experto arroja un error.

La orden 9 no está pendiente

Aunque hay SELL_STOP en el historial

¿Por qué tengo que conseguir el pedido nº 9 si necesito el billete nº 7?

Parece que el Asesor Experto busca la orden necesaria no en todo el historial, sino sólo en el último
TypePendingOrderTriggered
TypePendingOrderTriggered
  • votos: 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=;             ;            }...
 

Hola. Me da error siStopLoss_=0

falló modificar #2 vender 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [paradas inválidas]


 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);
                       }
                    }
                 }
sipongo cero en lugar dem_position.StopLoss(), mismo error. ¿Qué pasa?
 
Sile Si:

Hola. Me da error siStopLoss_=0

falló modificar #2 vender 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [paradas inválidas]

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

sipongo cero en lugar dem_position.StopLoss(), mismo error. ¿Qué es?

Lógica incorrecta al escribir el programa.

Cuando StopLoss_=0, se dispara la condición superior: un intento de modificar el TakeProfit. El error es que se resta del PRECIO ABIERTO - en este caso el nivel de TakeProfit puede ser mayor que el PRECIO ACTUAL y esto es un error.

En su caso, reste del PRECIO CORRECTO (m_position.PriceCurrent).

 
Vladimir Karputov:

Se abrió una posición de venta y se activó el selllimit, necesito mover el tp relativo al precio de la nueva posición, no al precio actual.

¿Qué tipo de comprobación debo hacer para evitar que se intente modificar a un precio no válido?

 
Sile Si:

Se abrió una posición de venta y se activó el selllimit, necesito mover el tp en relación al nuevo precio de la posición, no en relación al precio actual.

¿Qué tipo de comprobación debo hacer para no intentar modificar a un precio no válido?

Compruébalo:

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:

Compruébalo:

Gracias, pero el error persiste.

aqa

Podría estar inaceptablemente cerca del precio actual. ¿Cómo puedo comprobarlo?

 
Sile Si:

Gracias, pero el error persiste.

Podría estar inaceptablemente cerca del precio actual. ¿Cómo se comprueba esto?

No tengo acceso a una bolsa, así que hazlo tú mismo o trabaja con instrumentos de Forex. Lo siento.


Añadido: introducir otra comprobación - para una posición de venta el nuevo TakeProfit (valor calculado) no debe ser MAYOR o IGUAL que el actual TakeProfit de la posición.

 
Vladimir Karputov:

No tengo acceso a una bolsa, así que hazlo tú mismo o trabaja con instrumentos de Forex. Lo siento.


Añadido: introducir otra comprobación - para una posición de venta el nuevo TakeProfit (valor calculado) no debe ser MAYOR o IGUAL que el actual TakeProfit de la posición.

Probablemente el precio de apertura (POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

Probablemente el precio de apertura (POSITON_PRICE_OPEN) ?

Esta opción estaba por encima. Ver los mensajes anteriores. Has contestado en medio de la conversación.

 
Vladimir Karputov:...introduzca otra comprobación - para una posición de Venta el nuevo TakeProfit (valor calculado) no debe ser ALTO o IGUAL al TakeProfit actual de la posición.

No encaja, modificar por ATR ¿Qué otras comprobaciones se pueden hacer para este error? Todo es posible. En mt4 haySTOPLEVEL, pero aquí ¿qué?

Razón de la queja: