cTraderではポジションの分割決済ができる!
MT4よりcTraderの方が優れてる機能の一つとしてポジションの分割決済が挙げられます。
cTraderでの分割決済のやり方
分割成り行き決済
例えば1lotのEUR/USDのポジションを持ってたとして、一部だけ決済したい場合、ポジション一覧で右クリックしてポジション変更を選択して
このボリュームのところに残したい量を入力して緑のボタンを押せば一部決済が可能です。
注意点としては入力するのは決済したい量ではなく、「残したい量」です。あくまで「ポジションの変更」なので。(ちなみにこの画面からポジションの売り買い方向を変えてドテンすることもできます。)
分割利確決済
分割成り行き決済であればMT4でも可能ですが、こっちのTPを指定しての分割利確はcTraderでしかできなかったと思います。まぁcTraderを起動しっぱなしにしておかなければいけないという制限はありますが、外部プログラム不要でできるのは利点でしょう。
ポジション一覧で右クリック、「ポジション変更」を選んだら、盾マークをクリックします。
高度な利食い(Advanced Takeprofit)の設定画面が出るため、ここで何Pipsでどのくらいの量を決済するというのを設定できます。
まぁ価格じゃなくてpipsで指定しないといけなかったり、残り数量とボリュームの単位があってなかったり、微妙に使いにくいのですが一応機能としてはあるということで・・・
残念ながら損切り側は分割の設定はできませんが、以前紹介した通り「高度な損切り」設定ではブレークイーブンへの移動設定ができるようになってます。
-
【cTrader】一度利益が出たら負けは認めない【Tools】
損失回避! せっかくポジションが含み益抱えたと思ったのに、気づいたら反転して負けてたなんて悔しい思い、FXトレーダーなら誰もが一度は味わったことあるのではないでしょうか。 一度利益が出たポジション、反 ...
続きを見る
もちろんcBotからも分割決済可能
「いやいや使いにくいんだわ!だったら専用のcBotでも作るわ!」という方もいるでしょう。
そんな方のためにcBotから分割決済するためのサンプルコードも載せておきます。
分割決済サンプルコード
こんなメソッドを用意してみました。
//----------------------------------------------------------------------------------
// 一部決済メソッド
// positionがtargetPips以上利益になってたらvolumeRate分だけ一部決済する
// 一部決済したらtrueを返す。条件未達、もしくは決済に失敗したらfalseを返す
private bool PartialClose(Position position, double targetPips, double volumeRate) {
// --- positionにtargetPips分だけ利益がのってたら
if (position.Pips >= targetPips) {
// --- 決済すべきボリュームを求めて
var closeVol = Symbol.NormalizeVolumeInUnits(position.VolumeInUnits * volumeRate);
if (closeVol == position.VolumeInUnits) {
// --- 残り全部だったら全決済してcBot止める
var res = position.Close();
if (res.IsSuccessful) {
Print("Position(ID:{0}) が全決済されました。cBotを終了します。", position.Id);
Stop();
}
} else {
// --- 一部決済
var res = ClosePosition(position, closeVol);
if (res.IsSuccessful) {
Print("Position(ID:{0}) のうち、一部 {1} lot決済されました。", position.Id, Symbol.VolumeInUnitsToQuantity(closeVol));
return true;
}
}
}
return false;
}
コメントの通りなんですが、対象のポジションと目標Pipsを渡してあげると、判定して指定割合だけ一部決済してくれます。
分割決済部分は19行目のClosePosition(position, closeVol);の部分です。Position.Close()ではなくて、Robotが持つメソッドのClosePositionを使って、決済ボリュームを引数で渡してあげるというところがポイントですね。
ポジションを全決済した場合はPosition.VolumeInUnitsの値はエントリー時のボリュームがそのまま残るのですが、一部決済した場合は「ポジションの変更」扱いとなるため、Position.VolumeInUnitsの数値が変化します。
決済済みのポジションオブジェクトを使うcBotを作る際は注意してください。
cTraderとMT4の違い
MT4でもEA内でポジションの一部決済は可能ですが、MT4の場合、プログラム上ではポジション自体は一旦なくなり、新しく残りのLot数のポジションが新しいIDで生成されるような挙動を示します。
しかしcTraderの場合は「ポジションの変更」なのでIDは変わらず、ポジション内でVolumeが変更となる挙動を示します。(このため、上記の一部決済後もpositionオブジェクトをそのまま続けて使用することができます。)
普通なら全く気にする必要のない細かい違いですが、IDを覚えておいてポジション操作するようなプログラムを作成する場合、MT4とcTraderで同じ感覚でいると思わぬバグにつながることになるため、注意が必要です。
サンプルcBot : SplitCloser
これだけだとイメージがわかないと思うので、簡単なサンプルcBotも用意しました。
ポジションを一つ持ってる状態で起動すると、StepPipsパラメータで指定したPipsごとに半分決済するだけのcBotです。
たとえば110.00でドル円を1lot買った状態で、StepPips = 10Pipsで起動すると、110.10で0.5lot決済、110.20で0.25lot決済、110.30で0.125lot決済・・・というように動きます。
実用性はほぼ皆無だと思いますが、分割決済のサンプルコードとしてご利用ください。
(2022/7/29 更新 少し機能追加しました)