investment

fxでたった30分で10万円失った話

それは突然起きた。

いつも通り朝、パソコンを見ると昨日あったはずの20万円が10万円になっていた。約6時間寝ていただけで10万円なくなっていたのである。詳しく見てみるとわずか30分で無くなっていた。もちろん、レバレッジの倍率が高い口座で取引している訳ではない。omurinは基本的にトレードはEA(自動売買システム)を作成して使用している。そのため寝ている時間帯もトレードすることができる。約3年間のバックテストでは利益も出ており、もちろん10万円を約30分で失うというはずではなかった。

では、なぜこのようなことが起きてしまったのだろうか。それはトレード履歴を見たらすぐに分かった。

驚くことに約30分間で約1000回もトレードしていたのだ。つまり、数秒単位でbuy,sellを繰り返し、手数料で10万円を失ってしまったのである。

なぜ、こんなことになってしまったのか?

omurinは何度も自分が作成したプログラムを確認した。原因が分かるまで約一週間もかかってしまった。

何がいけなかったのか?

結論を言うと、プログラムのif文の条件がbuyの時とsellの時の両方を満たしていたのである。

しかし、バックテストでは問題が起きなかったことが疑問である。バックテストではif文を同時に満たすことはなかったからである。

調べてみるとバックテストの設定方法に問題があることが分かった。バックテストでは始値と終値しか使用していなかった。つまり、高値や安値だけでなくその途中経過も使用してなかったのである。正確にバックテストができてないおかげでバックテストでは問題がなかったのである。

EAを作成する際はバックアップの設定が大事であるということも知ってもらいたい。

omurinは全部のデータを使用してバックテストをするのはものすごく時間がかかるので嫌いだ。

全部のデータを使用してバックテストするとものすごく時間がかかるのである。
特にインジケーターを外部からダウンロードすると全く終わらない。

なんとかならないかと試行錯誤した結果、全部のデータを用いたバックテストの時間短縮は無理でした。

MT4を用いたバックテストの方法

始値のみ 最も早く、バーの始めにしか動かないEA向け
コントロールポイント ひとつ下の時間枠を用いた大まかな方法
全ティック 利用可能な最小時間枠を使いすべてのティックを作成する方法

omurinは時間がかかったり、待つのができない人です。そのため、始値のみの方法でバックテストでより正確なデータを入手する必要がありました。

ソースコードを振り返るとClose[0],High[0],Low[0]などを使用しており、これが始値のみでのバックテストでは使っていけなかった。そもそも、Close[0],High[0],Low[0]の正しい意味を誤認していた。もちろん、Closeは終値、Highは高値、Lowは安値を示しており、[0]は0本前のローソク足という意味である。つまり、Close[0]は0本前のローソク足の終値ということである。いっけん、問題なさげだが大問題である。

考えてみてほしい、Close[0]は0本前のローソク足の終値とは?

答えは現在の値ということである。

0本前ということは現在動いているローソク足を示している。
つまり、Close[0],High[0],Low[0]なんていうのは分かる訳ないのである。何分後もしくは何日後に分かる話である。プログラミングではClose[0],High[0],Low[0]は同じ意味になり現在の値を示しているに過ぎないのである。そのため、Close[0],High[0],Low[0]は連続値、Close[1],High[1],Low[1]は離散値である。fxの値というのは数秒単位で変わる。Close[0],High[0],Low[0]では数秒毎に値が更新され、更新するたびにif分が条件を満たしているかを確認し実行するのである。よって、今回のような30分で1000回のトレードをしてしまったのである。

まとめ

要点まとめ
  • Close[0],High[0],Low[0]は現在のローソク足の値を示す
  • EAのバックテストには3種類ある
    • 始値のみ、コントロールポイント、全ティック
  •  EAを作成する際はClose[0],High[0],Low[0]は使わない方が良い
    • 値が更新されるたびにif文が適用されるため