ボックスを作って、抜けたら乗る。それだけの心臓部


『FX自動売買 実装ノート』第1話 / 全6話

前に『FX自動売買 4代記』で、生き残った四代目の核は「百数十行」だと書きました。今日はその心臓部を開けます。先に言っておくと、拍子抜けします。賢いことは何もしていません。

箱を作る

やっていることは3つだけです。まず、箱を作る

1時間足を直近20本とって、その最高値と最安値を上辺・下辺にします。それが「ボックス」。ヒゲの先(高値・安値)で取るので、実体ではなくローソクの端が箱の枠になります。

recent = klines[-20:]
high = max(float(k["high"]) for k in recent)
low  = min(float(k["low"])  for k in recent)
box = Box(high=high, low=low)

一つだけ条件があって、箱の縦幅が50pipsを超えたら「これは箱じゃない」と見送ります。 幅が広いということは、もう方向が出て動いている=レンジではない、ということ。箱じゃないものにブレイクも何もないので、黙って待ちます。

抜けたら乗る、戻ったら切る

箱ができたら、上辺を3pips抜けたら買い、下辺を3pips抜けたら売り。この3pipsはただのノイズ避けです。枠ちょうどでバタつく分に反応していたら、行ったり来たりで削られるので、少しだけ「本当に抜けた」を待つ。

buffer = 3 * 0.01
if price > box.high + buffer:  return "BUY"
if price < box.low  - buffer:  return "SELL"

手仕舞いはもっと単純で、価格が箱の中に戻ってきたら即カット。上に抜けて買ったのに上辺より下へ落ちてきたら、その時点で「抜けたと思ったのは勘違いでした」と認めて降りる。だから負けるときの傷は、基本的にバッファぶんの数pipsで済みます。

核は、本当にこれだけです。ボックスを作る、抜けたら乗る、戻ったら切る。

で、実際どう動くのか

きれいに聞こえますが、正直な姿を見せます。稼働しはじめた頃の、botが自分で建てたエントリーを並べるとこうです。

エントリー 建値 結果
買い 05-27 08:20 159.413 159.176–159.378 ボックスカット −3.5pips
買い 05-27 23:54 159.499 159.176–159.468 ボックスカット −3.1pips
売り 05-28 21:30 159.343 159.379–159.651 ボックスカット −3.6pips
売り 05-28 21:36 159.347 159.379–159.651 ボックスカット −3.3pips
売り 05-28 23:13 159.280 159.314–159.651 ボックスカット −3.4pips

全部、負けです。しかも判で押したように「抜けた→すぐ箱に戻された→−3pips」。これが**ダマシ(false breakout)**の行列です。レンジ相場では、価格は枠をちょっと超えては戻り、ちょっと超えては戻りを繰り返す。そのたびにbotは律儀に飛び乗り、律儀に−3pipsを刻む。千の切り傷で少しずつ死ぬ、という負け方です。

前に「botが自分で建てた分は5週間で−570円だった」と書きました。その正体の一端がこれです。核だけのboxブレイクは、素のままだと勝てません。

だからこれは「核」であって「完成」じゃない

じゃあ意味がないのかというと、そうではありません。ダマシに何十回刻まれても、一度ブレイクが本物のトレンドに化けたときの一撃で取り返せることがある。問題は、その一撃までの切り傷をどう減らすか、どう耐えるかです。

なので四代目は、この裸の核の上に守りを足していきました。薄い時間帯のスプレッドで刈られないようにゲートを付け、介入が来そうな価格帯では買いを見送り、建ったあとは guardian に損切りとトレールを任せる。次回以降は、その一枚ずつを剥がして書きます。今日はまず、一番下にある心臓が、これだけ単純で、これだけ脆いということだけ。

始めてみたい人へ、ハードルは相変わらず一つで、プログラムから注文を出せるFX口座が要ります。私はGMOのFXでやっていて、この百数十行を動かすのに必要な成行・逆指値・建玉照会は、ひととおり素直に叩けます。核が単純なぶん、難しいのは全部この先にある、という話でもあります。