コンテンツにスキップ

Martingale cBot

戦略概要

Martingale cBotは、金融市場に適応された古典的なベッティングシステムであるMartingale戦略を実装する取引ロボットです。 18世紀にフランスの数学者によって発見されたマーチンゲール戦略は、すぐにカジノの賭け人の間で人気を博しました。

マーチンゲール戦略の仕組みを理解するために、1ドルの賭けから始まる表裏のコイン投げゲームのシナリオを考えてみましょう。

コインが表か裏に着地する確率は50/50です。 各コイン投げは独立しており、1回の投げの結果が次の投げに影響を与えることはありません。

各負けの後に賭け金を倍にすると、最終的に勝利した際にすべての損失を回復し、さらに1ドルの利益を得ることができます。

cBotの作成

C#またはPythonを使用してcBotを作成する方法を、ステップバイステップのガイドで学びます。

Martingale cBotのコードは、公開されているC#およびPythonリポジトリで利用可能です。 同じコードが、cTrader WindowsまたはMacのアルゴリズム作成ウィザードでテンプレートとして提供されており、以下のスニペットをコピーして使用することもできます:

 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
47
48
49
50
51
52
53
54
55
56
57
58
59
using cAlgo.API;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class SampleMartingalecBot : Robot
    {
        [Parameter("Initial Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
        public double InitialQuantity { get; set; }

        [Parameter("Stop Loss", Group = "Protection", DefaultValue = 40)]
        public int StopLoss { get; set; }

        [Parameter("Take Profit", Group = "Protection", DefaultValue = 40)]
        public int TakeProfit { get; set; }


        private Random random = new Random();

        protected override void OnStart()
        {
            Positions.Closed += OnPositionsClosed;

            ExecuteOrder(InitialQuantity, GetRandomTradeType());
        }

        private void ExecuteOrder(double quantity, TradeType tradeType)
        {
            var volumeInUnits = Symbol.QuantityToVolumeInUnits(quantity);
            var result = ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "Martingale", StopLoss, TakeProfit);

            if (result.Error == ErrorCode.NoMoney)
                Stop();
        }

        private void OnPositionsClosed(PositionClosedEventArgs args)
        {
            Print("Closed");
            var position = args.Position;

            if (position.Label != "Martingale" || position.SymbolName != SymbolName)
                return;

            if (position.GrossProfit > 0)
            {
                ExecuteOrder(InitialQuantity, GetRandomTradeType());
            }
            else
            {
                ExecuteOrder(position.Quantity * 2, position.TradeType);
            }
        }

        private TradeType GetRandomTradeType()
        {
            return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell;
        }
    }
}
 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
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *

from robot_wrapper import *

import random

class SampleMartingalecBot():
    def on_start(self):
        api.Positions.Closed += self.on_position_closed
        self.execute_order(api.InitialQuantity, self.get_random_trade_type())

    def execute_order(self, quantity, tradeType):
        volumeInUnits = api.Symbol.QuantityToVolumeInUnits(quantity)
        result = api.ExecuteMarketOrder(tradeType, api.SymbolName, volumeInUnits, "Martingale",  api.StopLoss,  api.TakeProfit)
        if result.Error == ErrorCode.NoMoney:
            api.Stop()

    def on_position_closed(self, args):
        api.Print("Closed")

        position = args.Position
        if position.Label != "Martingale" or position.SymbolName != api.SymbolName:
            return
        if position.GrossProfit > 0:
            self.execute_order(api.InitialQuantity, self.get_random_trade_type())
        else:
            self.execute_order(position.Quantity * 2, position.TradeType)

    def get_random_trade_type(self):
        return TradeType.Buy if random.randint(0, 1) == 0 else TradeType.Sell

インジケーターの統合

Martingale cBotは、市場の方向を予測するための予測モデルや技術的指標を使用しません。 代わりに、買いと売りの決定にランダムな確率に依存し、各取引の結果(利益または損失)は予測不可能です。

ロジック

ランダムな取引方向

  • cBotはGetRandomTradeType()メソッドを通じて、買い注文または売り注文をランダムに選択します。

  • ExecuteOrder()メソッドは、パラメーターで定義された数量、損切り、利食いを持つ成行注文を出します。

マーチンゲールメカニズム

  • cBotはOnPositionsClosed()イベントハンドラーを通じてポジションが閉じられたことを検出します。
  • 閉じられたポジションが利益をもたらした場合、cBotは自身をリセットし、初期ロットサイズとランダムな取引方向で新しい取引を開始します。
  • 閉じられたポジションが損失をもたらした場合、cBotは次の取引の数量を2倍にしますが、前の取引と同じ取引方向(買いまたは売り)を維持します。

リスク管理

  • cBotは、損失を回復し、成功した取引が発生した際に利益を得るために、負けた取引の後にポジションサイズを2倍にするマーチンゲール戦略に依存しています。
  • デフォルトの損切りと利食いの値は、各取引のリスクとリワードのバランスを取ることを目的としています。

