機能
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)
NormalizeDouble関数についてはコチラをご覧ください。
SymbolInfoDouble関数についてはコチラをご覧ください。
PositionsTotal関数についてはコチラをご覧ください。
PositionGetSymbol関数についてはコチラをご覧ください。
コメント