Magic number

 

Здравствуйте. Я правильно понимаю, что Magic, присвоенный отложенному ордеру, передается потом и на сделку?
Если да, то почему следующая функция всегда возвращает 0:

int magic()
  {
   int _magic;
   for(int i=0; i<PositionsTotal(); i++)
     {
      _magic=PositionGetInteger(POSITION_MAGIC);
      if(_magic==magic) return _magic;
     }
    
     return 0;
    
  
  }
 
Igor Knyazkov:

Здравствуйте. Я правильно понимаю, что Magic, присвоенный отложенному ордеру, передается потом и на сделку?
Если да, то почему следующая функция всегда возвращает 0:

int magic()
  {
   int _magic;
   for(int i=0; i<PositionsTotal(); i++)
     {
      _magic=PositionGetInteger(POSITION_MAGIC);
      if(_magic==magic) return _magic;
     }
    
     return 0;
    
  
  }

Перед обращением к свойствам позиции, эту позицию нужно сначала выбрать:

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         Print(m_position.Magic());

m_position - это объект класса CPositionInfo, объявляется в "шапке" программы:

#include <Trade\PositionInfo.mqh>
CPositionInfo  m_position;                   // trade position object


 

 
Vladimir Karputov:

Перед обращением к свойствам позиции, эту позицию нужно сначала выбрать:

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         Print(m_position.Magic());

m_position - это объект класса CPositionInfo, объявляется в "шапке" программы:

#include <Trade\PositionInfo.mqh>
CPositionInfo  m_position;                   // trade position object


 

Спасибо.
 
как работают маджик номера при открытии нескольких позиции (по одному инструменту) с разными майджиками в неттингой системе учета позиций?
 
Igor Yeremenko:
как работают маджик номера при открытии нескольких позиции (по одному инструменту) с разными майджиками в неттингой системе учета позиций?

На netting кто последний того и тапки - то есть magic у позиции будет такой, какой был у последней сделки по этому инструменту.. 

Проверяем:

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


 

Файлы: