別の通貨ペアでEAが入らない原因|パラメータの単位

別の通貨ペアでEAが入らない原因|パラメータの単位

記事
マネー・副業
片方の通貨ペアではきちんと入っていたEAを、もう一方に載せる。パラメータはそのまま。ところが一週間回しても一度も発注が出ない。逆に、朝から晩まで入りっぱなしになることもある。EAの改修でご相談をいただくきっかけとして、これはかなり多い。

ロジックは書き換えていない。ペアを変えただけ、口座を変えただけだ。だから条件式のどこかが壊れたのだろうと考えて、if文を上から順に読み直す。ここで半日が消える。

見る場所は、たいてい条件式ではない。条件式に渡している数字のほうだ。今回は、載せ替えたときに数字に何が起きているのかと、次に載せ替えても壊れない持ち方を置いていく。具体的な数値は一つも出さない。値を決めるのは依頼者ご自身で、こちらが決めるのは単位のほうだからだ。

同じ N が、別の意味になる

パラメータに N と入れる。その N が何の単位で解釈されるかは、EAの中のどこかで決まっている。決まっているのだが、載せ替えた瞬間に、その前提だけが静かに変わる。

まず価格の刻みが違う。小数点以下の桁数が多いペアと少ないペアがあり、同じ N が指す幅は何十倍も変わる。業者を変えたときも同じで、同じペアなのに配信される桁が一つ多い、ということが起きる。

結果として、pipsで指定したつもりの数字が、実際にはその業者の最小単位で解釈されているという状態になる。損切りが本来の何分の一かの幅に置かれ、入った直後に切られ続ける。あるいは遠すぎて一度も届かない。条件式は書いたとおりに動いている。読み違えているのは単位のほうだ。

刻みだけではない。ペアが変われば一日に動く幅も、動く時間帯も変わる。値幅で置いたしきい値は、片方では毎日のように超え、もう片方では月に一度しか超えない。同じ数字を書いているのに、意味が別物になっている。

幅を持つ値には、比べる相手を持たせる

対処は一つで、幅を表す値を固定の数で持たないことだ。しきい値も、フィルタの幅も、損切りの幅も、幅を表しているものは全部これに当たる。かわりに、何と比べての幅なのかを一緒に持たせる。

持たせ方は大きく三つある。平均に対する倍率で持つ。過去N本の中での位置で持つ。そのときの価格に対する比率で持つ。どれを選ぶかは何を測りたいかによるので、正解は一つではありません。ただ、どれかを選んでいる状態にはしておきたい。

幅を持つ値の持たせ方

相手を持たせておくと、載せ替えのときに値を触らずに済む。桁の違うペアでも、値動きが大きい時間帯でも、比べる相手のほうが一緒に動くからだ。値は据え置いたまま、指している幅のほうが場所に合わせて伸び縮みする。

比べる相手の期間は、両側に壊れる

相手を持たせると、次は「何本ぶんと比べるのか」を決めることになる。この期間の取り方には、長い側と短い側の両方に壊れ方がある。

長く取ると、判定が鈍る。過去N本のNを大きくすれば平均はなめらかになるが、直近で相場の質が変わっても平均がなかなか動かない。動いた頃には、その場面は終わっている。

短く取ると、別の壊れ方をする。Nが小さいと、平均が直近の数本にほぼ引きずられる。いま起きていることと、いま起きていることを比べる形になり、どんな場面でも「平均どおり」に見える。フィルタとして置いたはずのものが、常に通す状態になる。
一度も止めていないフィルタは、フィルタではなく飾りだ。
どちらに寄っているかは、成績を見ても分からない。見るのは判定が切り替わった回数だ。ある期間を流して、そのフィルタが通した回数と止めた回数を数える。ほとんど通しているなら期間が短すぎるし、ほとんど止めているなら長すぎるか、しきい値のほうがずれている。勝ち負けを見るのは、この数が動くようになってからでいい。

判定できない時間が生まれる

相手を持たせる書き方には代償がある。比べるための過去が要る、という点だ。

起動した直後は履歴が足りない。週明けの最初の数本も、間が空いたぶん平均が前の週を引きずる。扱いが新しくてヒストリカルの薄い銘柄では、そもそも必要な本数が揃わない。固定値なら常に判定できたところが、相対にすると「まだ判定できない」という状態を持つようになる。

ここを決めていないと、判定できない間の振る舞いが、コードの書き方の副作用で決まってしまう。割る数がゼロになってエラーで止まるか、初期値のまま通してしまうか。どちらも意図した動きではない。

判定できない間の決めごと

決めるのは、必要な本数が揃うまで判定しないのか、前回の状態を保つのか。そして新規を止めるだけにするのか、保有分の管理も止めるのか。当方は、材料が揃わない間は新規だけを止め、保有分の決済は動かす形を標準にしています。ここを書いておくと、動かない朝が来たときに、仕様なのか不具合なのかで迷わずに済みます。

パラメータ表に、単位と決めた日を書く

ここまでの話は、最後にパラメータ表の書き方に落ちる。EAの設定を一覧にするとき、たいていは名前と値の二列で書く。この二列では足りない。

足すのは三つ。単位・比べる相手・決めた日だ。単位は、その数がpipsなのか倍率なのか割合なのか。比べる相手は、倍率であれば何に対する倍率なのか。決めた日は、その値をいつ決めたか。

数字をコードに直接書かずに外へ出す、というのはよく言われる。ただ、出しただけでは半分だ。出した値が何を指しているのかが一緒に置かれていないと、半年後の自分が読めない。値と、その値が通用する範囲と、決めた時点。この三つが揃って、はじめて後から確かめられる形になる。

もう一つ効いてくるのは検証の側だ。単位や比べる相手の定義を変えた時点で、それ以前の検証結果とは並べられなくなる。名前が同じパラメータでも、指しているものが違うからだ。表に決めた日が入っていれば、この結果はどの定義のときのものか、が後から辿れる。入っていないと、数字だけが残って意味が残らない。

載せ替えるときの順番

最後に手順を。載せ替えは、値を触る前にやることがある。

一つめ、いまのパラメータを単位つきで書き出す。どれが固定の幅で、どれが倍率か。この時点で単位を思い出せない値が出てきたら、そこが原因の第一候補になる。

二つめ、固定の幅で持っているものだけを、相手を持つ形に置き換える。全部を一度に変えない。変えた箇所と挙動の差が対応づけられなくなる。

三つめ、置き換えたあとに、元のペアで流し直す。先に確かめるのは新しい場所ではなく、元の場所だ。元のペアで前と同じくらいの回数だけ判定が切り替わるなら、置き換えは成功している。ここが合わないまま新しいペアへ進むと、どちらの問題なのか切り分けられなくなる。新しいペアに載せるのはそのあとで、そこで初めて値を調整する。触るのは値だけで、単位はもう動かさない。

当方は元金融系のシステムエンジニアで、ココナラでMT4/MT5のEAの改修と最適化をお受けしている。別のペアや別の口座に載せたら挙動が変わってしまった、パラメータの単位を整理し直したい、という段階からで構いません。ソースコードをお持ちでしたら、いまの値が何を指しているかの棚卸しからご一緒できます。ココナラのメッセージからご相談ください。なお、お渡しするのはソフトウェアであって、投資助言や運用の代行ではありません。
サービス数100万件のスキルマーケット、あなたにぴったりのサービスを探す