あることがきっかけでマーチンゲール法に触れる事になったので、今自分が色々確認しているFXのEAに導入してみました。
ギャンブルの話でも度々でてくる、このマーチンゲール法は果たしてどんな効果をEAにもたらしてくれるのでしょうか。
マーチンゲール法とは?
マーチンゲール法とは、トレードに連敗した分だけLot数を倍にして次のトレードを行う、いわば倍掛け法とも呼ばています。理論上は絶対に負けないとされる方法ですが、EAに取り入れてみるとどうなるのでしょうか。
まずはマーチンゲール法をわかりやすいよう表にしてみます。トレードの勝率は50%で、利益が出た場合も損失が出た場合も同額という事が前提です。
連敗数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
Lot数 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 |
連敗する確立 | 1/2 | 1/4 | 1/8 | 1/16 | 1/32 | 1/64 | 1/128 | 1/256 | 1/512 |
このように、連敗する毎にLot数を倍にするという非常に危険なトレードをする事で、勝ちエントリーが発生すれば負債がチャラになって資金が増えるというトレード方法です。
次の4戦目で勝った場合、8万円の利益を得ます。この利益をもって3連敗した分の負債7万円を帳消しにし、さらに利益1万円も得られるといった仕組みです。
勝つまでが1サイクルという考え方で、Lot数を管理しながらエントリーしていく事で何連敗しようがどこかで勝てば最終的に1万円が利益となります。(1戦目で勝っても10戦目で勝っても)
※資金が無限にあり、無限にLot数を増やせるのが前提
確かに理論的に負けない一見夢のあるトレード方法にも見えますね!!とりあえず、 この手法をEAに取り入れてみます。
私が作ったボリンジャーバンドEAは勝率が50%で利益・損失も似たような感じなので、今回のテストにはピッタリなのでそれを使います。
主な構文
マーチンゲール法は、前述した通り特に難しい手法ではなく前回の勝敗によってLot数を増減するだけなので、まずはOrderSelect(OrdersHistoryTotal()-1,・・・)を使って、一つ前の取引結果を確認します。
そして、前回トレードが負けているようならLot数を倍に増やし、逆に勝っているようならLot数を最初の値(0.01)に戻します。
あと、私が使っているMT4のブローカーは10Lot以上はエントリーできないので、もしLot数を倍にした際に10Lotを超えてしまうようなら10Lotでエントリーします。
ソースコード
//+------------------------------------------------------------------+ //| BB_Sample.mq4 | //| Copyright 2020, mef Software. | //| https://fx-prog.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, mef Software." #property link "https://fx-prog.com/" #property version "1.00" #property strict double waitBB,maisuu=0.01; datetime prevtime; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int start() { int orderPtn=0; //0:何もしない 1:買い 2:売り int total=0; int errorcode; // エラーコード int ea_ticket_No,ea_order_entry_Type=0,ea_order_MagicNo; // チケットNo,エントリタイプ,マジックNo. double ea_order_stop_price=0,ea_order_good_price=0,ea_order_entry_price=0; //ストップロスレート,利確レート,エントリーレート //--- //ボリンジャーバンドの値を取得 double BB3UP = iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,0); //3σの上側 double BB3LO = iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_LOWER,0); //3σの下側 double BB2UP = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側 double BB2LO = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側 //***売買判断箇所***// //Askがボリンジャーバンドの上3σタッチで買いサイン if(BB3UP < Ask) { orderPtn=1; } //Bidがボリンジャーバンドの下3σタッチで売りサイン else if(BB3LO > Bid) { orderPtn=2; } //それ以外は何もしない else { orderPtn=0; } //買いの場合 または 買い待ちの場合 if((orderPtn==1) || waitBB>0 ) { //2σ内で買いエントリー if((BB2UP > Ask && BB2LO < Bid )) { orderPtn=1; waitBB=0; }else{ orderPtn=0; waitBB=1; } } //売りの場合 または 売り待ちの場合 if((orderPtn==2) || waitBB<0 ) { //2σ内で売りエントリー if((BB2LO < Bid && BB2UP > Ask )) { orderPtn=2; waitBB=0; }else{ orderPtn=0; waitBB=-1; } } //***売買判断箇所***// total=OrdersTotal(); if(total == 1){ //既に建玉を保有していたら何もしない waitBB=0; } //***エントリー箇所***// else if(total == 0 && orderPtn > 0) { //★★★★★マーチンゲール法★★★★★ if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY) == true) { //前回マイナスだった場合はLot数を倍 if(OrderProfit() < 0){ maisuu = maisuu * 2; //前回イーブンだった場合はLot数を保留 }else if(OrderProfit() == 0){ maisuu = maisuu; //前回プラスだった場合はLot数を戻す }else{ maisuu = 0.01; } //枚数が最大の10を超えた場合、取引できなくなるので10にする if(maisuu>10){ maisuu=10; } } //★★★★★マーチンゲール法★★★★★ if(orderPtn == 1) { ea_order_entry_price = Ask; // 現在の買値でエントリー ea_order_entry_Type = OP_BUY; //OP_BUY ea_order_stop_price = Ask - 220 * Point; //損切りポイント(-22銭) ea_order_good_price = Ask + 220 * Point; //利喰いポイント(+22銭) } else if(orderPtn == 2) { ea_order_entry_price = Bid; // 現在の売値でエントリー ea_order_entry_Type = OP_SELL; //OP_SELL ea_order_stop_price = Bid + 220 * Point; //損切りポイント(-22銭) ea_order_good_price = Bid - 220 * Point; //利喰いポイント(+22銭) } ea_order_MagicNo=0000; //マジックナンバーは0000固定とする ea_ticket_No = OrderSend( // 新規エントリー注文 NULL, // 通貨ペア ea_order_entry_Type, // オーダータイプ[OP_BUY / OP_SELL] maisuu, // ロット(0.01単位,FXTFは1=10Lot) ea_order_entry_price, // オーダープライスレート 20, // スリップ上限 ea_order_stop_price, // ストップレート ea_order_good_price, // リミットレート "テストオーダー", // オーダーコメント ea_order_MagicNo, // マジックナンバー(識別用) 0, // オーダーリミット時間 clrRed // オーダーアイコンカラー ); if ( ea_ticket_No == -1) // オーダーエラー { errorcode = GetLastError(); // エラーコード取得 if( errorcode != ERR_NO_ERROR) // エラー発生 { printf("エラー"); } } else { // 注文約定 Print("新規注文約定。 チケットNo=",ea_ticket_No); } } return(0); } //***エントリー箇所***// //+------------------------------------------------------------------+
//★★★★★マーチンゲール法★★★★★のとろこが当該処理になります。
変数のmaisuuを用意し、Lot数を制御する処理を入れて、OrderSend()関数でそのmaisuuでエントリーするようにしています。
バックテストの結果がこちら。
EAレポート結果

