発注できなきゃ始まらない
これを読んでくれてる皆さんはcBotで自動売買システムを作りたいという方が多いと思います。であれば絶対必要なのは発注処理。ここではcAlgoの発注メソッドの使い方について説明していきます。
まず共通の話として発注メソッドはすべてRobotインターフェース、つまりcBot本体クラスのメンバとして用意されています。つまりOnBar()やOnTick()内ではメソッド名だけで呼び出し可能です。ではどんなメソッドが用意されているのか見ていきましょう。
やたらと多い注文の種類
さて、cTraderからRobotクラスのヘルプを眺めてると大量に注文関係のメソッドがあることに気づくと思います。同じ名前のものも含めるとその数なんと108種類。煩悩の数だけ注文がある。もうここでいきなりあきらめたくなりますが、実はたいしたことありません。
同じ名前はオーバーロードメソッド
同じ名前のものは引数が違うだけです。例えばExecuteMarketOrderであれば
public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume);
public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label);
public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips);
public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment);
public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment, bool hasTrailingStop);
public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment, bool hasTrailingStop, StopTriggerMethod? stopLossTriggerMethod);
と6種類のオーバーロードメソッドがあります。
なんてことはありません、必要なところまで指定すればいいだけです。注意点としてはストップロスまで指定して括弧閉じ、ってのはできません。6種類のどれかの形は満たす必要があります。
//ExecuteMarketOrder(TradeType.Buy, SymbolName, volume, label, stop); //これはダメ。コンパイルエラー
ExecuteMarketOrder(TradeType.Buy, SymbolName, volume, label, stop, null); //TakeProfit指定しないならばnullを入れる。
他のメソッドも同じ名前のものはオーバーロードされてるだけで機能は全く同じですので、一番引数が多いもの一つわかってればすべてわかってるようなもんです。(厳密にはModify系は若干違うものもありますがあまり使わないので気にしないでいいです。)これで残り20個、一気に減りましたがまだ多いですね。
Asyncがついてるかついてないか
残りを見てみると同じ名前でお尻にAsyncがついてるやつとついてないやつが10組あるだけです。Asyncがついてる方は非同期型メソッド、ついてないのは同期型メソッドです。
非同期型メソッドは非同期で注文を送るため、結果が返ってくるのを待たずに次のコードを実行できます。そのため連続で注文を送るときは非同期注文を使った方がタイムラグが少ないというメリットがあります。反面、その場で注文結果がわからないため、結果を確認したい場合はcallbackを指定するなり少し面倒というのはデメリットです。
非同期型メソッドは同期型メソッドの引数に(Action<TradeResult>) callbackが追加で指定できるようになっています。また、メソッド自体の返り値はTradeResultではなくてTradeOperationとなります。それ以外は同じです。深く考えずにいつもは同期型、連続発注時は非同期型って使い分けでいいです。
つまり注文の種類は実質10種類。残りは2つに分けて説明します。エントリーするための注文5種類と修正や決済のための注文5種類です。
エントリーするための注文
エントリーするための注文はExecute~Orderの名前がついてる即時注文2種類とPlace~Orderの名前の待機注文3種類に分けられます。具体的な使い方はcAlcoの発注メソッド(2)と(3)で解説しますのでここでは簡単に紹介するだけにとどめます。
ExecuteMarketOrder
普通の成行注文。価格は指定せずにマーケットの価格で約定します。多分一番よく使います。
ExecuteMarketRangeOrder
価格を指定する成行注文。絶対この価格以上で約定してくれないと困る!ってときに。不利方向へのSlipageが指定できます。
PlaceLimitOrder
指値注文を入れます。指定した価格で注文が執行されます。
PlaceStopOrder
逆指値注文を入れます。指定した価格に到達し次第、マーケット価格で成行注文が入ります。
PlaceStopLimitOrder
ストップリミット注文を入れます。指定した価格に到達し次第、価格指定の成行注文が入ります。スリッページが指定できる逆指値注文と考えてください。
決済や修正のための注文
すでにでてる注文や持ってるポジションを操作するタイプの注文です。実際に使うときははPendingOrderやPositionインターフェースから呼び出す方が多く、Robotのメンバとしてこの形で使うことは少ないため、これ以上の解説は省きます。
ModifyPosition
ポジションを修正します。ストップロス、テイクプロフィット、トレールの有無、果ては数量まで修正できますが、わかりにくいのでPositionクラスのModify~系のメソッドを使うことをお勧めします。全く同じです。(StopTriggerMethodだけはここからしか修正できませんが、まぁ修正することないでしょ)
ModifyPendingOrder
予約注文を修正します。上記同様PnedingOrderインターフェースからModify~系メソッドを呼び出しましょう。
CancelPendingOrder
予約注文をキャンセルします。かわりにPendingOrderインターフェースからCancel()を使いましょう。
ClosePosition(Position position, long volume)
ポジションを決済します。volume指定で一部決済もできます。volume指定しなければ全量決済になります。全量決済はPositionインターフェースのClose()使うことの方が多いです。一部決済だけはこのメソッドを直接使うしかないんで、一応パラメータ載せときます。
ReversePosition
ポジションの方向を逆向きにします。要はドテンします。実際は決済&エントリーという形になります。volume指定してすると、全決済後、volumeだけ逆向きポジションを取ります。PositionインターフェースからReverse(...)という名前で呼び出せます。
Robotのメンバとしておさえるべきは5種類だけ
修正だの決済だのはPendingOrderかPositionインターフェースから使った方がいいので、Robotメンバから使うメソッドとして理解しておけばいいのは新規発注の5種類だけです。
この5種類はほとんど同じ構造をしてるので、一つ使い方がわかってしまえばあとは簡単です。では次の記事では代表として一番使用頻度の高いExecuteMarketOrderメソッドの使い方を学んでいきましょう。→cAlgoの発注メソッド(2)へ