cBot コードサンプル

cBots (自動売買)

このページでは、cBot を開発する際に使用できるいくつかのコードスニペットを提供しています。以下に記載されている cBot は、いかなる金融利益も保証するものではありません。cBot をライブ アカウントに展開する前に、バックテストとカスタマイズを必ず行ってください。

サンプルリポジトリ

追加のコードサンプルは常にgit@github.com:spotware/ctrader-automate-samples.gitリポジトリで利用可能です。アクセスするにはここをクリックしてください。

同期操作

このセクションのすべての cBot は同期的に操作を実行します

マーケット注文の実行

  • 成功する操作を実行するシンプルな cBot

次の cBot は、起動時にマーケット注文を作成し、その結果をresult変数に保存します。

注文が正常に実行されると、エントリー価格がログに表示されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);

            if (result.IsSuccessful)
            {
                var position = result.Position;
                Print("ポジションのエントリー価格は {0}", position.EntryPrice);
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD の買い注文を実行中
  • 10000 EURUSD の買い注文を実行中 SUCCEEDED、ポジション PID14576001
  • ポジションのエントリー価格は 1.19067 です
  • カスタマイズ可能なパラメータを持つシンプルな cBot

さまざまな cBot プロパティを宣言する際に、[Parameter()]宣言を使用して、それらをカスタマイズ可能なパラメータに変換できます。cBot の新しいインスタンスが起動されると、ユーザー (または他のユーザー) はこれらのパラメータにカスタム値を割り当てることができます。パラメータの詳細については、ここをクリックしてください。

次の例を考えてみましょう。

1
2
    [Parameter("SMA 期間", DefaultValue = 14)]
    public int SmaPeriod { get; set; }

このコードでは、以下の特性を定義しています。

  • パラメータの名前。これにより、cTrader の UI に表示されます ("SMA 期間")。
  • すべての新しいインスタンスに適用されるデフォルト値 (ユーザーによって変更されない限り) (DefaultValue = 14)。

以下のコードでは、SmaPeriodプロパティが実際の cBot でどのように使用されるかを示しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class SamplecBotReferenceSMA : Robot
    {
        [Parameter("Source")]
        public DataSeries Source { get; set; }

        [Parameter("SMA 期間", DefaultValue = 14)]
        public int SmaPeriod { get; set; }

        private SampleSMA sma;

        protected override void OnStart()
        {
            sma = Indicators.GetIndicator<SampleSMA>(Source, SmaPeriod);
        }

        protected override void OnTick()
        {
            Print("{0}", sma.Result.LastValue);
        }
    }

cBot は、カスタマイズ可能なSmaPeriodプロパティを受け取り、開始時にその値をIndicators.GetIndicator<SampleSMA>()メソッドに渡します。このメソッドは、指定された期間の単純移動平均値を返します。

cBot のインスタンスを作成するとき、すべての調整可能なパラメータは「インスタンスの追加」ウィンドウで設定できます。

起動すると、ボットは各ティックで最後の単純移動平均値が何であるかを通知します。

ログ出力

  • cBot インスタンス [Sample cBot Reference SMA, EURUSD, h1] が開始されました。
  • 0.975685714285714
  • 0.975681428571429
  • 0.97568
  • cBot インスタンス [Sample cBot Reference SMA, EURUSD, h1] がユーザーによって停止されました。
  • 引数を追加したマーケット注文の実行

前の例では、ExecuteMarketOrder()メソッドに最小限の引数を渡しました。引数は、取引タイプ (TradeType.Buy)、シンボル (Symbol)、およびボリューム (-1) でした。

ExecuteMarketOrder()メソッドは、LabelStopLossTakeProfitCommentなどの追加の引数を指定して呼び出すこともできます。以下の例では、ラベル ("order 1")、ストップロス保護メカニズム (10)、およびテイクプロフィットレベル (10) を指定しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    [Robot(TimeZone = TimeZones.UTC)]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, "order 1", 10, 10);

            if (result.IsSuccessful)
            {
                var position = result.Position;
                Print("ポジションのエントリー価格は {0}", position.EntryPrice);
                Print("ポジションの SL 価格は {0}", position.StopLoss);
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD (SL: 10, TP: 10) の買い注文を実行中
  • 10000 EURUSD (SL: 10, TP: 10) の買い注文を実行中 SUCCEEDED、ポジション PID14576098
  • ポジションのエントリー価格は 1.1896 です
  • ポジションの SL 価格は 1.1886 です

ポジションの変更

以下の例では、注文を実行する際にテイクプロフィット値 (10) のみを追加します。その後、ポジションを変更してストップロスを追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    [Robot()]
    public class SamplecBbot : Robot
    {
        protected override void OnStart()
        {
            var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000,
                                    "order 1", null, 10);
            if (result.IsSuccessful)
            {
                var position = result.Position;
                Print("ポジションの SL 価格は {0}", position.StopLoss);

                var stopLoss = position.EntryPrice - 10*Symbol.PipSize;
                ModifyPosition(position, stopLoss, position.TakeProfit);

                Print("新しいポジションの SL 価格は {0}", position.StopLoss);

            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD (TP: 10) の買い注文を実行中
  • 10000 EURUSD (TP: 10) の買い注文を実行中 SUCCEEDED、ポジション PID14576161
  • ポジションの SL 価格は null です
  • ポジション PID14576161 (SL: 1.18744, TP: 1.18944) を変更中
  • ポジション PID14576161 (SL: 1.18744, TP: 1.18944) を変更中 SUCCEEDED、ポジション PID14576161
  • 新しいポジションの SL 価格は 1.18744 です

ポジションのクローズ

  • 完全にクローズする

次のコードサンプルでは、マーケット注文を出します。その結果生じたポジションのグロスプロフィットが特定の値 (null && position.GrossProfit > 10) を超えると、クローズされます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, "myLabel");
        }

        protected override void OnTick()
        {
            var position = Positions.Find("myLabel");
            if (position != null && position.GrossProfit > 10)
            {
                ClosePosition(position);
                Stop();
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD の買い注文を実行中
  • 10000 EURUSD の買い注文を実行中 SUCCEEDED、ポジション PID14576180
  • 部分的にクローズする

前の例を変更して、同じラベル ("myLabel") を持つ2つのマーケット注文を作成します。各新しいバーで、cBot はこれらの注文のうち 1 つを半分だけクローズしますが、そのボリュームが 20,000 以上の場合のみです。

また、Positions.FindAll()メソッドも使用します。これにより、繰り返し処理できるポジションのリストが返されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 20000, "myLabel");
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 30000, "myLabel");
        }

        protected override void OnBar()
        {
            var positions = Positions.FindAll("myLabel", SymbolName, TradeType.Buy);

            foreach (var position in positions)
            {
                if (position.VolumeInUnits >= 20000)
                {
                    ClosePosition(position, 15000);
                }
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 20000 EURUSD の買い注文を実行中
  • 20000 EURUSD の買い注文を実行中 SUCCEEDED、ポジション PID14579299
  • 30000 EURUSD の買い注文を実行中
  • 30000 EURUSD の買い注文を実行中 SUCCEEDED、ポジション PID14579300

保留中の注文の作成

  • リミット注文およびストップ注文の作成

リミット注文とストップ注文は保留中の注文です。それにもかかわらず、マーケット注文と同様に作成されます。ただし、リミット注文とストップ注文を作成する場合は、ターゲット価格を指定する必要があり、市場範囲はありません。

この cBot は 2 つのリミット注文と 1 つのストップ注文を作成します。次に、注文を繰り返し処理して、ラベルと ID をログに出力します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            PlaceLimitOrder(TradeType.Buy, SymbolName, 10000, Symbol.Bid, "myLimitOrder");
            PlaceLimitOrder(TradeType.Buy, SymbolName, 20000, Symbol.Bid-2*Symbol.PipSize,
                    "myLimitOrder");
            PlaceStopOrder(TradeType.Buy, SymbolName, 10000, Symbol.Ask, "myStopOrder");

            foreach (var pendingOrder in PendingOrders)
            {
                 Print("ラベル {0}、ID {1} で注文が配置されました",
                                              pendingOrder.Label, pendingOrder.Id);
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD (価格: 1.19036) のリミット注文を配置中
  • 10000 EURUSD (価格: 1.19036) のリミット注文を配置中 SUCCEEDED、PendingOrder OID25220794
  • 20000 EURUSD (価格: 1.19017) のリミット注文を配置中
  • 20000 EURUSD (価格: 1.19017) のリミット注文を配置中 SUCCEEDED、PendingOrder OID25220795
  • 10000 EURUSD (価格: 1.19040) のストップ注文を配置中
  • 10000 EURUSD (価格: 1.19040) のストップ注文を配置中 SUCCEEDED、PendingOrder OID25220796
  • ラベル myLimitOrder、ID 25220794 で注文が配置されました
  • ラベル myLimitOrder、ID 25220795 で注文が配置されました
  • ラベル myStopOrder、ID 25220796 で注文が配置されました
  • 引数を追加した保留中の注文の作成

マーケット注文の場合と同様に、注文ラベル、さまざまな保護メカニズム、注文の有効期限、コメントを指定することもできます。

 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
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            DateTime midnight = Server.Time.AddDays(1).Date;

            PlaceLimitOrder(TradeType.Buy, SymbolName, 10000, Symbol.Bid, "mySample_cBot", 10, null, midnight, "First");

            PlaceStopOrder(TradeType.Buy, SymbolName, 10000, Symbol.Ask, "mySample_cBot", 10, 10, null, "Second");

            foreach (var order in PendingOrders)
            {
                var sl = order.StopLoss == null ? "" : "SL: " + order.StopLoss;
                var tp = order.TakeProfit == null ? "" : " TP: " + order.TakeProfit;

                var text = string.Format("{0} {1}", sl, tp);

                if (order.OrderType == PendingOrderType.Limit)
                    Print(order.Comment + " リミット注文 " + text);
                else
                    Print(order.Comment + " ストップ注文 " + text);
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD (価格: 1.19049、SL: 10、有効期限: 2023/08/19 00:00:00) のリミット注文を配置中
  • 10000 EURUSD (価格: 1.19049、SL: 10、有効期限: 2023/08/19 00:00:00) のリミット注文を配置中 SUCCEEDED、PendingOrder OID25220807
  • 10000 EURUSD (価格: 1.19053、SL: 10、TP: 10) のストップ注文を配置中
  • 10000 EURUSD (価格: 1.19053、SL: 10、TP: 10) のストップ注文を配置中 SUCCEEDED、PendingOrder OID25220808
  • リミット注文
  • 最初のリミット注文 SL: 1.18949
  • 2 番目のストップ注文 SL: 1.18953 TP: 1.19153

保留中の注文を変更する

保留中の注文のいくつかの特性を変更することが可能です。

以下の例では、保留中の注文のターゲット価格、保護レベル、有効期限および時間を変更する方法を示しています。

 1 2 3 4 5 6 7 8 91011121314151617181920212223
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            var price = Symbol.Ask + 10 * Symbol.PipSize;
            DateTime? expiry = Server.Time.AddHours(12);
            PlaceStopOrder(TradeType.Buy, SymbolName, 10000, price, "myLabel", 10, 10, expiry);
        }

        protected override void OnBar()
        {
            foreach (var order in PendingOrders)
            {
                if (order.Label == "myLabel")
                {
                    double newPrice = Symbol.Ask + 5 * Symbol.PipSize;
                    ModifyPendingOrder(order, newPrice, order.StopLossPips,
                                                                order.TakeProfitPips, order.ExpirationTime);
                }
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD (価格: 1.19254、SL: 10、TP: 10、有効期限: 11/05/2018 20:07:25) のストップ注文を配置中
  • 10000 EURUSD (価格: 1.19254、SL: 10、TP: 10、有効期限: 11/05/2018 20:07:25) のストップ注文を配置中 SUCCEEDED、PendingOrder OID25220877

保留中の注文をキャンセルする

注文をキャンセルするための構文は CancelPendingOrder(order) です。ここで、orderPendingOrder のタイプです。

以下の例では、ラベル "myLabel" の付いたすべての注文をキャンセルしています。

 1 2 3 4 5 6 7 8 91011121314
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnTick()
        {
            foreach (var order in PendingOrders)
            {
                if (order.Label == "myLabel")
                {
                    CancelPendingOrder(order);
                }
            }
        }
    }

ポジションイベント

さまざまな取引操作に関連するイベントにサブスクライブすることが可能です。たとえば、ポジションが開かれたかどうかをテストするために、Position オブジェクトがオープン時に発生するイベントにサブスクライブします。

 1 2 3 4 5 6 7 8 9101112131415
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            Positions.Opened += PositionsOnOpened;
            ExecuteMarketOrder(TradeType.Buy, Symbol, 10000, "myLabel", 10, 10);
        }

        private void PositionsOnOpened(PositionOpenedEventArgs args)
        {
            var pos = args.Position;
            Print("Position opened at {0}", pos.EntryPrice);
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 (SL: 10、TP: 10)
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579468
  • ポジションが 1.19224 で開かれました

同様に、ポジションがクローズされるたびに発生するイベントにもサブスクライブすることが可能です。

 1 2 3 4 5 6 7 8 910111213141516171819202122
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            Positions.Closed += PositionsOnClosed;
            ExecuteMarketOrder(TradeType.Buy, Symbol, 10000, "myLabel", 10, 10);
        }

        protected override void OnBar()
        {
            var position = Positions.Find("myLabel");
            if (position != null)
                ClosePosition(position);
        }

        private void PositionsOnClosed(PositionClosedEventArgs args)
        {
            var pos = args.Position;
            Print("Position closed with {0} profit", pos.GrossProfit);
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 (SL: 10、TP: 10)
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579479
  • ポジション PID14579299 をクローズ中
  • ポジション PID14579299 をクローズ中 SUCCEEDED、Position PID14579299
  • ポジションは 20.64 の利益でクローズされました

座標変換

以下の cBot を使用すると、チャート上で右クリックするだけで、適切な方向に指値注文を配置できます。これを実現するために、マウスの Y 座標をチャートの Y 座標(シンボルの場合、シンボル価格に対応)に変換します。

 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class CoordinatesConverter : Robot
    {
        protected override void OnStart()
        {"
            Chart.MouseUp += Chart_MouseUp;
        {"

        private void Chart_MouseUp(ChartMouseEventArgs obj)
        {"
            var desiredPrice = Chart.YToYValue(obj.MouseY);
            var desiredTradeType = desiredPrice > Symbol.Bid ? TradeType.Sell : TradeType.Buy;
            PlaceLimitOrder(desiredTradeType, SymbolName, 10000, desiredPrice);
        {"
    {"
{"
{"

非同期実行

上記のコードサンプルは、同期実行を使用して cBot を実装するように設計されています。前述したように、C# では非同期操作もサポートしています。マルチスレッド処理のほか、非同期実行は同じ時間枠内で cBot が複数のアクションを実行する唯一の方法です。

マーケットオーダーを非同期に実行する

非同期メソッドの構文は同期メソッドの構文に似ています。引数の種類は同じですが、返り値の型が TradeOperation ではなく TradeResult です。

  • 基本的な非同期操作

次の cBot は、非同期操作がどのように機能するかを示しています。マーケットオーダーが作成されます。次の条件で、ボットは操作が実行されているかどうかをチェックします。

 1 2 3 4 5 6 7 8 910111213
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {"
            TradeOperation operation = ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000);

            if (operation.IsExecuting)
            {"
                Print("Operation Is Executing");
            {"
        {"
    {"

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中
  • Operation Is Executing
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579532
  • 注文を実行する

次の例は、同期メソッドと非同期メソッドの違いを強調しています。

cBot は、非同期メソッドを呼び出した直後に操作が実行されているかどうかを確認します。その後、同期メソッドを呼び出した後にも同じ確認を行います。これら二つのアクションのログ出力は異なります。

 1 2 3 4 5 6 7 8 9101112
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {"
            TradeOperation operation = ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000);
            Print(operation.IsExecuting ? "Operation Is Executing" : "Operation executed");
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 20000);
            Print(operation.IsExecuting ? "Operation Is Executing" : "Operation executed");

        {"
    {"

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中
  • Operation Is Executing
  • 20000 EURUSD を買うためのマーケットオーダーを実行中
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579541
  • 20000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579542
  • Operation executed
  • より多くのパラメータを指定して注文を実行する

次の cBot は、ラベル ("myLabel")、保護レベル (10, 10)、シンボル (SymbolName)、およびボリューム (10000) を指定して注文を配置します。

例には Positions コレクションと FindAll() メソッドが含まれています。 Find() および FindAll() を使用して、同じラベル、シンボル、および取引タイプを持つポジションを検索することができます。

 1 2 3 4 5 6 7 8 910111213141516171819
    [Robot()]
    public class Sample_cBot : Robot
    {"
        protected override void OnStart()
        {"
            ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, "myLabel", 10, 10);
        {"
        {"
        protectedoverridevoid OnTick()
        {"
            Position[] positions = Positions.FindAll("myLabel", SymbolName, TradeType.Buy);
            if (positions.Length == 0)
                return;

            foreach (var position in positions)
                Print("Buy at {0} SL {1}", position.EntryPrice, position.StopLoss);

            Stop();
        {"
    {"

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 (SL: 10、TP: 10)
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579719
  • 1.19087 で買い SL null
  • 1.19357 で買い SL 1.19257
  • cBot「New cBot」は、EURUSD、h1 で停止されました。

ポジションを非同期に修正する

次の cBot は、マーケットオーダーを配置し、その後、新しく開かれたポジションを修正します。

 1 2 3 4 5 6 7 8 9101112131415161718
    [Robot()]
    public class Sample_cBot : Robot
    {"
        protected override void OnStart()
        {"
            ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, "myLabel", null, 10);
        {"

        protected override void OnTick()
        {"
            Position myPosition = Positions.Find("myLabel");
            if (myPosition != null && myPosition.StopLoss == null)
            {"
                double stopLoss = Symbol.Bid - 10 * Symbol.PipSize;
                ModifyPositionAsync(myPosition, stopLoss, myPosition.TakeProfit);
            {"
        {"
    {"

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 (TP: 10)
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579736
  • ポジション PID14579300 (SL: 1.19213, TP: null) を修正中
  • ポジション PID14579300 (SL: 1.19213, TP: null) を修正中 SUCCEEDED、Position PID14579300

ポジションを非同期にクローズする

次の例は、ポジションが存在する場合にそれを非同期にクローズする方法を示しています。

Find() メソッドを使用して、Positions コレクション内の特定のラベルを持つポジションを検索します。

 1 2 3 4 5 6 7 8 9101112131415161718
    [Robot()]
    public class Sample_cBot : Robot
    {"
        protected override void OnStart()
        {"
            ExecuteMarketOrderAsync(TradeType.Buy, Symbol, 10000, "myLabel", null, 10);
        {"

        protected override void OnTick()
        {"
            Position myPosition = Positions.Find("myLabel");
            if (myPosition != null && myPosition.GrossProfit > 10)
            {"
                ClosePosition(myPosition);
                Stop();
            {"
        {"
    {"

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 (TP: 10)
  • 10000 EURUSD を買うためのマーケットオーダーを実行中 SUCCEEDED、Position PID14579740
  • ポジション PID14579300 をクローズ中
  • ポジション PID14579300 をクローズ中 SUCCEEDED、Position PID14579300
  • cBot「New cBot」は、EURUSD、h1 で停止されました。

リミット注文とストップ注文を非同期に配置する

上記で述べたように、未決注文の配置は、マーケットオーダーの作成に似ています。

しかし、これらの2つのメソッドの間には、引数にいくつかのわずかな違いがあります。マーケットレンジは引数リストから省かれています。さらに、ターゲット価格を指定する必要があり、注文の有効期限を指定するオプションの引数を渡すことができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            DateTime expiry = Server.Time.AddHours(12);
            PlaceLimitOrderAsync(TradeType.Buy, SymbolName, 10000, Symbol.Bid, "myLabel", null, null, expiry);
            PlaceStopOrderAsync(TradeType.Buy, SymbolName, 10000, Symbol.Ask + 10 * Symbol.PipSize, "myLabel", null, null, expiry);
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのリミット注文を配置中 (価格: 1.19382, 有効期限: 12/05/2018 00:18:19)
  • 10000 EURUSD を買うためのストップ注文を配置中 (価格: 1.19487, 有効期限: 12/05/2018 00:18:19)
  • 10000 EURUSD を買うためのリミット注文を配置中 (価格: 1.19382, 有効期限: 12/05/2018 00:18:19) 成功、未決注文 OID25221859
  • 10000 EURUSD を買うためのストップ注文を配置中 (価格: 1.19487, 有効期限: 12/05/2018 00:18:19) 成功、未決注文 OID25221860

未決注文を非同期に修正する

次のcBotは、リミット注文を非同期で修正します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            DateTime expiry = Server.Time.AddHours(12);
            PlaceLimitOrderAsync(TradeType.Buy, SymbolName, 10000, Symbol.Bid, "myLabel", null, 10, expiry);

        }
        protected override void OnTick()
        {
            foreach (var order in PendingOrders)
            {
                if (order.Label == "myLabel" && order.StopLoss == null)
                    ModifyPendingOrderAsync(order, order.TargetPrice, 10, 10, null);
            }
        }
    }

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのリミット注文を配置中 (価格: 1.19347, TP: 10, 有効期限: 12/05/2018 00:22:08)
  • 未決注文 OID25221860 を修正中 (ボリューム: 10000, 価格: 1.19487, SL: 10, TP: 10, 有効期限: 12/05/2018 00:18:19)
  • 10000 EURUSD を買うためのリミット注文を配置中 (価格: 1.19347, TP: 10, 有効期限: 12/05/2018 00:22:08) 成功、未決注文 OID25221906
  • 未決注文 OID25221860 を修正中 (ボリューム: 10000, 価格: 1.19487, SL: 10, TP: 10, 有効期限: 12/05/2018 00:18:19) 成功、未決注文 OID25221860
  • 未決注文 OID25221906 を修正中 (ボリューム: 10000, 価格: 1.19347, SL: 10, TP: 10, 有効期限: 12/05/2018 00:22:08)
  • 未決注文 OID25221906 を修正中 (ボリューム: 10000, 価格: 1.19347, SL: 10, TP: 10, 有効期限: 12/05/2018 00:22:08) 成功、未決注文 OID25221906

未決注文を非同期にキャンセルする

  • すべての未決注文をキャンセル

以下のcBotは、現在の未決注文をすべて非同期にキャンセルします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnBar()
        {
            foreach (var pendingOrder in PendingOrders)
            {
                CancelPendingOrderAsync(pendingOrder);
            }
        }
    }

ログ出力

  • cBot「cancel pending order」は、EURUSD、h1 で正常に開始されました。
  • 未決注文 OID274705 をキャンセル中
  • 未決注文 OID274706 をキャンセル中
  • 未決注文 OID274707 をキャンセル中
  • 未決注文 OID274708 をキャンセル中
  • 未決注文 OID274709 をキャンセル中
  • 未決注文 OID274705 をキャンセル中 成功、未決注文 OID274705
  • 未決注文 OID274706 をキャンセル中 成功、未決注文 OID274706
  • 未決注文 OID274707 をキャンセル中 成功、未決注文 OID274707
  • 未決注文 OID274708 をキャンセル中 成功、未決注文 OID274708
  • 未決注文 OID274709 をキャンセル中 成功、未決注文 OID274709
  • 特定のラベルを持つ未決注文のキャンセル

このcBotは、特定のラベルを持つ未決注文のみをキャンセルします。

    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnBar()
        {
            foreach (var pendingOrder in PendingOrders)
            {
                if (pendingOrder.Label == "myLabel")
                    CancelPendingOrderAsync(pendingOrder);
            }
        }
    }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

非同期メソッドのためのコールバック関数

非同期操作を使用する場合、結果が返されると、実行を制御する必要があります。これを処理するためには、すべての非同期メソッドの引数リストの最後にコールバック関数を追加できます。

この関数は、サーバーからの応答が受信されるとすぐに呼び出されます。たとえば、ポジションがオープンされた、修正された、またはクローズされたときに呼び出されることがあります。

  • コールバックを持つ非同期のマーケット注文
    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            TradeOperation operation = ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, PositionOpened);
            if (operation.IsExecuting)
                Print(operation.ToString());
            else
                Print(operation.TradeResult.ToString());

        }

        private void PositionOpened(TradeResult tradeResult)
        {
            var position = tradeResult.Position;
            Print(tradeResult.ToString());
            if (tradeResult.IsSuccessful)
                Print("Position {0} opened at {1}", position.Id, position.EntryPrice);
        }
    }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのマーケット注文を実行中
  • TradeOperation (10000 EURUSD を買うためのマーケット注文を実行中)
  • 10000 EURUSD を買うためのマーケット注文を実行中 成功、ポジション PID14579835
  • TradeResult (成功、ポジション: PID14579835)
  • ポジション 14579835 が 1.19414 でオープンされました
  • ラムダ式の使用

名前付きのコールバックメソッドを定義する代わりに、ラムダ式を使用できます。

次の例では、注文が配置されると、結果の説明がログに出力されます。

    [Robot()]
    public class Sample_cBot : Robot
    {
        protected override void OnStart()
        {
            PlaceLimitOrderAsync(TradeType.Buy, SymbolName, 10000,
                       Symbol.Ask - 20 * Symbol.PipSize, "myLabel", result => Print(result.ToString()));
        }
    }
1
2
3
4
5
6
7
8
9

ログ出力

  • cBot「New cBot」は、EURUSD、h1 で正常に開始されました。
  • 10000 EURUSD を買うためのリミット注文を配置中 (価格: 1.19320)
  • 10000 EURUSD を買うためのリミット注文を配置中 (価格: 1.19320) 成功、未決注文 OID25222083
  • TradeResult (成功、未決注文: OID25222083)
目次

このページについて