最後にもの凄い損失が出ている箇所は、12連敗しています。10Lotの制限があったので負けを取り返す事ができていません。
ただ、それまでは負けながらも順調な右肩上がりのグラフになりました。EAを調整し、12連敗の箇所を10連敗以内に抑える事をすればプラス収支に終わらせることも(危ない発想ですが)可能です。
※EAの良い悪いの判断が難しくなる
もしもEA購入を検討されている場合、綺麗な右肩上がりになっているグラフはマーチンゲール法を使っている可能性もあるため確認が必要ですね。不測の連敗をしてしまった場合、損失が大変なことになります。
一応、比較用にマーチンゲール法を行わなかった場合のグラフが以下です。

Lot数以外全く同じロジックとは思えない結果ですね。
おまけ(ココモ法)
マーチンゲール法ではマイナスに終わってしまったので、似た形式のココモ法を使って確認してみました。
マーチンゲール法は前回から倍に掛け算していましたが、ココモ法は前々回のLot数+前回のLot数という形で足し算ですので、マーチンゲール法よりマイルドな結果になります。
ココモ法の表
連敗数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
Lot数 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
連敗する確立 | 1/2 | 1/4 | 1/8 | 1/16 | 1/32 | 1/64 | 1/128 | 1/256 | 1/512 |
ココモ法のEAレポート結果

少しプラスになりましたが、まだ微妙な感じですね。やはり、連敗数を減らさないといけない感じです。
おまけ(調整)
マーチンゲール法でも、ココモ法でも微妙な結果だったので少しロジックを調整しました。

調整内容は6連敗以上したら、逆方向にエントリーしてみるといった何とも大胆な調整です。
(完全にカーブフィッティングの典型例ですね!)
※ カーブフィッティングについてはこちら
※ EAのサンプルソースを一覧表にまとめました
※ オススメ記事(EAが使える国内FX業者の一覧)
※ 1からEAの作り方を学びたい人はこちら
コメント