指定した時間帯にエントリー禁止制御出来る関数

オリジナル関数

どうも潤奈です( ・Д・)

今回はパラメーターで指定した時間帯にエントリーしないように制御する為のオリジナル関数を作成したいと思います。

オリジナル関数って?という方はこちらのEA講座を最後まで閲覧して頂くと理解出来ると思います。

スポンサーリンク

必要なパラメーター

制御したい時間帯を設定画面から設定出来るようにパラメーターを設定します。

ではそれぞれを説明して行きたいと思います。

NoEntryTime変数をbool型で宣言をします。

このNoEntryTime変数は、そもそも取引時間を制御するかしないかの切り替えに使用します。

NoEntryStartTime変数とNoEntryEndTime変数はstring型(文字列)として宣言をします。

この場合は7時~22時までの間をエントリーしないようにする判断となります。

※パラメーター設定時の注意ですが全角で入力しないように注意しましょう。

OverTimePosition変数をbool型で宣言をします。

このOverTimePosition変数は、ポジションを持っている状態で取引禁止時間帯に入った時に手仕舞いするかどうかを選択出来るようにする為の物です。

オリジナル関数を作成

ではまずオリジナル関数の全文をご覧下さい。

では順番に説明をして行きます。

まずは枠を作成します。

EntryTimeCheck関数をbool型で宣言をします。

この関数に求めるものは、現在の時間が設定した禁止時間帯であるかどうかですので、bool型としてtrue(禁止時間帯)かfalse(禁止時間帯以外)を返してもらいます。

引数は2つで、stime変数とetime変数をstring型(文字列)で宣言して使用します。

この中にパラメーターで設定した開始時間をstime変数に、終了時間をetime変数に引数で渡して使用します。

まず現在の年月日を取得してStartDate変数にstring型(文字列)として代入して行きます。

TimeToStr()関数:時刻から文字列へ変換する関数で、引数は日付時刻と出力フォーマットの2つ必要です。

TimeCurrent()関数:最後に受信したサーバー時間を取得します。

TIME_DATE:TimeToStr()関数で使用する出力フォーマットで、”yyyy.mm.dd”で出力させるという指示になります。つまり年月日ですね。

他には「TIME_MINUTES:”hh:mi”」と「TIME_SECONDS:”hh:mi:ss”」の出力指示が出来ます。

これを組み合わせて、サーバー時間の年月日を文字列でStartDate変数に代入する事が出来ます。

先ほど取得した年月日とパラメーターで設定した開始時間と終了時間を連結します。

連結した後は日付時刻として使用したいので、datetime型で宣言したStartTime変数とEndTime変数に代入させます。

StrToTime()関数:”yyyy.mm.dd hh:mi”形式の文字列をdatetime型データに変換する関数です。

この関数の中に年月日が入っているStartDate変数と開始時間のstime変数を「+」で連結します。間には「”」で囲んだ半角スペースを入れる必要があるので注意です。

終了時間のetime変数も同様です。

次にまずは前半の説明。

if()関数でStartTime(開始時間)よりEndTime(終了時間)が大きいか確認します。

今回の場合は、if(7:00<22:00)となり条件に合うので()内の処理に進みます。

次のif()関数ではStartTime(開始時間)よりTimeCurrent(サーバー時間)が大きい条件と、TimeCurrent(サーバー時間)よりEndTime(終了時間)が大きいかを確認します。

↓の円グラフで表現すると、オレンジの範囲に現在のサーバー時間が位置していれば、エントリー禁止時間内と判断出来ます。

条件に合う場合は、return(true); で「現在の時刻はエントリー禁止ですよ=true」と返すようになります。その場合はEntryTimeCheck()関数の結果は「true=エントリー禁止」となります。

条件に合わない場合は、else return(false); で「現在の時刻はエントリーしても良い=false」と返すようになります。

if()関数のStartTime(開始時間)よりEndTime(終了時間)が大きくない場合、else{ }で囲ったこちらの処理に進みます。

例えばエントリー禁止時間の開始が22:00で終了が7:00の先ほどと逆に設定している場合がこちらに該当します。

次のif()関数ではEndTime(終了時間)よりTimeCurrent(サーバー時間)が大きく、TimeCurrent(サーバー時間)よりStartTime(開始時間)が大きいかを確認します。

ん?現在時間が終了時間より大きくて、開始時間より小さいってどゆこと?ってなっているかもしれませんが、冷静に考えて下さい。

先ほどと同じでオレンジの範囲に現在のサーバー時間が位置しているか確認しているだけです。

そして現在時刻が範囲内に位置しているという事は、エントリー禁止期間外と判断し、return(false); で「現在の時刻はエントリーしても良い=false」と返します。

条件に合わない場合は、return(true); で「現在の時刻はエントリー禁止ですよ=true」を返すようになります。

最後に保険でreturn(false); を記述しておきます。エラー回避の為だと思います。

使用方法プログラム

まずは全文のプログラムです。

では順番に説明します。

if()関数でNoEntryTime変数がfalseであるか、つまり取引禁止時間を確認するかどうかを確認して、false=使用しない。と設定していますのでそのまま時間は関係なくエントリーロジックに入ります。

※エントリーロジックについてはここでは省略します。

では、NoEntryTime変数がtrueの場合、EntryTimeCheck(開始時間,終了時間)関数を使用して禁止時間か確認します。

そして結果がfalse=禁止時間帯ではない。の結果であれば、エントリーロジックに入るようになります。

ではエントリー禁止時間帯でtrueが返って来た場合、OverTimePosition変数で手仕舞い設定をしているか確認します。

手仕舞い設定をON=trueにしている場合は、手仕舞いロジックに入るようにします。

※ここにポジションを持っているかの確認があった方が良いと思いますので追加してみて下さい。

まとめ

いかがでしたでしょうか。

ちょっと分かりづらかったかもしれませんが、頑張って読み解いて下さいw

ちなみに今回の書き方は時と分を合体させた状態でパラメーター入力するようにしていますので、バックテストする際に時間帯の最適化を行う事は出来ません。

もし時間帯をパラメーターで最適化したい場合は、時と分を2つの変数に分けたら出来ると思いますよ。

では、少しでも参考になれば( ・Д・)

コメント

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