基本の発注メソッド-ExecuteMarketOrder
前回の記事では発注メソッドがいっぱいあるとかあおっておいてなんですが、cAlgoでの発注はぶっちゃけこれ一つでだいたいどうにかなります。
ExecuteMarketOrder
基本的な発注メソッド。いわゆる成行注文を送信します。
public TradeResult ExecuteMarketOrder(TradeType tradeType,
string symbolName,
double volume,
string label,
double? stopLossPips,
double? takeProfitPips,
string comment,
bool hasTrailingStop,
StopTriggerMethod? stopLossTriggerMethod)
返り値 ->TradeResult
発注が完了したかのチェックしたり、発注したポジションを取得するために使います。
パラメータ
(TradeType) tradeType
TradeType.BuyかTradeType.Sellのどちらかを指定します。
(string) symbolName
通貨ペア名を文字列で渡します。そのチャートの通貨ペアであればSymbolNameプロパティをそのまま渡すだけです。
(double) volume
発注する通貨量。Lot数ではなく通貨量なので注意してください。1000通貨なら1000、10万通貨なら100000と数字をそのまま渡します。SymbolのメンバQuantityToVolumeInUnitsでLot数からvolumeに変換できます。
必須のパラメータはここまでです。
(string) label
発注のラベルを指定します。MT4でいうマジックナンバーみたいなものですが、数字ではなく文字列で指定します。
(double?) stopLossPips
ストップロスをPipsで指定します。ストップロスいれない場合はnullで。
(double?) takeProfitPips
テイクプロフィットをPipsで指定します。いれない場合はnullで。
おそらくよく使うのはここまでです。
(string) comment
コメントを指定します。個々のトレードに発注時点でコメントをつけたいときに。
(bool) hasTralingStop
トレールするかどうか指定します。trueだと勝手にストップロスが動きます。デフォルトはもちろんfalse。
(StopTriggerMethod?) stopLossTriggerMethod
ストップロスの執行方式を指定します。テイクプロフィットには影響しません。基本指定しなくていいです。
サンプルコード
// EURUSDを1万通貨、買い注文
var res = ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000);
// 失敗したらエラーを出力
if (!res.IsSuccessful) {
Print(res.Error.ToString());
}
// このチャートの通貨ペアを1Lot売り注文
ExecuteMarketOrder(TradeType.Sell, SymbolName, Symbol.QuantityToVolumeInUnits(1));
// ラベルつけて、20pipsストップロスいれてテイクプロフィットはいれない
ExecuteMarketOrder(TradeType.Sell, SymbolName, Symbol.QuantityToVolumeInUnits(1), "MyLabel", 20.0, null);
このコードを実行すると注文が3つ入るはずです。間違ってもOnTick内に貼り付けないように。ものすごい勢いで発注が入ってしまいます。いずれにせよ、デモ口座かバックテストで試しましょう。
ExecuteMarketOrderAsync
Async付きは非同期発注バージョンです。非同期と言われてもよくわからない場合は、2つ以上の発注を同時に送りたい場合はこっちを使う、くらいの判断基準でいいです。
ExecuteMarketOrderだと最初の発注完了をまってから次の発注に進むため、タイムラグが生じてしまいますが、ExecuteMarketOrderAsyncであれば結果を待たずに次の発注を送るため、ほぼ同時に発注を送ることが可能となります。
public TradeOperation ExecuteMarketOrderAsync(TradeType tradeType,
string symbolName,
double volume, string label,
double? stopLossPips,
double? takeProfitPips,
string comment,
bool hasTrailingStop,
StopTriggerMethod? stopLossTriggerMethod,
[optional] Action callback)
返り値->TradeOperation
送った発注の状態を保持したTradeOperationを返します。けど、返り値はあまり使わないです。発注の成否を確認したければcallbackでやる方がスマートです。
引数
ExecuteMarketOrderの引数と同じ。発注完了時になんらかの処理が必要な場合にコールバックを渡すことができる引数が追加されてます。
(Action<TradeResult>) callback
発注完了時に呼び出す処理を渡します。
サンプルコード
Action<TradeResult> callback = (res => Print(res.IsSuccessful ? "成功!" : "失敗..."));
Print("発注送るよ");
ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, "label", null, null, callback);
Print("発注送ったよ!");
1行目は発注結果が来たら結果を表示するcallbackを作ってます。このコードを実行すると
発注送るよ
発注送ったよ
成功
の順で表示され、発注結果が返ってくる前に5行目まで先に実行されてから、発注結果がきてcallbackが呼ばれたということがわかると思います。
上記のような単発での発注ならAsyncを使う意味はあまりないのですが、実際にはこんな感じで使います。
// 10pips刻みでストップロスとテイクプロフィットをずらして10個のポジションをほぼ同時にとる
double pips = 0;
for(int i=0; i<10; i++) {
pips += 10;
ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, "label", pips, pips);
}
ストップロスとテイクプロフィットを散らして、ポジションを10個に分けてエントリーするコードです。
このコードをAsyncを付けた場合と消した場合と比べてみると、非同期実行の効果がわかると思います。
試す際は必ずデモ口座でやってくださいね!