月曜の朝にログを開いたら、指定したはずの時間の外でエントリーが出ている。あるいはその逆で、深夜だけ動かすつもりのEAが、一晩じゅう黙っている。設定画面には、開始時刻と終了時刻が確かに入っている。
時間帯フィルタは、EAの機能のなかで最も単純に見えて、いちばん食い違いが起きやすい。入れるのは二つの数字だけなのに、その数字が指している瞬間が、書いた人と動かす人と業者とで揃っていない。
今回は、時間帯の指定がずれる場所を順に見ていく。改修で持ち込まれるEAのうち、時刻まわりは毎回どこかに引っかかる。直しにかかる前に、どこで食い違っているのかを切り分けたい。指定した時刻そのものより、その時刻が何を基準にしているかのほうが、たいてい先に問題になる。
その0時は、誰の時計の0時か
EAが読んでいるのは、動かしているパソコンの時計ではない。取引サーバーが返してくる時刻だ。チャートの足に並んでいる時刻もそれで、日本時間とは何時間かずれている。ここを取り違えたまま「9時から15時まで」と入れると、まるごと別の時間帯を指すことになる。
しかも基準は業者ごとに違う。ヨーロッパの時刻に合わせているところ、ニューヨークの終わりを日付の変わり目にしているところ。同じ「0時」でも、指している瞬間が数時間ずれる。時間帯の指定は、どの業者で動かすかまで込みでようやく意味を持つ。数字だけでは、まだ何も決まっていない。
確かめ方そのものは簡単で、気配値表示や時計の欄に出ているサーバー時刻と、手元の時計を並べて差を見るだけだ。まずこの差を控えてから、開始と終了を決める。順番が逆になると、いつまでも合わない。
22時から翌2時、と書くと一日も当たらない
夜だけ動かしたい、という指定でよく起きる事故がある。開始22時・終了2時と入れたのに、一度もエントリーが出ない。
中の判定が「今の時刻が開始より後で、かつ終了より前」という形になっていると、22時より後で2時より前という条件は、どの時刻を入れても成り立たない。日をまたぐ指定は、判定の書き方そのものを変えないと通らない。開始が終了より大きいときは「開始より後、または終了より前」と読み替える必要がある。
境目も決めておきたい。終了が15時のとき、15時00分は入るのか入らないのか。1分の違いだが、その1分に指標が出ることもある。含む・含まないは仕様として先に決めて、全部の場所で同じにする。開始側と終了側で扱いが揃っていないEAは、実際にある。
年に二回、勝手に一時間ずれる
サーバー時刻は一年じゅう同じではない。多くの業者が夏時間に合わせて動くので、春と秋に一時間動く。設定を何も触っていないのに、春と秋だけEAの様子が変わるなら、たいていこれだ。切り替えの予定は業者の案内ページに載っていることが多いので、一度は目を通しておきたい。
厄介なのは、切り替わる日付が地域ごとに違うことだ。ヨーロッパとアメリカでは切り替えの週がずれるので、その隙間の期間だけ、いつもと違う差になる年がある。一度覚えた差が、その数週間だけ使えなくなるということだ。
ここで「日本時間との差は7時間」といった固定の値をコードに書き込む直し方をすると、半年後にまた同じ症状が出る。その場では合っているので直ったように見えるのが、いちばん質が悪い。合っていたのは、たまたま今がその季節だったからでしかない。
「夏時間のぶんだけ足しておきました」で直ったEAは、半年後にもう一度、同じ相談で戻ってくる。
逃げ方は二つある。差の値をパラメータとして外に出し、切り替わる時期に自分で入れ直せるようにしておくこと。もうひとつは、日本時間で考えるのをやめて、サーバー時刻のまま指定してしまうこと。読み替えの手間は増えるが、後者のほうが事故は少ない。
金曜の終わりと月曜の始まりは、別に決める
週の境目は、時間帯フィルタとは別の指定として持ったほうがいい。「毎日22時から翌2時」を素直に当てると、金曜の夜から土曜の朝までも対象に入る。市場が閉まっている時間は何も起きないので、実害が出るのは閉まる直前だ。
金曜の終わりに新規を出すか。出さないなら何時で止めるか。週をまたいでポジションを持つのかどうかも、ここで一緒に決まる。持たない方針なら、閉まる前に決済する時刻を別に持つ必要がある。決めていないと、閉まる直前に出た注文がそのまま週を越える。
月曜側も同じだ。開いた直後は値が飛ぶことがあり、スプレッドも普段と違う。開く時刻ちょうどから動かすのか、少し遅らせるのか。ここも指定の一部として書いておく。金曜と月曜は別々の数字になるのが普通で、一つの設定でまとめようとすると、どちらかが妥協になる。
効いているかどうかを、目で確かめる
時刻まわりは、動かしてみるまで合っているかどうか分からない。だから作るときに、開始と終了はパラメータとして外に出しておく。コードの中に直接書いてあると、ずれるたびに作り直しになる。外に出ていれば、季節の変わり目に数字を入れ直すだけで済む。
もうひとつ入れておきたいのが、判定に使った時刻をログに書き出すことだ。「いま何時と判定して、対象内と見た/見送った」の一行があれば、目で確かめられる。残っていないものは、後から誰も確かめようがない。エントリーが出ていないという事実だけでは、判定まで届いていないのか、届いたうえで見送ったのかが分からない。
テスターで見るときは、期間の取り方に気をつけたい。夏時間の切り替わりをまたぐ期間で回すと、前後で挙動が変わるのが目に見える。切り替えの内側だけを見ていると、いちばん確かめたい場所を通らずに終わる。
業者を移した日に、もう一度見る
口座を移す。同じ業者の中で口座タイプを変える。どちらでも基準が変わることがある。銘柄の名前が変わる話はよく知られているが、時刻の基準も同じように変わる。移行のたびに、時間帯の指定はもう一度確かめる。
順番は、サーバー時刻の差を測る、開始と終了を入れ直す、ログで判定を一日ぶん見る。この三つで足りる。移した直後の一日は、動かしっぱなしにせず様子を見たほうがいい。測った差と入れ直した指定を控えておけば、次にどこかへ移すときも同じ手順で済む。
時刻は、数字そのものでは意味を持たない。どの時計で測ったのかとセットになって、はじめて指定として成り立つ。時間帯フィルタが効かないという相談の多くは、EAの中身ではなく、この組み合わせのほうがずれている。
当方は元金融系のシステムエンジニアで、MT4・MT5のEAの最適化と改修をココナラでお受けしています。時間帯の指定どおりに動かない、季節の変わり目だけ様子が変わる、口座を移してから止まった——このあたりは、コードを大きく書き換えずに直せることが多いです。いつから・どの業者で・どの時間帯を指定しているかを添えて、ココナラのメッセージからご相談ください。なお、お渡しするのはソフトウェアであって、投資助言や運用の代行ではありません。