PositionGetInteger関数について

取引関数

スポンサーリンク
スポンサーリンク

機能

PositionGetInteger関数は、未決済ポジションのリクエストされた整数型(int型datetime型)のプロパティを返します。

この関数を使う前に、事前にポジションの選択を行います。

MQL5 公式リファレンスではPositionGetSymbol 関数または PositionSelect関数を使うことよう推奨しています。

が!、基本的にはヘッジングシステム口座ではPositionGetSymbol でポジション選択するべきと考えます。

PositionSelect関数は引数(パラメーター)が取引銘柄名(=シンボル)です。

これは、PositionSelect関数ネッティングシステム口座(1取引銘柄につき1ポジションしか保有できない口座タイプ)、を想定した関数と思われます。

現状、MT5採用ブローカーのほとんどがヘッジングシステム口座の中、(もし利用しているEAが1ポジション運用が原則のEAならよいのですが)マルチポジション戦略のEAでPositionSelectを使うと、最小チケットのポジションを選択してしまいます

ポジションリスト内の番号を引数に指定するPositionGetSymbol 関数を使うのが望ましいでしょう。

この関数には2パターンの書式があります。

<書式1>

引数で指定したプロパティ値を戻り値として返す書式

long  PositionGetInteger(
  ENUM_POSITION_PROPERTY_INTEGER  property_id      // プロパティ識別子
  );;

<書式2>

関数の実行が成功と戻り値で確認できたときに、第2引数に指定した変数にプロパティ値を参照渡しで返す書式

bool  PositionGetInteger(
  ENUM_POSITION_PROPERTY_INTEGER  property_id,     // プロパティ識別子
  long&                          long_var        // プロパティ値を受け取る
  );

SymbolInfo~関数と同じパターンですね(引数の数に違いはありますが)

よろしければこちらの記事も参考にしてみてください。↓

引数

<書式1>

ENUM_POSITION_PROPERTY_INTEGER  property_id      // プロパティ識別子

<書式2>


  ENUM_POSITION_PROPERTY_INTEGER  property_id,     // プロパティ識別子
  long&                          long_var        // プロパティ値を受け取る

戻り値

<書式1>

指定したプロパティ識別子の値を返します。

<書式2>

関数実行の成功に応じて true または false を返します。指定したプロパティ識別子の値は第2引数参照渡しで返します。

サンプルコード

#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする

CTrade trade;
// CTradeクラスのオブジェクトを宣言

void OnTick()
  {
      double Ask=NormalizeDouble(//正規化
                                 SymbolInfoDouble(_Symbol,SYMBOL_ASK),//現在値の取得
                                 _Digits);
      if(PositionsTotal()==0)//ポジションがなければ
      {
         trade.Buy(0.01,NULL,Ask,Ask-1000*_Point,Ask+500*_Point);
         //買い注文
      }//if(PositionsTotal()==0)
      
      BreakEven(Ask);
      //ブレイクイーブンを発動させる
      
  }//void OnTick()
//+------------------------------------------------------------------+

//ブレイクイーブン関数の定義
void BreakEven(double price)
{
   //ポジションプール内を古い方にむかってループチェック
   for(int icounter=PositionsTotal()-1 ; icounter>=0  ;icounter--)
   {
      string positionSymbol=PositionGetSymbol(icounter);//ポジションの通貨ペアを取得
      
      if(_Symbol==positionSymbol)//ポジションの通貨ペアが一致したら
      {
         ulong PosTicketNum=PositionGetInteger(POSITION_TICKET);
         //ポジションのチケット番号を取得
         
         double PosPrice=PositionGetDouble(POSITION_PRICE_OPEN);
         //ポジションのオープン価格を取得
         
         if(price>PosPrice+200*_Point)//現在値がオープン価格より一定数上がったら
         {
            trade.PositionModify(PosTicketNum,PosPrice,PosPrice+500*_Point);
            //ストップロスを建値に引き上げる
            
         }//if(Ask>PosPrice+200*_Point)
      }//if(_Symbol==positionSymbol)
   }//for(int icounter=PositionsTotal()-1 ; icounter>=0  ;i--)
}//void BreakEven(double price)

OnTick関数についてはコチラをご覧ください。

NormalizeDouble関数についてはコチラをご覧ください。

SymbolInfoDouble関数についてはコチラをご覧ください。

PositionsTotal関数についてはコチラをご覧ください。

PositionGetSymbol関数についてはコチラをご覧ください。

コメント

タイトルとURLをコピーしました