バイナリーオプションのバックテスト(過去検証)のやり方
公開日:
:
バイナリーオプション自動売買開発 バックテスト, バイナリーオプション
目次/もくじ
バイナリーオプションの場合、リアルタイムの自動売買開発と過去検証のためのソフト開発は別物です。
自動売買はこちら
過去検証の方がはるかに簡単なので、バイナリーオプション用のトレード手法はあるけどバックテストのやり方がわからない、という人向けに考察します。
バイナリーオプションは中身はFXなので、基本的にはMT4/MT5, jForex, cTrader, TradeStation, NinjaTraderなんでもいいですが、FX系のソフトでテスト可能です。
自動売買が禁止されているバイナリーオプション業者でも、システムを使って過去検証を行い手動で売買する分には問題ないので、バックテストをやらない理由がありません。
バイナリーオプションで過去検証する方法
最も基本的なバイナリーオプションの事例を考えます。
仮に、
- 5分おきに判定時刻があり、
- 1分前にプット/コールができなくなり
- ペイアウトが1.8
のオプションの場合、
- 分(Minute())が5で割り切れるときに決済。(足の更新のタイミング)
- 分(Minute())を5で割って、4余るときにはエントリー不可
- 最終的な勝率に対して1.8を掛ける
これだけで、バイナリーオプションでその手法が勝てるのかどうかテストすることができます。
※現在ハイローオーストラリアでは5分のモードはなくなっています。
上がるか下がるかだけなので、スリップ、スプレッド、約定拒否などは考えなくていいです。
FXのプログラミングをしたことがある方からすれば考慮するべき項目が激減するので超かんたんです。
ただし、バックテストするときには、スプレッドを可能な限り0に近づけます。
(MT4の場合1pointが限界です。)
MT5ならリアルティックに基づいたバックテストが可能
MT4でバックテストすると、1分足未満のデータは疑似生成ティックになってしまいます。そのため、5分単位で勝ち負けが決まるような期間の短いバイナリーオプションでは正確な過去検証を行うことができません。
しかし、MT5であればより細かいヒストリーデータに基づいたリアルティックに基づいたバックテストが可能です。
HighLow 15分で
どうやらしばらく見ない間にハイローオーストラリアではHighLowの5分のモードは消えたようですね。最短でも15分が最も短い時間のようです。
という訳で15分のハイローで検証を行ってみます。検証に使うプラットフォームはMT4とMT5と迷うところですが、15分であればティックデータの誤差が軽減されるので、スプレッドを変更できるMT4にしましょう。
締め切りは5分のハイローの時同様に1分前までです。
分が、xx:04、xx:24、xx:39、xx:54のときに締め切りで、xx:05、xx:25、xx:40、xx:55のときに判定があったり、
分が、xx:59、xx:14、xx:29、xx:44のときに締め切りで、xx:00、xx:15、xx:30、xx:45のときに判定があったりしますが、後者の時間区切りの方が分かりやすいので後者の検証で行きましょう。
ペイアウトは1.85なので、勝てば1.85倍、負ければ0倍になります。
締め切りから判定まではプット/コールできません。エントリーには下記の条件が必要です。
1 |
if( (Minute() >= 5 && Minute() < 14) || (Minute() >= 20 && Minute() < 29) || (Minute() >= 35 && Minute() < 44) || (Minute() >= 55 && Minute() < 59) ) |
決済条件は建玉を持っている場合に下記の時間になったら決済です。
1 |
if( Minute() == 0 || Minute() == 15 || Minute() == 30 || Minute() == 45 ) |
また、終了時刻+5分はプット/コールできません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
input uint ShortMAPeriod = 14; input uint LongMAPeriod = 28; static int Bar[3]; void OnTick() { double FastMA[3],SlowMA[3]; FastMA[1] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); FastMA[2] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); SlowMA[1] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); SlowMA[2] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); if( OrdersTotal() == 0 ) { if( (Minute() >= 5 && Minute() < 14) || (Minute() >= 20 && Minute() < 29) || (Minute() >= 35 && Minute() < 44) || (Minute() >= 55 && Minute() < 59) ) { int Ticket; if( FastMA[1] > SlowMA[1] && FastMA[2] <= SlowMA[2] ) { Ticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,1,0,0,"",0,0,clrRed); } else if( FastMA[1] < SlowMA[1] && FastMA[2] >= SlowMA[2] ) { Ticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,1,0,0,"",0,0,clrBlue); } } } Bar[1] = Bar[0]; Bar[0] = Bars; int OrdersTotal_ = OrdersTotal(); for( int i=0;i<OrdersTotal_;i++) { if( (Minute() == 0 || Minute() == 15 || Minute() == 30 || Minute() == 45) && Bar[1] != Bar[0] ) { bool R =OrderSelect(i,SELECT_BY_POS,MODE_TRADES); //exit if( OrderType() == OP_BUY ) R = OrderClose(OrderTicket(),OrderLots(),Bid,1,clrYellow); if( OrderType() == OP_SELL ) R = OrderClose(OrderTicket(),OrderLots(),Ask,1,clrYellow); } } } |
あとは1分足で全ティックでスプレッド1でテストするだけです。
短期移動平均線の期間と長期移動平均線の期間を”過剰最適化”させると(54,14)が最適であるということが分かりました。
総取引数219に対して勝ちトレードが120で、勝率がなんとか50%を超えています。
コストは、219回x1000円=219,000円 に対して、
リターンは、1850円x120回=222,000円 なので1000円だけプラスです。
HighLow Turbo 3分の場合
ハイローオーストラリアにはバイナリーオプションの種類に”Turbo”というものがあり、指定された時間で閉じるのではなく、プット/コールした時間を起点にして30秒後、60秒後、180秒後、300秒後にレートが上がるか下がるかをベットするモードがあります。
こちらのモードの場合、ペイアウトは1.95で通常モードよりもなぜか”払い”が良いです。
EAのプログラミングはTurboモードの方が簡単です。エントリーから時間のフィルターを外し、決済を指定秒数後にするだけです。
1 2 |
input uint TurboTime_Sec = 180; if( TimeCurrent() >= OrderOpenTime() + TurboTime_Sec ) |
コード全体は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
input uint TurboTime_Sec = 180; input uint ShortMAPeriod = 14; input uint LongMAPeriod = 28; static int Bar[3]; void OnTick() { double FastMA[3],SlowMA[3]; FastMA[1] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); FastMA[2] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); SlowMA[1] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); SlowMA[2] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); if( OrdersTotal() == 0 ) { int Ticket; if( FastMA[1] > SlowMA[1] && FastMA[2] <= SlowMA[2] ) { Ticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,1,0,0,"",0,0,clrRed); } else if( FastMA[1] < SlowMA[1] && FastMA[2] >= SlowMA[2] ) { Ticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,1,0,0,"",0,0,clrBlue); } } Bar[1] = Bar[0]; Bar[0] = Bars; int OrdersTotal_ = OrdersTotal(); for( int i=0;i<OrdersTotal_;i++) { OrderSelect(i,SELECT_BY_POS); if( TimeCurrent() >= OrderOpenTime() + TurboTime_Sec ) { bool R =OrderSelect(i,SELECT_BY_POS,MODE_TRADES); //exit if( OrderType() == OP_BUY ) R = OrderClose(OrderTicket(),OrderLots(),Bid,1,clrYellow); if( OrderType() == OP_SELL ) R = OrderClose(OrderTicket(),OrderLots(),Ask,1,clrYellow); } } } |
例によってまた”過剰”最適化させます。
取引数796に対して勝ちトレードが415で、勝率が52.14%です。
投資コストは、796回 x 1000円 = 796,000円
リターンは、415回 x 1000円 x 1.95 = 809,250円
なので13,250円の儲けになります。実際はスプレッド分で負けているトレードもあるのでこれよりもちょっと増えるはずです。
ハイロー Turbo リバウンド狙い戦略
これまでは移動平均線やRSIを過剰最適化することでしか勝率50%以上を出すことが困難でしたが、暴騰暴落のリバウンド狙いならもう少しマシな成果を出せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
input uint TurboTime_Sec = 180; input uint Gap_in_point = 100; int Ticket; if( iClose(_Symbol, _Period, 0) > iOpen(_Symbol, _Period, 0) + Gap_in_point*_Point ) { Ticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,1,0,0,"",0,0,clrBlue); } else if( iClose(_Symbol, _Period, 0) < iOpen(_Symbol, _Period, 0) - Gap_in_point*_Point ) { Ticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,1,0,0,"",0,0,clrRed); } |
暴騰暴落局面は、通常のFX取引の場合は約定拒否やスプレッドが広大になる場面ですが、ハイローバイナリーの場合はスプレッドを無視できるので、(無視できるモードがあるので、)そこに”システムの穴”があります。
また、FXの場合はレートがリバウンドせずにそのまま直行してしまった場合に、損失が膨大になりそれまでの利益を吹き飛ばしてしまいますが、ハイローバイナリーオプションの場合は損失が限定的なので、そういった意味でもバイナリーオプションでこそできる戦略だと思います。
リバウンド狙いの場合は通常のハイローバイナリーモードよりもTurboの方が有利なので、Turboで検証します。
1 2 3 4 5 6 7 8 9 10 11 12 |
int OrdersTotal_ = OrdersTotal(); for( int i=0;i<OrdersTotal_;i++) { OrderSelect(i,SELECT_BY_POS); if( TimeCurrent() >= OrderOpenTime() + TurboTime_Sec ) { bool R =OrderSelect(i,SELECT_BY_POS,MODE_TRADES); //exit if( OrderType() == OP_BUY ) R = OrderClose(OrderTicket(),OrderLots(),Bid,1,clrYellow); if( OrderType() == OP_SELL ) R = OrderClose(OrderTicket(),OrderLots(),Ask,1,clrYellow); } } |
Gap_in_pointが指定の暴騰暴落幅です。始値から現在レートまでにこの数値以上の開きを形成したときに逆張り(リバウンド狙い 落ちるナイフを掴む)取引します。大きな時間枠での暴騰暴落の場合はそのまま行ったっきりになることが多いですが、小さい時間枠チャートでの場合はリバウンドする率が高いです。
35~40pointあたりを頂点として優位性があることが分かります。(右側の収益性が低いパラメータでもプラス)
実際にグラフを確認してみると、
悪くはないグラフです。
総取引数:1256に対して、勝ちトレードが679です。
ベット総額:1256 x 1000円 = 1,256,000円
ペイアウト:679 x 1.95 x 1000円 = 1,324,050円
収益:68,050円
120万かけて7万のリターンを大きいとみるか、小さいとみるかは人それぞれでしょう。ただ、この取引数をこなすには自動売買が必要ですね。人件費を考慮しても… しかし、こんな取引をしたら自動売買であることがあからさまに検知されるので、ダミーの全然違うタイプのトレードを織り交ぜた方が良いかもしれません。
HighLow_SingalSender_turbo_rebound.ex4
HighLow_SingalSender_turbo_rebound_ATR.ex4
しかし、やはり単一のテクニカル指標程度ではごく短い時間枠チャートでのトレードの優位性を見出すこと自体が厳しい、ということでしょう。もうちょっと複雑にしたトレードロジックならもっと良い結果が見えるかもしれません。
- PREV
- 仮想通貨の自動売買API開発 使用言語と方向性
- NEXT
- コインチェックのAPIの使い方[PHP]
関連記事
-
バイナリーオプションの自動売買を開発するやり方[MT4+AutoIT]
今回はハイローバイナリーオプションのリアルタイム自動売買をします。FXの場合は、MT4MT5があれば
コメント
こんにちは。
プログラミング知識がありませんが(勉強中)バイナリ―1分足の00秒ペイアウト90%のノウハウでのバックテストをとりたくて奮闘しております。
文中にあるソースコードを1分用に編集できたとして、このソースをコンパイルしてどう使うのでしょうか?
・バックテスト対象のカスタムインジにのMQL4にこのソースを追加するのでしょうか?
・このソースをコンパイルするとストラテジーテスターにで選択できるようになり、選択することによりバックテストをかけたいカスタムインジを選択できるのでしょうか?
不敵させつなコメントであれば申し訳ありません。
宜しくお願いします。