ウィナーズ法の検証

   2020/04/06

ウィナーズ法は昨日検証した「モンテカルロ法」と同じように「マーチンゲール法」の一種で、 「モンテカルロ法」 同様に「(マーチンゲールのような)一発逆転を狙うようなルール」にはなっていないため、掛け金(ロット数)がすぐに膨れ上がるようなことはありません。

ウィナーズ法のルール

最初の勝負で負けた場合に1を書きます。次も負けたら右端に1を書き加えます。

勝った場合には左端の数字を消します。

1が二つ並ぶまでは上記を繰り返すだけです。

1が二つ並んだら左端の数字の2倍(最初は2)を掛け金とします。勝ったら左端の数字を消す、負けたら右端に「掛け金分(2)」を書き加えます。

今度はこれを「数字が無くなるまで」繰り返します。なくなったら最初に戻る。

ルールはこれだけなので、「モンテカルロ法」よりもわかりやすいですね。

EAを作って検証してみる

モンテカルロ法」と同じように空の配列を用意します。

int LotsArray[50];

今回は0.01スタート固定ではくパラメーターを作ってみました。

input double InitLots = 0.01;

配列を初期化し、パラメーターで指定された初期ロットを100倍して初期値とします。0.01ロットの場合は1です。

void InitLotsArray()
{
   for(int i=0;i<50;i++)
   {
      LotsArray[i] = 0;
   }
   
   Lots = (int)(InitLots * 100);
}

勝敗判定は「2連勝法・31法の検証」で作った関数をそのまま使います。

bool IsWinTrade()
{
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderProfit() > 0) return true;
               else return false;
            }
         }
      }
   }
   OutputError("No trade history.");
   return false;
}

そしてウィナーズ法の処理を作ります。それ以外は「モンテカルロ法」で作成したものがそのまま流用可能です。

void SetLots(bool isWin)
{
   if(isWin)
   {
      //ロット配列を左にシフト
      for(int i=0;i<49;i++)
      {
         LotsArray[i] = LotsArray[i+1];
      }
      if(LotsArray[0] == 0)
      {
         InitLotsArray();  //0だったら配列初期化および初期値設定(リセット)
      }
      else
      {
         Lots = LotsArray[0]; //0以外だったらその値を次のロットにセット
      }
   }
   else
   {
      //配列の最後に現在Lotsを入れる
      for(int i=0;i<50;i++)
      {
         if(LotsArray[i] == 0)
         {
            LotsArray[i] = Lots;
            break;
         }
         OutputError("Failed to insert into array.");
      }
      
      //配列に3つ以上の値が入っていた場合には左端の値の2倍をロットにセットする
      if(LotsArray[0] > 0 && LotsArray[1] > 0 && LotsArray[2] > 0)
      {
         Lots = LotsArray[0] * 2;
      }
   }
}

発注時のロットは「モンテカルロ法」と同じように100で割って使います。

double lots = (double)Lots / 100;

私はint型の配列にした方がわかりやすいと考えて100で乗じたり100で割ったりしていますが、double型の配列にしてロット数をそのまま配列に保持しても良いと思います。

バックテスト

ストップロスは100pips、テイクプロフィットはストップロスと同値、初期ロットは0.01としました。

期間は2000年から2020年3月10日、通貨ペアはUSDJPY、スプレッドは5としました。時間軸は無関係です。(発注して放置するだけのシステム)

ロットが非常に大きくなり、最終的に破産しました‥。

モンテカルロ法」 と同じようにTakeProfitRate(リスクリワードレシオ) を最適化してみます。

ほぼすべてのパターンで赤字になりました。「モンテカルロ法」よりもリスクが高いようです‥。

まとめ

一度膨れ上がったロットがもとに戻るのに時間がかかってしまうため、大きなロット数での勝負を余儀なくされるようです。

これなら「モンテカルロ法」の方が使いやすいのではないか‥?と個人的には思います。

今回調べたのはこの「ウィナーズ法」と 「モンテカルロ法」 、そして 「2連勝法・31法」 の3種類のみです。他にもパーレー法やココモ法など、マーチンゲール法の亜種があったのですが、興味が持てなかったので検証していません。

またしばらくこういった記事の更新は停止してしまうかもしれませんが‥なにか気になったことがあれば検証して記事にしようとは思っています。

作ったソースコードを置いておきます。遊んでみたい方はどうぞご自由に‥。

Winners.zip

パラメーター

Magic = マジックナンバー
StopLoss=ストップロス
InitLots=初期ロット
TakeProfitRate=テイクプロフィット(ストップロスとの割合)

ご注意

そのままリアル口座で動かす人はいないと思いますが、念の為‥

「このプログラムを利用して発生したいかなる損害も当方は責任を負いかねますのでご了承ください」

  • このエントリーをはてなブックマークに追加
  • Pocket

コメント一覧

  1. 88 より:

    始めましてこんにちは。
    早速ですが、cトレーダー用のインジケーターを探していてここにたどり着きました。
    MT4からの移行に際してMT4では普通にあるものがなかなか無いので困っています。
    技術的なことはわからないので表現が不適切なら失礼ですが、MT4での特定のインジケーターをCトレーダー様に造ることは可能でしょうか?
    もちろん有償で考えています。
    よろしくお願いします。

    • emija より:

      できなくはない‥と思いますが、難度はモノによってピンキリだと思います。
      Cトレーダーは技術的な資料が少なく、扱えるエンジニアは少ないかもしれません。
      なお、私は請負作業を引き受けておりませんのでMT4のEA開発などをしている業者などに見積り依頼を出してみてはいかがでしょうか。
      (マイナーな技術で開発環境から準備する必要があると思われますので、請け負ってくれたとしても金額は高めになるかもしれません‥)
      この際、ご自身で作られても良いかと‥。ちょっとむずかしいかもしれませんが、作れるようになるとかなり便利です。

      • 88 より:

        お返事ありがとうございます。
        諸々了解しました。

        因みに、欲しいのは「MTF SMA」マルチタイムフレームの単純移動平均線で、よくあるカクカクしたものです。

        ありがとうございました。

88 にコメントする コメントをキャンセル

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。