機能
PositionGetSymbol関数は↓
未決済ポジションに対応するシンボルを返し、PositionGetDouble、PositionGetInteger、PositionGetString 関数を使用しての操作のために自動的にポジションを選択します。
mql5リファレンス
要は、今持っているポジションの通貨ペア・銘柄情報を取得する関数です。
まずはポジションプール内をfor文などを使ってチェックし、チャート上の通貨ペア・銘柄と一致していたら、PositionGet~関数で、さらなる情報を取りに行く・・・そんな使い方をします。
<書式>
string PositionGetSymbol( int index // ポジションリスト内の番号 ); |
引数
ポジション内のリスト番号を指定します。
※ポジションプールは時系列が古い順に0,1,2,3…と格納されています。for文を利用して、リスト番号をチェック・取得していきます。
戻り値
取得した通貨ペア・銘柄情報を返します。
ポジションが見つからなかった場合、空の文字列 が戻されます。
エラーコード取得には GetLastError関数が呼ばれます
備考
ポジションの『ネッティング』計算時(ACCOUNT_MARGIN_MODE_RETAIL_NETTINGとACCOUNT_MARGIN_MODE_EXCHANGE)各シンボルにつき常に一つのポジションのみ(1つ以上の取引の結果である)保有することができます。ポジションと『ツールボックス』パネルの『取引』タブに表示される有効な未決注文と混同しないようにしてください。
ポジションに制限がない場合(ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)各シンボルごとに同時に複数のポジションを保有することができます。
MQL5リファレンス
MT5では、ポジション管理にネッティングシステムとヘッジングアカントという2つのシステムを(一応)設けています。
どちらのシステムを採用しているかはブローカーによって異なります。
(一応)と書いているのは、現在はほとんどのブローカーはヘッジングシステムを採用しており、ネッティングシステムは死滅状態に近いからです((+_+))
ネッティングシステムにおいては、一つの通貨ペアにつき、一つのポジションしか持つことができません。
ヘッジングシステムにおいては、同一通貨ペアで複数のポジションを所持することが可能です。メタトレーダー4利用者にはお馴染みのシステムですね。
ネッティングシステムとヘッジングシステムについては詳しくは以下の記事で詳しく解説していますので参考にしていただければと思います。
サンプルコード
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
#property strict
//+------------------
#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関数についてはコチラをご覧ください。
PositionsTotal関数についてはコチラをご覧ください。
コメント