記事"MQL5 クックブック:ポジションプロパティを取得するためのディール履歴と関数ライブラリ"についてのディスカッション

 

新しい記事 MQL5 クックブック:ポジションプロパティを取得するためのディール履歴と関数ライブラリ はパブリッシュされました:

ポジションプロパティについて先行記事で提供されている情報を簡単にまとめます。本稿では、ディールヒストリーにアクセスした後にのみ取得可能なプロパティを得る関数を数個追加して作成します。また便利な方法でポジションやシンボルプロパティにアクセスできるようにするデータストラクチャについても知識を得ます。

MQL5 クックブック:ポジションプロパティを取得するためのディール履歴と関数ライブラリ

作者: Anatoli Kazharski

 
この記事はいいね。現在のポジションが 複数のディールで構成されていることがよくあるのですが、最初と最後のディールの他に、2、3などのディールのパラメータも知りたいです。そのような機能があれば、記事がより充実すると思います。
 
paladin800:
この記事はいいね。現在のポジションが 複数のディールで構成されていることがよくあるのですが、最初と最後のディールの他に、2つ、3つなどのディールのパラメーターも知りたいです。そのような機能があれば、記事がより充実すると思います。
とりあえず宿題としよう。でも、このトピックについては、また後日何か書こうと思う。
 

記事作成者への質問

ポジションがオープンされた直後に、その取引が行われたポジションのIDを 取得するにはどうすればよいですか?



 
denkir:

記事の著者への質問。

ポジションがオープンされた直後に、取引が行われたポジションの識別子を 取得するにはどうすればよいですか?

PositionSelect() 関数でポジションを選択し、PositionGetInteger() 関数と mql5 識別子POSITION_IDENTIFIER を使用して識別子を取得します。

ヘルプの例

//+------------------------------------------------------------------+
//| トレード機能|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- ポジションが利用可能かどうかをチェックし、その変更時刻を表示する。
   if(PositionSelect(_Symbol))
     {     
//--- ポジション識別子を取得する。
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- 1970年01月01日からのポジション形成時間をミリ秒単位で取得する。
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- 1970年01月01日以降、最後に位置を変更した時刻を秒単位で取得する。
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- 1970年01月01日以降、最後にポジションが変更された時刻をミリ秒単位で取得する。
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

PositionSelect() 関数を使用して位置を選択し、PositionGetInteger() 関数とmql5識別子 -POSITION_IDENTIFIERを 使用してその識別子を取得します。

ヘルプの例

tol64さん、ありがとうございます!原則的にはその通りです。

そして、最初の質問が簡潔だったことをお詫びします...ポジション識別子への 参照を与えたにもかかわらず。

問題はこうです。ポジションがオープンされた後、CDealInfo クラスのメソッド ::PositionId() を使って、取引の履歴からこのオープンを検出する必要があります。そして、できれば、オープンした瞬間と、 DEAL_ENTRY_IN またはDEAL_ENTRY_INOUT タイプの取引が 履歴に表示される瞬間との 間の時間差が最小になるようにします。

この方法は可能ですか?アクティブ・ポジションのリストではなく、履歴の中のディールのリストを通して...。
 
denkir:

ありがとう、tol64!原則的に、真実はあなたのものです。

そして、最初の質問が簡潔だったことをお詫びします...ポジションIDへの リンクを示したにもかかわらず。

問題は次のようなものです。ポジションがオープンされた後、CDealInfo クラスの::PositionId()メソッドを使用して、取引履歴でこのオープンをキャッチする必要があります。また、できれば、オープンの瞬間と DEAL_ENTRY_INまたはDEAL_ENTRY_INOUT タイプの取引が 履歴に表示される瞬間との 間の時間差が最小になるようにする必要があります

この方法は可能ですか?アクティブ・ポジションのリストではなく、ヒストリーの取引リストで...

私の意見では、上記の例のようにOnTrade()でイベントを追跡することは、これに非常に適しています。しかし、あるポジションが突然トレード・イベントで選択できなくなり、次のポジションもすぐには選択できなくなると思います。その場合は、タイマーで環境を追跡する必要があります。今はミリ秒でも設定できる。

さて、あるいはオープンポジションを追跡する代わりに、トレードの履歴(トレード回数)をスキャンする。前回のものを記憶しておき、現在のものと比較する。タイマーでもできます。たくさんのバリエーションがあります。すべては特定のタスクに依存します。

 

アナトリー、ここで問題が発生しました。あなたの経験を教えてください。関数を使うときにバグがあるのか、それとも私が「間違って」いるのか。でも、すべて正しくやったつもりなのですが...。

関数のバリアントについて質問があります。

例えば

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // チケット
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // プロパティ識別子
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // チケット
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // プロパティ識別子
   double&                     double_var         // ここでは、プロパティの値を取る
   );

ソースコードを添付します。

ファイル:
 
denkir:

アナトリー、ここで問題が発生しました。あなたの経験を教えてください。関数を使うときにバグがあるのか、それとも私が「間違って」いるのか。でも、すべて正しくやったつもりなんですが...。

質問は、2番目のものが「機能」しない関数のバリアントについてです。

...

ログには何が書かれていますか?スクリプトを実行しているときは何の問題もありません。
 
tol64:
ログには何が記録されていますか?スクリプトを実行しても問題は見当たりません。

スクリプトのデフォルト設定では、"Failure to returnHistoryOrderGetDouble()"のようなエントリがあります。

つまり、この関数のブール値バージョンはプロパティ値を取得しません。

 
denkir:

デフォルトのスクリプト設定では、「Failure to returnHistoryOrderGetDouble()関数」のような記録がありますね。

つまり、関数のブール値バージョンはプロパティ値を取得しません。

私の場合はすべて正常にパスしました。もっと詳しく(ログへの出力)すべてを見て、原因を突き止めましょう。注文数、チケット数、エラー数など。