SymbolInfoDouble関数について

市場情報

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

機能

SymbolInfoDouble関数は指定されたシンボルの指定されたプロパティを返します。

ありていに言えば、指定銘柄・通貨ペアの小数点付き数値に関するデータを取得するための関数です。

※指定銘柄・通貨ペアの整数型データを取得するSymbolInfoInteger関数についての詳細は↓の記事をご参照ください

この関数には2つの書式があります。

※複数の書式を持つ関数オーバーロード関数については↓の記事をご参照ください。

MQL5 EA講座 第45回「関数のオーバーロード」

<書式1>

シンプルに第2引数で指定したプロパティ値を戻り値として返す書式

double  SymbolInfoDouble(
  string                  name,      // シンボル
  ENUM_SYMBOL_INFO_DOUBLE  prop_id    // プロパティの識別子
  );

<書式2>

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

bool  SymbolInfoDouble(
  string                  name,      // シンボル
  ENUM_SYMBOL_INFO_DOUBLE prop_id,   // プロパティの識別子
  double&                  double_var  // プロパティ値を受け取る
  );

引数

name

[in] 銘柄名・通貨ペア名

prop_id

[in] シンボルプロパティの識別子(値は ENUM_SYMBOL_INFO_DOUBLE 列挙のいずれか)

double_var

[out] リクエストされたプロパティの double型の値を受け取る変数(第2書式のみ)

戻り値

<書式1>→第2引数で指定したプロパティ値の結果

double型の値実行が失敗した場合、エラー 情報は GetLastError関数で取得出来ます。
•5040 – 銘柄名指定での不正な文字列パラメータの使用
•4301 – 未知のシンボル(銘柄)
•4302 – シンボルが「気配値表示」で未選択(利用可能なシンボルのリストに不在)

<書式2>→関数の実行結果の成否。成功ならtrue 失敗ならfalse。

戻り値についてはコチラを下記の記事をご覧ください。

備考

最後のティック情報取得には SymbolInfoTick() の使用が推奨されます。端末が取引口座に接続されてから、相場が一つも出ていない可能性があります。このような場合には、リクエストされた値は不定となります。

ほとんどの場合は SymbolInfoTick() 関数の1 回の呼び出しで、ユーザの買値、売値、最終値、ボリューム、また最後のティックの到着時間の受信を可能にするので充分です。

SymbolInfoMarginRate()関数は、注文の種類と方向に応じて必要な証拠金額に関するデータを提供します。

MQL5 リファレンス

↑SymbolInfoTick()関数への言及は、要は「最新の情報についてはこの関数を使ってねー」ということです。

SymbolInfoMarginRate(関数への言及についてですが、リファレンスで書かれている

「注文の種類と方向に応じて」

というのは、

SymbolInfoMarginRate()関数第2引数で取引タイプを指定し、それに基づいて、関数実行が成功した場合に第4引数に指定した変数に維持証拠金率を返す仕様になっているので、それを踏まえた注意と思われます。

サンプルコード

#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関数
については↓をご覧ください。

PositionsTotal関数については↓をご覧ください

コメント

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