初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 712

 

複数のEAが同じ商品で異なるウィンドウで動作する必要があります。

どうにかして、PositionsTotal()が自分のポジションだけをカウントするようにできないでしょうか?しかし、あるEAがポジションを開く と同時に、他のEAもすでにポジションを持ったとみなします。

別のMagicNumbersを設定しましたが、役に立ちません。

 
dimnik:

複数のEAが同じ商品で異なるウィンドウで動作する必要があります。

どうにかして、PositionsTotal()が自分のポジションだけをカウントするようにできないでしょうか?しかし、あるEAがポジションを開く と同時に、他のEAもすでにポジションを持ったとみなします。

別のMagicNumbersを設定しましたが、役に立ちません。

奇跡はない。MagicNumbers が異なる場合、Expert Advisor はポジションを区別することができるはずです。コードをお持ちでしょうか?
 
Vitalie Postolache:
奇跡は起きない。マジコンが異なる場合、Expert Advisorはポジションを区別する必要があります。コードはあるのでしょうか?

最初の1枚(共同実験のためだけのテスト用)。

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

2回目(同じもので、別のマジシャンがいる)。

#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がそれを見て、同時に新しいポジションを開くのです。片方がアクティブでないときにもう片方が開いた場合、2つ目は開きません。

 
dimnik:

複数のEAが同じ商品で異なるウィンドウで動作する必要があります。

どうにかして、PositionsTotal()が自分のポジションだけをカウントするようにできないでしょうか?しかし、あるEAがポジションを開く と同時に、他の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がポジションを開く と同時に、他のEAもすでにポジションを持ったとみなします。

別のMagicNumbersを設定しましたが、役に立ちません。

PositionsTotal() は、マジックナンバーによるフィルタリングを行いません。そのためには、ポジションを調べて、「自分の」ポジションだけを独自の関数で計算する必要があります。
 


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

いいえ、Hedgeではありません。では、PositionTotal()は自分のポジションだけをカウントすることはできないのでしょうか?

その場合、CTradeクラスは 自身のポジションを他と区別して考慮することができますか?

 
dimnik:

いいえ、Hedgeではありません。では、PositionTotal()は自分のポジションだけをカウントすることはできないのでしょうか?

また、CTradeクラスは、そのポジションを個別に考慮できるようになるのでしょうか?

ネット上の各シンボルの位置は1つ以上であってはならない。マジックにも経験則は適用 される。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

マジックナンバー

ウラジミール・カルプトフ 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初心者からの質問」に移動しました。
 
直近の1回以上のトレードの結果を知る方法を教えてください。
理由: