Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 712

 

Mehrere EAs müssen in verschiedenen Fenstern mit demselben Instrument arbeiten.

Können wir irgendwie erreichen, dass PositionsTotal() nur unsere eigenen Positionen zählt? Sobald aber ein EA eine Position eröffnet, gehen auch die anderen davon aus, dass sie bereits in Position sind.

Ich habe verschiedene MagicNumbers eingestellt, es hilft nicht.

 
dimnik:

Mehrere EAs müssen in verschiedenen Fenstern mit demselben Instrument arbeiten.

Können wir irgendwie erreichen, dass PositionsTotal() nur unsere eigenen Positionen zählt? Sobald aber ein EA eine Position eröffnet, gehen auch die anderen davon aus, dass sie bereits in Position sind.

Ich habe verschiedene MagicNumbers eingestellt, es hilft nicht.

Es gibt kein Wunder. Wenn die MagicNumbers unterschiedlich sind, dann sollten die Expert Advisors in der Lage sein, die Positionen zu unterscheiden. Werden Sie den Code haben?
 
Vitalie Postolache:
Es gibt keine Wunder. Wenn die Magier unterschiedlich sind, sollten die Expert Advisors die Positionen unterscheiden. Wird es einen Code geben?

Die erste (eine Testversion, nur für ein gemeinsames Experiment):

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

Die zweite (dieselbe, mit einem anderen Magier):

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

Sobald ich eine Position manuell schließe, sehen die EAs dies sofort und eröffnen neue Positionen - gleichzeitig. Wenn eine geöffnet ist, während die andere nicht aktiv ist, wird die zweite nicht geöffnet.

 
dimnik:

Mehrere EAs müssen in verschiedenen Fenstern mit demselben Instrument arbeiten.

Können wir irgendwie erreichen, dass PositionsTotal() nur unsere eigenen Positionen zählt? Sobald aber ein EA eine Position eröffnet, gehen auch die anderen davon aus, dass sie bereits in Position sind.

Ich habe verschiedene MagicNumbers eingestellt, aber das hilft nicht.

Beispiel EA, der alle Positionen durchläuft und nur sein eigenes Symbol und dessen Magic schließt:

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


Hinzugefügt: Ich hoffe, Sie arbeiten an einem Hedge-Trading-Konto???

 
dimnik:

Und sobald ich eine Position manuell schließe, eröffnen die Expert Advisors sofort eine neue.

Und natürlich unterscheidetPositionsTotal die Positionen nicht nach magischer Zahl oder sonstigem, sondern gibt die Gesamtzahl der Positionen im Konto an. Wir sollten eine Schleife durch die Positionen von 0 bisPositionsTotal()-1 ziehen, die magische Zahl betrachten und zählen.

Oh, während ich geschrieben habe, haben sie mir schon genau gezeigt, wie man das macht (:
 
dimnik:

Mehrere EAs müssen in verschiedenen Fenstern mit demselben Instrument arbeiten.

Können wir irgendwie erreichen, dass PositionsTotal() nur unsere eigenen Positionen zählt? Sobald aber ein EA eine Position eröffnet, gehen auch die anderen davon aus, dass sie bereits in Position sind.

Ich habe verschiedene MagicNumbers eingestellt, es hilft nicht.

PositionsTotal() filtert nicht nach magischen Zahlen. Dazu müssen wir die Positionen durchgehen und nur die "eigenen" Positionen mit unserer eigenen Funktion berechnen.
 


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

Nein, nicht Hedge. PositionTotal() kann also nicht nur seine eigenen Positionen zählen?

Kann die CTrade-Klasse dann ihre eigenen Positionen getrennt von anderen betrachten?

 
dimnik:

Nein, nicht Hedge. PositionTotal() kann also nicht nur seine eigenen Positionen zählen?

Und die CTrade-Klasse kann ihre Positionen getrennt betrachten?

Es kann NICHT MEHR als EINE Position für jedes Symbol auf dem Netting geben. Die Faustregel gilt für Magic:

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Magische Zahl

Wladimir Karputow, 2016.12.25 12:38

Beim Netting erfährt es der Letzte - d.h. die magische Zahl der Position wird die gleiche sein wie beim letzten Handel mit diesem Instrument...

Prüfen:

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



Dateien:
 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL4 MT4 MetaTrader 4 Anfängern" verschoben.
 
Können Sie mir sagen, wie ich das Ergebnis des letzten oder mehrerer Abschlüsse herausfinden kann?
Grund der Beschwerde: