cTrader Automate【cBotのコードサンプル】

このページでは、独自のcBotを開発する際の参考となる、いくつかのコードサンプルを掲載しています。
なお、以下に掲載されているcBotは、いずれも金銭的リターンを保証するものではありません。ライブ口座にインスタンスを適用する前に、必ずバックテストとカスタマイズを行ってください。

同期実行

このセクションのすべての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("Position entry price is {0}", position.EntryPrice);
        }
      }
    }

ログ出力

  • cBot「New cBot」がEURUSD, h1で正常に開始されました。
  • 10000EURUSD買いの成行注文の執行
  • 10000EURUSD買いの成行注文が成立、ポジションPID14576001
  • ポジションエントリー価格 1.19067
  • パラメータをカスタマイズできるシンプルなcBot

cBot のプロパティを宣言するときに、[Parameter()] 宣言を使用して、それらをカスタマイズ可能なパラメータにすることができます。cBotの新しいインスタンスが起動されると、これらのパラメータにカスタム値を割り当てることができるようになります。

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

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

この中では、以下のような特徴を定義しています。

  • パラメータ名(“SMA Period”):その後、cTrader UIに表示されます。
  • パラメータのデフォルト値 (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 Period", 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);
      }
    }

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

cBotインスタンスを作成する際、調整可能なパラメータはすべて「パラメーター」タブで設定できます。デフォルトでは、「トレードウォッチ」 表示の左側にあります。

Botを起動すると、直近の単純移動平均値が何ティックであったかをボットが知らせてくれます。

ログ出力

  • CBotインスタンス[Sample cBot Reference SMA, EURUSD, h1]を開始しました。
  • 0.975685714285714
  • 0.975681428571429
  • 0.97568
  • cBot インスタンス [Sample cBot Reference SMA, EURUSD, h1] がユーザーによって停止されました。

パラメータとデータ型については、リファレンス・ライブラリ(公式英語版)やC#と.NET基礎を参照してください。

  • より多くの引数を指定した成行注文の執行

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

ExecuteMarketOrder() メソッドは、Label、StopLoss、TakeProfit、Comment などの追加引数を指定して呼び出すことができます。
以下の例では、ラベル (“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("Position entry price is {0}", position.EntryPrice);
      Print("Position SL price is {0}", position.StopLoss);
    }
  }
}

ログ出力

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

ポジションの修正

下の例では、注文が約定したときだけ利食い値(10)を追加します。その後、ストップロスを追加するためにポジションを修正します。

StopLoss パラメータを省略するには、代わりに null を記述します。

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("Position SL price is {0}", position.StopLoss);

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

      Print("New Position SL price is {0}", position.StopLoss);

    }
  }
}

ログ出力

  • cBot「New cBot」がEURUSD, h1で正常に開始されました。
  • 10000EURUSD買いの成行注文の実行 (TP: 10)
  • 10000 EURUSD (TP: 10)の成行買い注文が成立、ポジション PID14576161
  • ポジションSL価格はNULL
  • ポジションPID14576161 (SL:1.18744、TP:1.18944)の変更
  • 修正ポジション PID14576161 (SL: 1.18744, TP: 1.18944) SUCCEEDED, Position 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で正常に開始されました。
  • 10000EURUSD買いの成行注文の実行
  • 10000EURUSD買いの成行注文が成立、ポジションPID14576180
  • 部分的なクローズ

前の例を変更して、同じラベル(”myLabel”)の成行注文を2つ作成します。それぞれの新しいバーで、cBot はこれらの注文のちょうど半分を決済しますが、出来高が 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で正常に開始されました。
  • 20000EURUSD買いの成行注文の実行
  • 20000EURUSD買いの成行注文が成立、ポジションPID14579299
  • 30000EURUSD買いの成行注文の執行
  • 30000EURUSD買いの成行注文の執行 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("Order placed with label {0}, id {1}",
      pendingOrder.Label, pendingOrder.Id);
    }
  }
}

ログ出力

  • cBot「New cBot」がEURUSD, h1で正常に開始されました。
  • 10000 EURUSD (価格: 1.19036) の買いの指値注文の発注
  • 10000EURUSD(価格: 1.19036)買いの指値注文 SUCCEED, 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
26
27
[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 + " Limit Order " + text);
      else
      Print(order.Comment + " Stop Order " + text);
    }
  }
}

