【MQL5入門】PositionGetSymbol関数について【EAの作り方】

取引関数

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

機能

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利用者にはお馴染みのシステムですね。

ネッティングシステムヘッジングシステムについては詳しくは以下の記事で詳しく解説していますので参考にしていただければと思います。

MQL5では、MQL4においてOrder~という接頭辞の関数を使っていた諸々の処理が、

有効化していないポジションについての操作→Order~関数

注文が成立した結果についての操作→Deal~関数

すでに有効化しているポジションについての操作→Position~関数

と切り分けられています。

リファレンスで「混乱しないようにしてください」と言っているのはそういうことです。

上記の関数については、MQL5におけるポジション番号オーダー番号約定番号という概念が関わってきます。詳しくは↓

内で解説していますので、よろしければご参照ください。

サンプルコード

#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)




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

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

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

コメント

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