初学者的问题 MQL5 MT5 MetaTrader 5 - 页 712

 

几个EA必须在同一个工具上的不同窗口工作。

我们能否以某种方式让PositionsTotal()只计算我们自己的头寸?但只要有一家EA开仓,其他的也会认为他们已经开仓了。

我设置了不同的MagicNumbers,但没有任何帮助。

 
dimnik:

几个EA必须在同一个工具上的不同窗口工作。

我们能否以某种方式让PositionsTotal()只计算我们自己的头寸?但只要有一个EA开仓,其他的也会认为他们已经开仓了。

我设置了不同的MagicNumbers,但没有任何帮助。

没有什么奇迹。如果MagicNumbers不同,那么Expert Advisors应该区分这些头寸。会不会有一个代码?
 
Vitalie Postolache:
没有奇迹。如果魔术师是不同的,专家顾问应该区分位置。会不会有一个代码?

第一个(一个测试的,只是为了联合实验)。

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

第二个(同样的一个,有另一个魔术师)。

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

只要我手动关闭一个头寸,EA就会立即看到这一点,并打开新的头寸--在同一时间。如果一个已经打开,而另一个没有激活,第二个将不会打开。

 
dimnik:

几个EA必须在同一个工具上的不同窗口工作。

我们能否以某种方式让PositionsTotal()只计算我们自己的头寸?但只要有一家EA开仓,其他的也会认为他们已经开仓了。

我设置了不同的MagicNumbers,但这并没有帮助。

例子EA,通过所有的头寸,只关闭自己的符号和它的魔法。

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


补充:我希望你是在做一个对冲交易账户?

 
dimnik:

而且,只要我手动关闭一个头寸,专家顾问系统就会立即打开一个新的头寸。

当然,PositionsTotal 并不以神奇数字或其他东西来区分头寸,它给出了账户中的头寸总数 我们应该循环浏览从0到PositionsTotal()-1的 位置,查看神奇数字并计数

哦,当我在写的时候,他们已经向我展示了具体的方法(。
 
dimnik:

几个EA必须在同一个工具上的不同窗口工作。

我们能否以某种方式使PositionsTotal()只计算我们自己的头寸?但只要有一家EA开仓,其他的也会认为他们已经开仓了。

我设置了不同的MagicNumbers,但没有任何帮助。

PositionsTotal()并不通过神奇的数字进行过滤。为此,我们必须通过头寸,只用我们自己的函数计算 "自己的 "头寸。
 


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

不,不是Hedge。那么,PositionTotal()不能只计算自己的位置?

那么CTrade类 能否将其头寸与其他头寸分开考虑?

 
dimnik:

不,不是Hedge。那么,PositionTotal()不能只计算自己的位置?

CTrade类 将能够单独考虑其头寸?

每个符号在网上的位置不能多于一个。这个经验法则适用于魔术

关于交易、自动交易系统和策略测试的论坛

神奇的数字

Vladimir Karputov, 2016.12.25 12:38

在净值方面,谁是最后一个知道的人--即神奇的头寸数量将与该工具最后一次交易时相同......

检查。

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



附加的文件:
 
与本主题无关的评论已被移至 "MQL4 MT4 MetaTrader 4初学者的问题"。
 
你能告诉我如何找出最后一个或多个交易的结果吗?