ログ出力

  • cBot「New cBot」がEURUSD, h1で正常に開始されました。
  • 10000EURUSD買い指値注文の発注 (価格: 1.19049, SL: 10, ExpireTime: 2018/12/05 00:00:00)
  • 10000EURUSD買いの指値注文を発注(価格:1.19049、SL:10、ExpireTime:2018/12/05 00:00:00) SUCCEEDED、PendingOrder OID25220807
  • 10000EURUSDの買い逆指値注文 (価格: 1.19053, SL: 10, TP: 10)
  • 10000 EURUSDの買いの逆指値注文 (価格: 1.19053、SL: 10、TP: 10) SUCCEEDED、PendingOrder OID25220808
  • 指値注文
  • 第一リミットオーダー SL: 1.18949
  • セカンドストップオーダー SL: 1.18953 TP: 1.19153

保留中の注文の修正

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

以下の例では、未決注文のターゲット価格、プロテクションレベル、または有効期限と時間を変更する方法を紹介します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[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で正常に開始されました。
  • 10000EURUSD買いの逆指値注文を発注 (Price: 1.19254, SL: 10, TP: 10, ExpireTime: 2018/11/05 20:07:25)
  • 10000EURUSDの買いの逆指値注文(価格:1.19254、SL:10、TP:10、ExpireTime:2018/11/05 20:07:25)SUCCEEDED、PendingOrder OID25220877

保留中の注文のキャンセル

注文をキャンセルする構文は CancelPendingOrder(order) で、order は PendingOrder 型である。

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

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

ポジション・イベント

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

トレーダーが手動でポジションをオープンした場合や、他の cBot が自動でポジションをオープンした場合に、イベントが発生します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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で正常に開始されました。
  • 10000EURUSD買いの成行注文の実行 (SL: 10, TP: 10)
  • 10000EURUSD買いの成行注文(SL: 10, TP: 10)成功、ポジション PID14579468
  • ポジションは1.19224でオープン

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

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()
  {
    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で正常に開始されました。
  • 10000EURUSD買いの成行注文の実行 (SL: 10, TP: 10)
  • 10000EURUSD買いの成行注文(SL:10、TP:10)成功、ポジションPID14579479
  • 決済ポジション PID14579299
  • 決済ポジション PID14579299 SUCCEEDED, ポジション PID14579299
  • ポジションは20.64の利益でクローズ

非同期実行

上記のコード・サンプルは、同期実行を使ってcBotを実装するためのものです。

先に述べたように、C#は非同期処理もサポートしています。マルチスレッドを除けば、非同期実行はcBotに同じ時間枠内で複数のアクションを実行させる唯一の方法です。

非同期での成行注文の実行

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

  • 非同期操作

以下のcBotは、非同期操作がどのように機能するかを示しています。
成行注文が作成され、次のステートメントでボットは操作が実行中かどうかをチェックします。

1
2
3
4
5
6
7
8
9
10
11
12
13
[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で正常に開始されました。
  • 10000EURUSD買いの成行注文実行中
  • 注文実行中
  • 10000EURUSD買いの成行注文が成立、ポジション PID14579532
  • 注文の実行

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

cBotは非同期メソッドを呼び出した直後に、操作が実行中かどうかをチェックします。
cBotは、非同期メソッドを呼び出した直後に操作が実行中かどうかをチェックし、同期メソッドを呼び出した後にもう一度チェックします。この2つのアクションのログ出力は異なります。

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);
    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で正常に開始されました。
  • 10000EURUSD買いの成行注文実行中
  • 注文実行中
  • 20000EURUSD買い成行注文実行中
  • 10000EURUSD買い成行注文執行中 ポジションPID14579541
  • 20000 EURUSD 買い成行注文成立、ポジション PID14579542
  • 注文成立
  • さらに多くのパラメータを指定した注文の実行

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Robot()]
public class Sample_cBot : Robot
{
  protected override void OnStart()
  {
    ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, "myLabel", 10, 10);
  }
  protected override void 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で正常に開始されました。
  • 10000EURUSD買いの成行注文の実行 (SL: 10, TP: 10)
  • 10000EURUSD買いの成行注文 (SL: 10, TP: 10) 成立、ポジション PID14579719
  • 1.19087で買い SL null
  • 1.19357で買い SL 1.19257
  • cBot「New cBot」がEURUSD, h1で停止しました。

非同期でのポジション変更

以下の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()
  {
    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で正常に開始されました。
  • 10000EURUSD買いの成行注文実行 (TP: 10)
  • 10000 EURUSD (TP: 10)の成行買い注文が成立、ポジション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
9
10
11
12
13
14
15
16
17
18
[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で正常に開始されました。
  • 10000EURUSD買いの成行注文の執行 (TP: 10)
  • 10000 EURUSD (TP: 10)の成行買い注文が成立、ポジション PID14579740
  • 決済ポジション PID14579300
  • 決済ポジション PID14579300 SUCCEEDED, ポジション PID14579300
  • cBot「New cBot」がEURUSD, h1で停止しました。

指値注文と逆指値注文を非同期で発注

未決注文の発注は成行注文の発注と似ています。

ただし、この2つの方法の引数には若干の違いがあります。
マーケット・レンジは引数リストにありません。さらに、目標価格を指定する必要があり、注文の有効期限を指定するオプションの引数を渡すことができます。

1
2
3
4
5
6
7
8
9
10
11
12
[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で正常に開始されました。
  • 10000EURUSD買いの指値注文を発注 (価格: 1.19382, ExpireTime: 2018/12/05 00:18:19)
  • 10000EURUSD買いの逆指値注文を発注 (価格: 1.19487, ExpireTime: 2018/12/05 00:18:19)
  • 10000 EURUSDの買いの指値注文の発注 (価格: 1.19382, ExpireTime: 2018/12/05 00:18:19) SUCCEEDED, PendingOrder OID25221859
  • 10000 EURUSDの買いの逆指値注文の発注 (価格: 1.19487, ExpireTime: 2018/12/05 00:18:19) SUCCEEDED, PendingOrder OID25221860

保留中の注文を非同期で変更

以下のcBotは非同期で指値注文を変更する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[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で正常に開始されました。
  • 10000EURUSD買いの指値注文を発注 (価格: 1.19347、TP: 10、ExpireTime: 2018/12/05 00:22:08)
  • 保留中の注文OID25221860(数量:10000、価格:1.19487、SL:10、TP:10、ExpireTime:2018/12/05 00:18:19)を変更。
  • 10000EURUSD買いの指値注文を発注(価格:1.19347、TP:10、ExpireTime:2018/12/05 00:22:08) SUCCEEDED、保留注文OID25221906
  • 保留中の注文OID25221860(数量:10000、価格:1.19487、SL:10、TP:10、ExpireTime:2018/12/05 00:18:19)を変更SUCCEEDED、保留中の注文OID25221860
  • 保留中の注文OID25221906(数量:10000、価格:1.19347、SL:10、TP:10、ExpireTime:2018/12/05 00:22:08)を修正しました。
  • 保留中の注文OID25221906(数量:10000、価格:1.19347、SL:10、TP:10、ExpireTime:2018/12/05 00:22:08)を修正しました。SUCCEEDED, 保留注文 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の取消 SUCCEEDED、未決注文OID274705
  • 保留中の注文の取消 OID274706 SUCCEEDED, PendingOrder OID274706
  • 未決注文取消 OID274707 SUCCEEDED, PendingOrder OID274707
  • 未決注文取消 OID274708 SUCCEEDED, PendingOrder OID274708
  • 未決注文の取消 OID274709 SUCCEEDED, PendingOrder OID274709
  • myLabelの未決注文のキャンセル

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

1
2
3
4
5
6
7
8
9
10
11
12
[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
13
14
15
16
17
18
19
20
21
22
[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);
  }
}

ログ出力

  • cBot「New cBot」がEURUSD, h1で正常に開始されました。
  • 10000EURUSD買いの成行注文の執行
  • TradeOperation(10000EURUSD買い成行注文執行 EXECUTING)
  • 10000EURUSD買い成行注文成立、ポジションPID14579835
  • 取引結果(成功、ポジション:PID14579835)
  • ポジション 14579835 1.19414 でオープン
  • ラムダ式の使用

コールバックメソッドを定義する代わりに、ラムダ式を使うことができます。以下の例では、注文が入ると、その結果の説明がログに出力されます。

1
2
3
4
5
6
7
8
9
[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()));
  }
}

ログ出力

  • cBot「New cBot」がEURUSD, h1で正常に開始されました。
  • 10000EURUSD(価格: 1.19320)買いの指値注文の発注
  • 10000EURUSD(価格: 1.19320)買いの指値注文 SUCCEEDED, PendingOrder OID25222083
  • 取引結果(成功、未決済注文:OID25222083)