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

 
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 2 ordres 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.

Il existe plusieurs façons de procéder. L'une d'entre elles est l'utilisation deOnTradeTransaction.

En attrapant la transaction

TRANSACTION_COMMERCIALE_ADDITIONNELLE

Ajouter la transaction à l'historique. Effectué à la suite de l'exécution d'un ordre ou d'une opération de solde de compte.

et s'assurer que cette transaction est une entrée sur le marché :

DEAL_ENTRY_IN

Entrée sur le marché


//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

Cette transaction aura lieu une fois que l'ordre en attente aura été déclenché et que la transaction aura été enregistrée dans l'historique.

Une fois que nous avons attrapé cette transaction, il ne nous reste plus qu'à supprimer tous les autres ordres en attente :

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Code EA commun (seulement ici j'ai spécifié une magie égale à "0" - vous devez définir votre propre magie) :

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+
Dossiers :
 

Une autre question sur l'événement OnDeinit :

ce code fonctionnera :

void OnDeinit(const int reason)

{

if(reason==REASON_REMOVE)

{

code pour fermer la position(s'il y en a un)

}

}

En général, nous avons besoin de savoir s'il est possible de fermer la position dans le traitement de l'événement OnDeinit.

 

Bonjour les experts, veuillez partager vos expériences.

Il y a un tableau de valeurs, qui reflète un objet/champ, c'est-à-dire que s'il y a une tâche pour désigner cet objet/champ d'une certaine manière, quelles sont les actions possibles.

Par exemple, serait-il approprié de placer ce tableau dans un réseau de cartes de Kohonen, si le volume du tableau peut atteindre des milliers de cellules de x et y ?

Vous pouvez peut-être suggérer comment insérer l'un des tableaux bidimensionnels (de grande dimension) dans un réseau de Kohonen.

Et Kohonen sera-t-il bon pour l'analyse - récursion de tableaux (tableaux dans un tableau) ?

Ou peut-être que quelqu'un peut aider à poser les bonnes questions


1 1 1 1 1 2 4 6 8
1 1 1 1 2 3 5 7 9
1 1 1 1 3 4 6 8 10
1 1 1 2 4 5 7 9 11
1 1 1 3 5 6 8 10 12
1 1 1 4 6 7 9 11 13
1 1 1 5 7 8 10 12 14
1 1 2 6 8 9 11 13 15
1 1 3 7 9 10 12 14 16
1 1 4 8 10 11 13 15 17
1 2 5 9 11 12 14 16 18
1 3 6 10 12 13 15 17 19
1 4 7 11 13 14 16 18 20
1 5 8 12 14 15 17 19 21
1 6 9 13 15 16 18 20 22
2 7 10 14 16 17 19 21 1
3 8 11 15 17 18 20 22 1
4 9 12 16 18 19 21 1 1
5 10 13 17 19 20 22 1 1
6 11 14 18 20 21 1 1 1
7 12 15 19 21 22 1 1 1
8 13 16 20 22 1 1 1 1
9 14 17 21 1 1 1 1 1
10 15 18 22 1 1 1 1 1
 
Vladimir Karputov:

Il existe plusieurs façons de procéder. La première consiste à utiliser la fonctionOnTradeTransaction.

Dans nous attrapons la transaction

TRANSACTION_COMMERCIALE_ADDITIONNELLE

Ajouter la transaction à l'historique. Effectué à la suite de l'exécution d'un ordre ou d'une opération de solde de compte.

et s'assurer que cette transaction est une entrée sur le marché :

DEAL_ENTRY_IN

Entrée sur le marché


//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

Cette transaction aura lieu une fois que l'ordre en attente aura été déclenché et que la transaction aura été enregistrée dans l'historique.

Une fois que nous avons capturé cette transaction, il ne nous reste plus qu'à supprimer tous les ordres en suspens :

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Code EA générique (seulement ici j'ai spécifié une magie égale à "0" - vous devez définir votre propre magie) :

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+

Merci, mais comment l'implémenter dans MQL4 ? Je m'excuse de ne pas avoir précisé tout de suite.

 
yaaarik777:

Merci, mais comment puis-je le formater pour MQL4 ? Je m'excuse de ne pas avoir été plus précis tout de suite.

Tu ne le fais pas. Je ne consulte pas sur l'ancienne langue et le terminal. Posez vos questions sur l'ancien terminal dans la section :MQL4 et MetaTrader 4 (22693)
 

Pourquoi une erreur se produit-elle sur le marché des actions et des contrats à terme alors que tout va bien sur le marché des changes et des matières premières ?

failed sell limit 1.00 USDRUB_TOM at 63.8679 sl : 63.8829 tp : 63.8329 [Invalid expiration].

 
-Aleks-:

Pourquoi une erreur se produit-elle sur le marché des actions et des contrats à terme alors que tout va bien sur le marché des changes et des matières premières ?

failed sell limit 1.00 USDRUB_TOM at 63.8679 sl : 63.8829 tp : 63.8329 [Invalid expiration].

vous devez ajouter un paramètre

request.type_time=ORDER_TIME_DAY;
 

Bonjour chers collègues, j'ai une question sur mql5 :

Comment calculer le profit sur les positions ouvertes aujourd'hui (si la position a été ouverte hier et fermée aujourd'hui, alors cette position n'est pas prise en compte) ? ???

 
Dmitry Melnichenko:

Bonjour chers collègues, j'ai une question sur mql5 :

Comment calculer le profit sur les positions ouvertes aujourd'hui (si la position a été ouverte hier et fermée aujourd'hui, alors cette position n'est pas prise en compte) ? ???

Évidemment, en comparant l'heure d'ouverture de la position avec l'heure du début de la journée.
 
Vitalie Postolache:
Évidemment, en comparant l'heure d'ouverture de la position avec l'heure du début de la journée.
Mais si la position a été ouverte hier et fermée aujourd'hui, alors l'historique montrera une transaction avec l'heure d'ouverture d'aujourd'hui, elle ferme simplement la position d'hier ! Ou ai-je tort ?