実行と終了

cBotが資金不足(NoMoney)によるエラーに遭遇した場合、cBotは取引の試行を停止します。

パラメーター

パラメーター 単位 定義 ヒント
数量 ロット 各マーティンゲールサイクルにおける(最初の)取引の量。 高い値を設定すると、最初の取引のポジションサイズが大きくなります。 結果として、成功した取引サイクルの終わりには、利益が大きくなります。 しかし、損失が出た場合、次の取引サイズは2倍になり、リスクが指数関数的に増加します。

低い値を設定すると、最初の取引のポジションサイズが小さくなります。 結果として、成功した取引サイクルの終わりには、利益は小さくなりますが、長期的な損失が続いた場合のエクスポージャーは最小限に抑えられます。
損切り Pip エントリー価格から、損失が出ている取引が自動的にクローズされる距離。 大きな損切りを設定すると、取引をクローズする前に市場がより大きく反対方向に動くことを許容します。 これにより、一時的な変動による取引の早期クローズを防ぐことができますが、市場が間違った方向に動き続けた場合、より大きな損失にさらされる可能性があります。

小さな損切りを設定すると、損失が出ている取引をより早くクローズし、取引ごとの潜在的な損失を減らします。 しかし、短期的な変動によって早すぎるストップアウトのリスクも高まり、マーティンゲールの倍増サイクルがより頻繁に発動する可能性があります。
利食い Pip エントリー価格から、一定の利益レベルに達した時に取引がクローズされる距離。 高い利食い値を設定すると、市場が大きく有利な方向に動いた場合に大きな利益を得ることができます。 しかし、これは取引のクローズに時間がかかる可能性があることも意味し、利益目標に到達する前に反転する可能性もあり、機会損失につながる可能性があります。

小さな利食いレベルを設定すると、取引がより早くクローズされ、小さいが頻繁な利益を確保できます。 このアプローチは、利益機会を逃す可能性を減らしますが、各取引の上昇ポテンシャルを制限します。

応用

レンジ相場または横ばい相場

Martingale cBotは、明確な上昇トレンドや下降トレンドがない横ばいの市場で優れた性能を発揮します。 レンジ相場では、価格がサポートとレジスタンスのレベルの間で変動するため、損失が出た取引の後、cBotが素早く損失を回復する可能性が高くなります。

ユースケース

EURUSDが数日間1.1000から1.1050の狭いレンジで取引されているシナリオを考えてみましょう。 Martingale cBotは、価格がそれらのレベル間で跳ね返ることを利用し、市場がマイナーのプルバック後に反転したときに最終的に利益を捕捉することができます。

ベストプラクティス

市場が予測可能に振動する、明確で十分に定義された価格動向を持つ銘柄でcBotを使用してください。 静かな取引時間帯の主要な為替ペアは良い例です。

低ボラティリティ市場

cBotは、連続的な損切りを引き起こす可能性が低く、急速なポジション拡大を防ぐ低ボラティリティの条件下で使用できます。 このような条件下では、マーティンゲール戦略が徐々な価格反転を通じてうまく機能することができます。

ユースケース

ニュースの少ない期間に金(XAUUSD)などのコモディティを取引している場合、価格が狭いレンジ内に留まる可能性があります。 cBotはこの環境から恩恵を受けることができます。価格が短い価格変動の中で反転する可能性が高く、大きな損失のリスクを抑えながら利益を得る取引が可能になるためです。

ベストプラクティス

重要な経済イベントやニュースリリースが予想される期間にcBotを実行することは避けてください。これらは高いボラティリティを引き起こすためです。

平均回帰資産

平均価格水準に頻繁に回帰する通貨ペアは、長期的なトレンドを形成する前に反転を経験することが多いため、Martingale cBotに適しています。 このような条件下では、cBotはより速く回復し、損失後にポジションサイズを増やすことで利益を得ることができます。

ユースケース

EURGBPなどの平均回帰する通貨ペアでの取引を検討してください。 このタイプの通貨ペアは、一時的な急騰や急落の後に平均価格に戻ることが多く、価格の反転後に損失ポジションを利益で決済するcBotにとって理想的な条件と機会を提供します。

ベストプラクティス

価格が長期間一方向に動き続ける可能性がある、強い長期的なトレンド市場でのcBotの使用は避けてください。 このような市場では、回復前に大きな損失を被るリスクが高くなります。

Summary

Martingale cBotは、人気のあるマーチンゲール戦略を実装した自動取引アルゴリズムです。 このcBotは、予測モデルや技術的指標を使用せず、完全にランダムな確率に基づいて売買の決定を行うため、各取引の結果は不確実です。

市場は最終的にトレーダーに有利に働くという前提のもと、Martingale cBotは損失後に取引サイズを倍増させ、1回の利益取引で損失を取り戻します。 このcBotは特定の市場で有効である可能性があり、特にユーザーがリスクについて十分に理解し、長期間のドローダウンに耐えるための十分なリソースを持っている場合に効果的です。