変数の役割
これまでにもあまり大した説明をせずに変数を扱ってきましたが、
ここでは変数について重点的に行います。
変数には大きく分けて2種類の役割があります。
1.何度も使う数値や数式を引き出しやすくして、演算量を減らし、記述を楽にする
2.そのままだと消えてしまうデータを一時的に保存しておく
1だけ聞くと、
「演算量なんてどうでもいいし、楽な記述よりも慣れたやり方の方がいい」
という選択肢もあるのですが、
変数にはデータを一時的に保存することができるので、
この機能を使うには避けて通ることはできません。
例えば、
テクニカル指標のシグナルが発生してすぐにエントリーではなく、
5分後にエントリーさせたい場合を考えます。
TimeCurrent()では現在の時刻しか取得できないため、
テクニカル指標のシグナルが発生した瞬間にその時間をどこかに記録しておく必要があります。
1 2 3 4 |
datetime RSI_Signal_Time; if( iRSI(Symbol(),0,14,PRICE_CLOSE,0) > 30 && iRSI(Symbol(),0,14,PRICE_CLOSE,1 ) <= 30 ){ RSI_Signal_Time = TimeCurrent(); } |
上記のようにすることによって
RSI_Signal_Timeという変数にシグナルが発生した時間が格納されます。
ここで注意しなければならないのは、冒頭の datetime RSI_Signal_Time; です。
変数は利用する前にあらかじめ、
どんなタイプの変数なのか、
どんな名前なのかを宣言しなければなりません。
タイプには、整数、少数、文字、時間、真偽などがあります。
1 2 3 4 5 |
整数:int 少数:double 文字:string 時間:datetime 真偽:bool |
それぞれのタイプに合わせて変数の宣言を行わなければなりません。
また、変数名は半角英数字で決めてください。
ただし、「数字から始まる文字」、「-(ハイフン)」などは利用できません。
後は分かりやすい名前にすることを強く推奨いたします。
=はイコールではなく代入
今までもチラチラと出現していましたが、
=はプログラミングではイコールではなく、代入を表します。
1 |
int Number = 5; |
はNumberという変数に5を入れたということを意味します。
変数には一つの数字しか格納することができません。
1 2 |
int Number = 5; Number = 10; |
このように続けて同じ変数に値を入れようとすると、
古い数字は破棄され、新しい10がNumberに格納されます。
シグナル発生から5分以内に10pips上がったらエントリー
これまでのことを元に14RSIが30ラインを下から上にクロスした後、
5分以内に10pips上がったらエントリーするというEAを作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
static datetime RSI_Signal_Time; static double RSI_Signal_Rate; int OnTick() { //RSI Signal Check if( iRSI(Symbol(),0,14,PRICE_CLOSE,0 ) > 30 && iRSI(Symbol(),0,14,PRICE_CLOSE,1) <= 30 ) { RSI_Signal_Time = TimeCurrent(); RSI_Signal_Rate = Bid; } //Buy Entry if( OrdersTotal() == 0 && TimeCurrent() <= RSI_Signal_Time + 60*5 && Bid > RSI_Signal_Rate + 0.10) { OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"Buy",1234,0,Red); } } |
冒頭にあるstaticというのは
ティック更新後にも変数をリセットしないでください、
という意味を持つ呪文です。
これがないと、ティック更新後に変数がリセットされてしまい、
RSI_Signal_TimeとRSI_Signal_Rateが0になってします。
シグナル発生後5分以内というのは、
言い換えると
「現在の時間 < シグナルが発生した時間 + 300秒」ということになります。 また、ドル円の場合10pipsは0.10なので、 10pips上がったらエントリーというのは「現在のレート > シグナル時のレート + 0.10」 ということになります。