EAでの取引時間を制限したいという方は多いと思います。それをきちんとプログラムしようというのが今回のテーマです。
ところが、これが簡単そうで、実は意外に難しいんです。
まずは、現在の時刻を返す関数を用意します。
Hour() = 現在のサーバーの「時間」を整数で返します。
Minute() = 現在のサーバーの「分」を整数で返します。
一番手っ取り早い方法は、記憶変数を用いて、①現在時刻がトレード開始時刻になったら、その記憶変数に「1」を代入し、②現在時刻がトレード終了時刻になったら、その記憶変数に「0」を代入し、③その記憶変数が「0」のときは、return(0)によってそれより下のプログラムを読み込まないようにすればOKです。
たとえば、取引時間を8時20分から16時39分の間に制限したい場合、
上のようなプログラムにすればいいわけです。
しかし、このやり方だと、EAを挿入し直すたびに記憶変数が初期化されてしまうため、EA挿入後しばらくの間は思惑通りの作動をしてくれません。
そこで、記憶変数を用いずに、あくまでも現在時刻と指定時刻の大小関係からティックの変動ごとに取引の可否を決定するプログラムを組む方がよいでしょう。
ところが、やっかいなことに、「時間」と「分」という二つの異なる単位が存在することから、そのままでは大小関係による条件分岐が複雑になってしまい、自分が何を書いているのかわからなくなってしまいます。
一日の時の流れを上の画像のように考えた場合、このまま現在時刻と指定時刻の大小関係をうまく条件分岐しようとすると頭の中が混乱して、…
↑ こんなことになっちゃいます。><
ここで、小学校時代の算数の授業を思い出しましょう。
「●●ちゃん、単位が二つ以上あるときは、ちゃんと単位をそろえて計算しましょうね。」
と先生によく叱られましたよね。
そこで、単位をすべて「分」に統一してみましょう。
一日は24時間×60分なので、すべて「分」換算すると、上の画像のように、「0分」~「1439分」までになります。
そこで、
開始時刻=開始「時間」×60+開始「分」
終了時刻=終了「時間」×60+終了「分」
現在時刻=現在「時間」×60+現在「分」
と置き換えれば、大小関係による条件分岐がしやすくなります。
ただ、ここでもう一つやっかいな問題があります。
トレードの開始時刻と終了時刻の前後関係によってさらに条件分岐をしなくてはいけません。
つまり、
このパターンのときは、
if((0<=現在時刻 && 現在時刻<開始時刻) || (終了時刻<=現在時刻 && 現在時刻<=1439)) return(0);
とし、
このパターンのときは、
if((終了時刻<=現在時刻) && ( 現在時刻<開始時刻)) return(0);
とするわけです。
実際のプログラムを見ると、
こんな感じですね。
コメントをお書きください
ライフ (土曜日, 06 1月 2018 14:35)
ちょうど悩んでいた箇所なので大変参考になりました。
ところで販売しているEAは今後増やす予定はありますでしょうか?
EA作成代行 (日曜日, 07 1月 2018 12:36)
>ライフさん
お役に立てて幸いです。
販売用EAですが、なかなか時間がなくて増やすことができません。あまり期待しない方がいいかもしれません。^^;