機能
SymbolInfoDouble関数は指定されたシンボルの指定されたプロパティを返します。
ありていに言えば、指定銘柄・通貨ペアの小数点付き数値に関するデータを取得するための関数です。
※指定銘柄・通貨ペアの整数型データを取得するSymbolInfoInteger関数についての詳細は↓の記事をご参照ください
この関数には2つの書式があります。
※複数の書式を持つ関数=オーバーロード関数については↓の記事をご参照ください。
<書式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関数については↓をご覧ください
コメント