このページでは、独自のcBotを開発する際の参考となる、いくつかのコードサンプルを掲載しています。
なお、以下に掲載されているcBotは、いずれも金銭的リターンを保証するものではありません。ライブ口座にインスタンスを適用する前に、必ずバックテストとカスタマイズを行ってください。
同期実行
このセクションのすべてのcBotは、同期的にオペレーションを実行します。
成行注文の実行
- シンプルなcBot
次の cBot は、起動時に成行注文を作成し、結果を result 変数に保存します。
注文の実行が成功すると、エントリー価格がログに出力されます。
1 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文の執行
- 10000EURUSD買いの成行注文が成立、ポジションPID14576001
- ポジションエントリー価格 1.19067
- パラメータをカスタマイズできるシンプルなcBot
cBot のプロパティを宣言するときに、[Parameter()] 宣言を使用して、それらをカスタマイズ可能なパラメータにすることができます。cBotの新しいインスタンスが起動されると、これらのパラメータにカスタム値を割り当てることができるようになります。
次の例を考えてみましょう。
1 | [Parameter("SMA Period", DefaultValue = 14)] public int SmaPeriod { get; set; } |
この中では、以下のような特徴を定義しています。
- パラメータ名(“SMA Period”):その後、cTrader UIに表示されます。
- パラメータのデフォルト値 (DefaultValue = 14):
ユーザーによって変更されない限り、すべての新しいインスタンスに適用されます。
以下のコードでは、SmaPeriod プロパティが実際の cBot でどのように使用できるかを示しています。
1 | [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] |
この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 | [Robot(TimeZone = TimeZones.UTC)] |
ログ出力
- 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 | [Robot()] |
ログ出力
- 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 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文の実行
- 10000EURUSD買いの成行注文が成立、ポジションPID14576180
- 部分的なクローズ
前の例を変更して、同じラベル(”myLabel”)の成行注文を2つ作成します。それぞれの新しいバーで、cBot はこれらの注文のちょうど半分を決済しますが、出来高が 20,000 以上の場合に限ります。
また、Positions.FindAll() メソッドも使用します。このメソッドはポジションの配列を返し、それを繰り返し実行できます。
1 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 20000EURUSD買いの成行注文の実行
- 20000EURUSD買いの成行注文が成立、ポジションPID14579299
- 30000EURUSD買いの成行注文の執行
- 30000EURUSD買いの成行注文の執行 SUCCEEDED, ポジション PID14579300
保留中の注文の作成
- 指値注文と逆指値注文の作成
指値注文と逆指値注文は未決済注文ですが、成行注文と同様に作成されます。
ただし、指値注文と逆指値注文を作成する際には、目標価格も指定する必要があり、マーケットレンジはありません。
このcBotは、2つの指値注文と1つの逆指値注文を作成します。
その後、注文を繰り返し、それらのラベルとIDをログに出力します。
1 | [Robot()] |
ログ出力
- 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 | [Robot()] "mySample_cBot", 10, null, midnight, "First"); "mySample_cBot", 10, 10, null, "Second"); |
ログ出力
- 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 | [Robot()] |
ログ出力
- 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 | [Robot()] |
ポジション・イベント
さまざまな取引操作に関連するイベントを「サブスクライブ」することが可能です。
例えば、ポジションがオープンされたかどうかをテストするために、すべてのポジションオブジェクトに対して発生するイベントをサブスクライブします。
トレーダーが手動でポジションをオープンした場合や、他の cBot が自動でポジションをオープンした場合に、イベントが発生します。
1 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文の実行 (SL: 10, TP: 10)
- 10000EURUSD買いの成行注文(SL: 10, TP: 10)成功、ポジション PID14579468
- ポジションは1.19224でオープン
同様に、ポジションがクローズされるたびに発生するイベントをサブスクライブすることも可能です。
1 | [Robot()] |
ログ出力
- 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 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文実行中
- 注文実行中
- 10000EURUSD買いの成行注文が成立、ポジション PID14579532
- 注文の実行
次の例は、同期メソッドと非同期メソッドの違いを強調しています。
cBotは非同期メソッドを呼び出した直後に、操作が実行中かどうかをチェックします。
cBotは、非同期メソッドを呼び出した直後に操作が実行中かどうかをチェックし、同期メソッドを呼び出した後にもう一度チェックします。この2つのアクションのログ出力は異なります。
1 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文実行中
- 注文実行中
- 20000EURUSD買い成行注文実行中
- 10000EURUSD買い成行注文執行中 ポジションPID14579541
- 20000 EURUSD 買い成行注文成立、ポジション PID14579542
- 注文成立
- さらに多くのパラメータを指定した注文の実行
次の cBot は、ラベル (“myLabel”)、保護レベル (10、10)、シンボル (SymbolName)、およびボリューム (10000) を指定して注文を発注します。
この例には、Positions コレクションと FindAll() メソッドも含まれています。Find() および FindAll() を使用して、同じラベル、シンボル、および取引タイプを持つポジションを検索できます。
1 | [Robot()] |
ログ出力
- 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 | [Robot()] |
ログ出力
- 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 | [Robot()] |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文の執行 (TP: 10)
- 10000 EURUSD (TP: 10)の成行買い注文が成立、ポジション PID14579740
- 決済ポジション PID14579300
- 決済ポジション PID14579300 SUCCEEDED, ポジション PID14579300
- cBot「New cBot」がEURUSD, h1で停止しました。
指値注文と逆指値注文を非同期で発注
未決注文の発注は成行注文の発注と似ています。
ただし、この2つの方法の引数には若干の違いがあります。
マーケット・レンジは引数リストにありません。さらに、目標価格を指定する必要があり、注文の有効期限を指定するオプションの引数を渡すことができます。
1 | [Robot()]"myLabel", null, null, expiry);"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 | |
ログ出力
- 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 | [Robot()] |
ログ出力
- 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 | [Robot()] { |
非同期メソッドのコールバック関数
結果が返された後、非同期オペレーションを使用する場合、しばしば実行を制御する必要があります。これを処理するには、すべての非同期メソッドのパラメータリストの最後にコールバック関数を追加します。
この関数は、サーバーからレスポンスを受け取るとすぐに呼び出されます。例えば、ポジションがオープンされたり、変更されたり、クローズされたりしたときに呼び出されます。
- コールバック付き非同期成行注文
1 | [Robot()](TradeType.Buy, SymbolName, 10000, PositionOpened); |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD買いの成行注文の執行
- TradeOperation(10000EURUSD買い成行注文執行 EXECUTING)
- 10000EURUSD買い成行注文成立、ポジションPID14579835
- 取引結果(成功、ポジション:PID14579835)
- ポジション 14579835 1.19414 でオープン
- ラムダ式の使用
コールバックメソッドを定義する代わりに、ラムダ式を使うことができます。以下の例では、注文が入ると、その結果の説明がログに出力されます。
1 | |
ログ出力
- cBot「New cBot」がEURUSD, h1で正常に開始されました。
- 10000EURUSD(価格: 1.19320)買いの指値注文の発注
- 10000EURUSD(価格: 1.19320)買いの指値注文 SUCCEEDED, PendingOrder OID25222083
- 取引結果(成功、未決済注文:OID25222083)
