Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 30

 
yaaarik777:
Je suis en train d'apprendre, j'essaie d'utiliser le guide, mais je me rends compte que j'obtiens des choses insensées, j'aimerais voir un exemple de la façon de procéder.
Lisez cet article, il vous sera utilehttps://www.mql5.com/ru/articles/1399.
События в МetaТrader 4
События в МetaТrader 4
  • 2006.05.29
  • Andrey Khatimlianskii
  • www.mql5.com
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
 
yaaarik777:

Bonjour à tous ! Pouvez-vous m'indiquer comment définir la suppression d'un ordre dans un EA ?

La situation est la suivante :

Nous plaçons 2ordres en attente dans des directions différentes, dès que l'un d'eux se déclenche, l'autre est supprimé et n'est plus exposé.

Je vous serais très reconnaissant de toute aide.

Merci.

Quelque chose comme ça

   for(int pos=OrdersTotal()-1,ticket=0,trade=0;pos!=-1;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный
        {
         ticket=OrderTicket();//Запомним его тикет
        }
      else//Если ордер не отложенный
        {
         trade=1;//Запомним,что есть открытая позиция
        }
      if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция
        {
         int OD=OrderDelete(ticket);//Удаляем отложенный
        }
     }
 
Nikolay Gaylis:
"Continuons à chercher" doit être supprimé !
Vous pouvez modifier vos propres messages sur le forum. Tout ce que vous avez écrit dans les différents posts ci-dessus peut être résumé en un seul.
 
Vitalie Postolache:
Vous pouvez modifier vos propres messages sur le forum. Tout ce que vous avez écrit dans les différents posts ci-dessus peut être résumé en un seul.
Merci !
 

Salut ! J'ai introduit un chalut takeprofit en utilisant l'algorithme suivant :

if(total>0)
{for (int i=OrdersTotal()-1 ; i>=0 ; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magique && OrderSymbol()==asset& OrderType()==OP_BUY)
{
RefreshRates() ;
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
TAKEPROFIT CONDITION ;
ORDONNER LA MODIFICATION D'UNE NOUVELLE TAKEPROFIT ;
}
}
}
}

Mais la limite de temps ne fonctionne pas pour une raison quelconque et il se trouve que si une position n'est pas fermée dans le cadre temporel actuel, elle se déplace également dans le cadre temporel suivant si les conditions sont remplies.

Quel est le problème avec mon dernier if() ?

 
владимир:

Bonjour ! J'ai introduit un chalut takeprofit en utilisant l'algorithme suivant :

si(total>0)
{for (int i=OrdersTotal()-1 ; i>=0 ; i--)
si(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magique && OrderSymbol()==asset && OrderType()==OP_BUY)
{
RefreshRates() ;
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
CONDITION DE TP DE QUEUE ;
{ MODIFICATION DE LA COMMANDE AU NOUVEAU PROFIT ;
}
}
}
}

Mais pour une raison quelconque, la limite de temps ne fonctionne pas, et il arrive que si la position n'est pas fermée dans le cadre temporel actuel, elle se termine dans le suivant aussi, si les conditions sont remplies.

Quel est le problème avec mon dernier if() ?

Eh bien, je ne sais pas, je n'ai encore rien vu d'anormal. J'ai supprimé la vérification redondante du nombre d'ordres (elle est déjà présente dans les conditions de la boucle) et ajouté une vérification pour les deux types de positions (Achat et Vente).

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Où // les conditions de chalutage et de modification, insérez Print() avec les valeurs des variables temporelles et voyez ce que dit le journal.

 
Artyom Trishkin:

Je ne sais pas, je ne vois pas encore ce qui cloche avec un coup d'œil rapide. J'ai supprimé le contrôle inutile du nombre d'ordres (il est déjà présent dans les conditions de cycle) et ajouté le contrôle des deux types de positions (Achat et Vente).

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Où // conditions de chalutage et de modification, insérer Print() avec les valeurs des variables temporelles et voir ce que dit le journal.

J'ai des conditions différentes pour la vente, donc je n'ai montré que BUY.

" avec des variables temporelles " - voulez-vous dire TimeCurrent() ? Désolé si cela vous surprend - je suis un zéro-zéro en programmation.

Et je ne comprends pas ceci -OrderType()>OP_SELL. Pourquoi > ? Le type d'ordre OP_SELL a une valeur = 1 etOP_BUY = 0. Il doit donc être <= ? Merci.

 
владимир:

J'ai des conditions de chalutage différentes pour SELL, donc je n'ai montré que BAI.

" avec des valeurs de variables temporelles " - voulez-vous dire TimeCurrent() ? Désolé si cela vous surprend - je suis un zéro-zéro en programmation.

Et je ne comprends pas ceci -OrderType()>OP_SELL. Pourquoi > ? Le type d'ordre OP_SELL a une valeur = 1 etOP_BUY = 0. Il doit donc être <= ? Merci.

Si le type est supérieur à 1, on passe à l'itération suivante de la boucle.
 

Salutations. Pourriez-vous me dire pourquoi dans le cas de l'entrée suivante

if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1 ; OrderDelete(ticketUP);}

Le système génère constamment des erreurs

: ticket invalide pour la fonction OrderDelete

: Erreur de suppression de commande 4051

Selon le livre de référence, c'est

Valeur invalide du paramètre de fonction

Bien que les paramètres semblent être les mêmes.

Bien que si vous supprimez la condition et laissez seulement

CommandeSuppression(ticketD) ;

CommandeDelete(ticketUP) ;

il supprime avec succès (mais j'en ai besoin par condition). Qu'est-ce que je fais de mal ?

 
spoiltboy:

Salutations. Pourriez-vous me dire pourquoi dans le cas de l'entrée suivante

if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1 ; OrderDelete(ticketUP);}

Le système génère constamment des erreurs

: ticket invalide pour la fonction OrderDelete

: Erreur de suppression de commande 4051

Selon le livre de référence, c'est

Valeur invalide du paramètre de fonction

Bien que les paramètres semblent être les mêmes.

Bien que si vous supprimez la condition et laissez seulement

CommandeSuppression(ticketD) ;

CommandeDelete(ticketUP) ;

il supprime avec succès (mais j'en ai besoin par condition). Qu'est-ce que je fais de mal ?

L'erreur se situe quelque part au-dessus du code, dans la zone de sélection des commandes.