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

 

Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.

Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.

J'ai défini différents MagicNumbers, mais cela n'aide pas.

 
dimnik:

Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.

Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.

J'ai défini différents MagicNumbers, mais cela n'aide pas.

Il n'y a pas de miracle. Si les MagicNumbers sont différents, alors les conseillers experts doivent distinguer les positions. Vous aurez le code ?
 
Vitalie Postolache:
Il n'y a pas de miracles. Si les magiciens sont différents, les conseillers experts doivent distinguer les positions. Y aura-t-il un code ?

Le premier (un test, juste pour une expérience commune) :

#include <Trade\Trade.mqh>

CTrade  trade;

int OnInit()
  {
   trade.SetAsyncMode(true);
   trade.SetExpertMagicNumber(111);
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {

   if (PositionsTotal()==0)
   {
      trade.Buy(1);
   }
  
  }

Le second (le même, avec un autre magicien) :

#include <Trade\Trade.mqh>

CTrade  trade;

int OnInit()
  {
   trade.SetAsyncMode(true);
   trade.SetExpertMagicNumber(222);
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {

   if (PositionsTotal()==0)
   {
      trade.Buy(1);
   }
  
  }

Dès que je ferme une position manuellement, les EA le voient instantanément et en ouvrent de nouvelles - en même temps. Si l'un s'est ouvert alors que l'autre n'est pas actif, le second ne s'ouvre plus.

 
dimnik:

Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.

Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.

J'ai défini différents MagicNumbers, mais cela n'aide pas.

Exemple d'EA qui passe en revue toutes les positions et ne ferme que son propre symbole et son Magic :

//+------------------------------------------------------------------+
//|                                                     CloseALL.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
CTrade         m_trade;                      // trading object
CPositionInfo  m_position;                   // trade position object
//--- input parameter
input ulong    m_magic=159753698;            // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   CloseAll();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

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

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


Ajouté : J'espère que vous travaillez sur un compte de hedge trading ? ??

 
dimnik:

Et dès que je ferme une position manuellement, les conseillers experts en ouvrent instantanément une nouvelle.

Et, bien sûr,PositionsTotal ne distingue pas les positions par numéro magique ou autre, il donne le nombre total de positions dans le compte. Nous devrions parcourir en boucle les positions de 0 àPositionsTotal()-1, regarder le nombre magique et compter.

Oh, pendant que j'écrivais, ils m'ont déjà montré exactement comment faire ( :
 
dimnik:

Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.

Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.

J'ai défini différents MagicNumbers, mais cela n'aide pas.

PositionsTotal() ne filtre pas par les nombres magiques. Pour cela, nous devons passer en revue les positions et calculer uniquement les positions "propres" avec notre propre fonction.
 


Добавлено: я надеюсь Вы работает на торговом счетё hedge???

Non, pas Hedge. Donc, PositionTotal() ne peut pas compter seulement ses propres positions ?

La classe CTrade peut-elle alors considérer ses propres positions séparément des autres ?

 
dimnik:

Non, pas Hedge. Donc, PositionTotal() ne peut pas compter seulement ses propres positions ?

Et la classe CTrade pourra considérer ses positions séparément ?

Il ne peut y avoir PLUS D'UNE position pour chaque symbole sur le filet. La règle du pouce s'applique à la magie:

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Nombre magique

Vladimir Karputov, 2016.12.25 12:38

Lors de la compensation, qui est le dernier à savoir - c'est-à-dire que le numéro magique de la position sera le même que lors de la dernière transaction avec cet instrument...

Vérification :

//+------------------------------------------------------------------+
//|                                             ReplacementMagic.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"
#property description "Что происходит с magic на netting"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Print("Этот пример только для netting!");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static int counter=-10;
   if(counter%300==0)
     {
      //--- генерируем Magic
      ulong m_magic=MathRand();
      Print("new Magic: ",IntegerToString(m_magic));
      //--- устанавливаем новый Magic
      m_trade.SetExpertMagicNumber(m_magic);
      //--- определим лот
      double lots=0.0;
      if(MathRand()%2==0)
         lots=0.01;
      else
         lots=0.02;

      //--- определяем, что открывать: Buy или Sell
      if(MathRand()%2==0) // значит Buy
        {
         m_trade.Buy(lots);
        }
      else // значит Sell
        {
         m_trade.Sell(lots);
        }
     }
   counter++;
  }
//+------------------------------------------------------------------+
//| 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)
     {
      for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
         if(m_position.SelectByIndex(i))
            if(m_position.Symbol()==Symbol())
              {
               //string text=ChartGetString(0,CHART_COMMENT)+"\n"+
               //            "Magic: "+IntegerToString(m_position.Magic());
               //Comment(text);
               Print("Обнаружена позиция с Magic: "+IntegerToString(m_position.Magic()));
              }
     }
  }
//+------------------------------------------------------------------+



Dossiers :
 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL4 MT4 MetaTrader 4".
 
Pouvez-vous me dire comment connaître le résultat de la ou des dernières transactions ?
Raison: