要塞:初心者を助けるために - ページ 5

 
Mikhail Filimonov:

よく使う機能、便利な機能

GetPositionPrice()関数のデザインを変更。

この機能では、間違った結果を示してしまう、というか。調べてみたところ、ドキュメントにあるように、Uターン時(=イン/アウトトレード時)にはポジションIDが変化しないことがわかりました。

https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties

ポジションの取り消しを行うと、取り消しを行った注文チケットにIDが変更されます。

GetPositionPriceは、反転した場合、2つ以上の反対方向のポジションを積み上げ、それらの平均価格を計算することができます。このようなポジションの平均価格は、実用的なものではありません。

では、反転時にポジションIDは変わるのか、変わらないのか?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
を回しても、ポジション番号は変わりません。
 
イン/アウトの取引から、どの数量が前のポジションを閉じ、どの数量が新しいポジションを開いたか、どのように見分けることができますか?
 
igorbel:
イン/アウト取引で、どの出来高が前のポジションを閉じ、どの出来高が新しいポジションを開いたか、どうやって見分けるのでしょうか?
現在開いているものと比較することができます。でも、反転しても変わらないidでポジションの履歴を 調べた方がいいのでは...。買い/売りのボリュームが助けになる。
 
Dennis Kirichenko:
現在のオープンポジションと比較することができます。しかし、立場が 逆転しても変わらないidで歴史を 検証した方が良いのでは...。買い/売りのボリュームが助けになる。

最近になって、振り向くとポジションIDがCHANGEするようになりました。これに関するドキュメントはすでに更新されています...。

position_identifier

ポジションIDは、新しくオープンしたポジションに割り当てられるユニークな番号で、その生涯を通じて変更されることはありません。ポジションが開設された注文のチケットに対応します。

ポジション識別子は、各注文(ORDER_POSITION_ID)と、それをオープン、変更、クローズした各取引(DEAL_POSITION_ID)に指定されています。このプロパティは、ポジションに関連する注文や取引を検索するために使用します。

ポジションを取り消すと、その識別子は取り消しを行ったオーダーチケットに変更されます。

 
Dennis Kirichenko:
今のオープンと比べてもいいんじゃない?しかし、反転時に変化しないイドによる位置の履歴を 調べた方が良いのでは...。買い/売りのボリュームが助けになる。

これは全く選択肢にない。また、反転などにより前のポジションが開いている可能性もあります。選択肢の一つにはなり得るが、明らかに最適とは言えない。

 
Andrey Barinov:

最近になって、振り向くとポジションIDがCHANGESするようになりました。これに関するドキュメントはすでに更新されています...。

position_identifier

ポジションIDは、新しくオープンしたポジションに割り当てられるユニークな番号で、その生涯を通じて変更されることはありません。ポジションが開設された注文のチケットに対応します。

ポジション識別子は、各注文(ORDER_POSITION_ID)と、それをオープン、変更、クローズした各取引(DEAL_POSITION_ID)に指定されています。このプロパティは、ポジションに関連する注文や取引を検索するために使用します。

ポジションを取り消すと、その識別子は取り消しを行ったオーダーチケットに変更されます。

このように書かれていますが、実際は何も変わりません。

よかったら、私のコード。

long pos_id1,pos_id2,pos_id3;
   ulong deal1_ticket=xxx;
   ulong deal2_ticket=xxx;
   ulong deal3_ticket=xxx;
   if(!HistoryDealSelect(deal1_ticket))
      Print(__FUNCTION__+": deal 1 not selected. Error=",GetLastError());   
   pos_id1=HistoryDealGetInteger(deal1_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal1_ticket,", position ID=",pos_id1);
   if(!HistoryDealSelect(deal2_ticket))
      Print(__FUNCTION__+": deal 2 not selected. Error=",GetLastError());
   pos_id2=HistoryDealGetInteger(deal2_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal2_ticket,", position ID=",pos_id2);
   if(!HistoryDealSelect(deal3_ticket))
      Print(__FUNCTION__+": deal 3 not selected. Error=",GetLastError());
   pos_id3=HistoryDealGetInteger(deal3_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal3_ticket,", position ID=",pos_id3);

ここで、deal2_ticketは入出庫取引チケット、deal1_ticketは入出庫取引前のチケット、deal3_ticketは入出庫取引後のチケットである。3つのケースとも同じPosition IDが表示されます。

 
igorbel:

そう言っておきながら、実際は何も変わらない。

よかったら、私のコード。

ここで、deal2_ticketは入出庫取引チケット、deal1_ticketは入出庫取引前のチケット、deal3_ticketは入出庫取引後のチケットである。3つのケースとも同じPosition IDが表示されます。

私のは変化しています。最新のビルド1340で試してみてください。
 
igorbel:
また、イン/アウトの取引から、どの数量が前のポジションを閉じ、どの数量が新しいポジションを開いたかを判断するにはどうすればよいのでしょうか。

このExpert Advisorは、ネッティング口座で「Debugging on History」モードで実行されます。この例は、取引履歴に「IN/OUT」タイプの取引が1件しかないことを計算しているため、少し乱暴な表現になっています。

//+------------------------------------------------------------------+
//|                                                         Test.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"
#include <Trade\Trade.mqh>
CTrade my_trade;
long deal_positions_id_in_out=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static int t=0;
   if(t==20)
     {
      my_trade.Buy(0.02);
     }
   if(t==25)
     {
      my_trade.Buy(0.01);
     }
   if(t==30)
     {
      my_trade.Sell(0.07);
     }
   if(t==40)
     {
      my_trade.PositionClose(Symbol());
     }
   if(t==50)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_entry==DEAL_ENTRY_INOUT)
               deal_positions_id_in_out=deal_positions_id;
            Print("DEAL_POSITION_ID ",deal_positions_id,
                  ", DEAL_VOLUME ",DoubleToString(deal_volume,2),
                  ", DEAL_ENTRY ",EnumToString((ENUM_DEAL_ENTRY)deal_entry),
                  ", DEAL_TYPE ",EnumToString((ENUM_DEAL_TYPE)deal_type));
           }
        }
     }
   if(t==55)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      double   volume_in=0;
      double   volume_out=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_IN)
               volume_in+=deal_volume;
            else if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_INOUT)
               volume_out=deal_volume;
           }
        }
      Print("DEAL_POSITION_ID ",deal_positions_id_in_out,
            ": volume in ",DoubleToString(volume_in,2),", volume out ",DoubleToString(volume_out,2));
     }
   t++;
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+

まず、全ての取引が成立し、ポジションを完全にクローズした後、全ての取引の説明(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY, DEAL_TYPE)を取得し、IN/OUTタイプの取引に対するDEAL_POSITION_IDを記憶する。

次に、履歴を再度確認し、DEAL_POSITION_ID を持つ取引のすべてのエントリーを合計します。

このようなものが得られます。

10:58:23.963    Test (EURUSD,H1)        2016.01.04 00:06:42   CTrade::OrderSend: instant buy 0.04 EURUSD at 1.08732 [done at 1.08732]
10:58:30.692    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 0, DEAL_VOLUME 0.00, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BALANCE
10:58:30.784    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.02, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:32.074    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.01, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:33.826    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.07, DEAL_ENTRY DEAL_ENTRY_INOUT, DEAL_TYPE DEAL_TYPE_SELL
10:58:37.237    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 4, DEAL_VOLUME 0.04, DEAL_ENTRY DEAL_ENTRY_OUT, DEAL_TYPE DEAL_TYPE_BUY
10:59:07.397    Test (EURUSD,H1)        2016.01.04 00:07:19   DEAL_POSITION_ID 2: volume in 0.03, volume out 0.07
ファイル:
Test.mq5  5 kb
 
Andrey Barinov:
自分の中で変化しています。最新のビルド1340で試してみてください。
それを試してみたのです。どのようなマーケットで変化していくのか?