Questions des débutants MQL5 MT5 MetaTrader 5 - page 890

 

Il existe un conseiller expert qui vous permet de déterminer quand un ordre en attente a été déclenché.

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

Je l'utilise pour obtenir un ticket pour un ordre SELL_STOP

J'ai modifié le code en

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

Tout va bien jusqu'à un certain moment. Jusqu'à ce qu'un autre type de commande apparaisse dans l'historique.

Par exemple, SELL_LIMIT.

EXEMPLE

Dès que SELL_LIMIT apparaît dans l'historique, je ne peux pas obtenir un ticket du dernier SELL_STOP.

Le conseiller expert lance une erreur.

L'ordre 9 n'est pas en cours

Bien qu'il y ait un SELL_STOP dans l'historique

Et pourquoi dois-je faire le 9e si j'ai besoin du 7e billet ?

On a l'impression que le conseiller expert cherche l'ordre nécessaire non pas dans tout l'historique, mais seulement dans le dernier.
TypePendingOrderTriggered
TypePendingOrderTriggered
  • votes : 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=;             ;            }...
 

Bonjour. J'obtiens une erreur siStopLoss_=0

échec de la modification #2 vendre 3.00 Si-9.18 sl : 0, tp : 62749 -> sl : 0, tp : 62774 [Arrêts invalides]


 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);
                       }
                    }
                 }
Sije mets zéro à la place dem_position.StopLoss(), même erreur. Qu'est-ce qu'il y a ?
 
Sile Si:

Bonjour. J'obtiens une erreur siStopLoss_=0

échec de la modification #2 vendre 3.00 Si-9.18 sl : 0, tp : 62749 -> sl : 0, tp : 62774 [Arrêts invalides]

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

sije mets zéro à la place dem_position.StopLoss(), même erreur. Qu'est-ce que c'est ?

Une logique incorrecte dans l'écriture du programme.

Lorsque StopLoss_=0, la condition supérieure se déclenche - une tentative de modification du TakeProfit. L'erreur est que vous soustrayez du PRIX OUVERT - dans ce cas le niveau de TakeProfit peut être plus élevé que le PRIX COURANT et ceci est une erreur.

Dans votre cas, soustrayez du PRIX COURANT (m_position.PriceCurrent).

 
Vladimir Karputov:

Une position de vente a été ouverte et la limite de vente a été activée, j'ai besoin de déplacer le tp par rapport au nouveau prix de la position, et non par rapport au prix actuel.

Quel type de contrôle dois-je effectuer pour éviter d'essayer de modifier un prix non valide ?

 
Sile Si:

Une position de vente a été ouverte et la limite de vente a été activée, j'ai besoin de déplacer le tp par rapport au nouveau prix de la position, et non par rapport au prix actuel.

Quel type de contrôle dois-je effectuer pour ne pas essayer de modifier un prix non valide ?

Vérifiez :

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:

Vérifiez :

Merci, mais l'erreur demeure.

aqa

Il pourrait être inacceptablement proche du prix actuel. Comment puis-je le vérifier ?

 
Sile Si:

Merci, mais l'erreur demeure.

Il pourrait être inacceptablement proche du prix actuel. Comment vérifiez-vous cela ?

Je n'ai pas accès à une bourse, alors soit vous le faites vous-même, soit vous travaillez sur des instruments de change. Désolé.


Ajouté : introduire un autre contrôle - pour une position de vente, le nouveau TakeProfit (valeur calculée) ne doit pas être SUPÉRIEUR ou ÉGAL au TakeProfit actuel de la position.

 
Vladimir Karputov:

Je n'ai pas accès à une bourse, alors soit vous le faites vous-même, soit vous travaillez sur des instruments de change. Désolé.


Ajouté : introduire un autre contrôle - pour une position de vente, le nouveau TakeProfit (valeur calculée) ne doit pas être SUPÉRIEUR ou ÉGAL au TakeProfit actuel de la position.

Probablement le prix d'ouverture (POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

Probablement le prix d'ouverture (POSITON_PRICE_OPEN) ?

Cette option était ci-dessus. Voir les messages ci-dessus. Vous avez répondu au milieu de la conversation.

 
Vladimir Karputov:...entrer un autre contrôle - pour une position de vente, le nouveau TakeProfit (valeur calculée) ne doit pas être SUPÉRIEUR ou ÉGAL au TakeProfit actuel de la position.

Ne correspond pas, modifier par ATR Quels autres contrôles peuvent être effectués pour cette erreur ? Tout est possible. Dans mt4 il y aSTOPLEVEL, mais ici quoi ?