条件付きオーダーのストップロスとリミットは、IOrderオブジェクトでメインオーダー確認する事が重要です。
ストップロスやリミットオーダーにヒットしている可能性があるからです。
これは以下の事が言えるからです。
- ストップロス価格とリミット価格をゼロ以外の設定でメインオーダーを送信すると、ストップロスとリミットのオーダーが自動的に作成されます。
- ストップロスやリミット価格にヒットすると、メインオーダーはクローズされ他の条件付きオーダーはキャンセルされます。
(例えば、ストップロスがヒットしたらリミットオーダーはキャンセルされる)
- メインオーダーをクローズすると、条件付きオーダーは全てキャンセルされます。
ストップロス価格の設定方法は2つあります。
・オーダー作成時にストップロス価格を設定する方法
engine.submitOrder(
"order",
Instrument.EURUSD,
OrderCommand.BUY,
0.001,
0,
20,
1.2222,
0,
);
・作成済みオーダーを変更する方法
order.setStopLossPrice(1.2222);
既存のオーダーにストップロスを設定
ストップロス価格設定のオーダーをするには、以下の条件を満たしていなければなりません。
- オーダー状態はFILLEDまたは、OPENEDである必要があります。
- ストップロス価格は0.1pipsで割り切れる値である必要があります、割り切れない場合は拒否されます。
- ストップロス価格の設定は1秒間に1回しか設定出来ません。
IOrderインターフェースは既存オーダーのストップロス設定やストップロス変更の為の3つのメソッド(オーバーライドメソッドなのでメソッド名は同じ)を持っています。
void setStopLossPrice(double price)
IOrder order = engine.getOrder("order");
order.setStopLossPrice(
1.2222
);
void setStopLossPrice(double price, OfferSide side)
IOrder order = engine.getOrder("order");
order.setStopLossPrice(
1.2222,
OfferSide.ASK
);
void setStopLossPrice(double price,OfferSide side, double trailingStep)
IOrder order = engine.getOrder("order");
order.setStopLossPrice(
1.2222,
OfferSide.BID,
20
);
注意:トレーリングステップのパラメータ値は、10以上である必要があります。
ストップロスの取り消し
ストップロス価格にゼロを指定した場合、ストップロス条件は適用されません。
次の例では、既存のオーダーからストップロス条件を削除します。
IOrder order = engine.getOrder("order");
order.setStopLossPrice(
0
);
ストップロスによるクローズ検出
ストップロス条件によってオーダーがクローズされた事を検出する為には、IStrategy.onMessageを確認し、
IMessage.getReasons()にIMessage.Reason.ORDER_CLOSED_BY_SLが含まれているかチェックします。
messagesのワークフローの詳細はオーダー状態のページを参照して下さい。
以下例では、ストップロスによるクローズと他要因によるクローズをチェックします。
@Override
public void onStart(IContext context) throws JFException {
console = context.getConsole();
engine = context.getEngine();
history = context.getHistory();
context.setSubscribedInstruments(java.util.Collections.singleton(instrument), true);
IOrder order = engine.submitOrder("orderCloseBySL", instrument, OrderCommand.BUY, 0.001);
order.waitForUpdate(2000, IOrder.State.FILLED);
double slPrice = history.getLastTick(instrument).getAsk() + instrument.getPipValue() * 10;
order.setStopLossPrice(slPrice);
order = engine.submitOrder("orderUnconditionalClose", instrument, OrderCommand.BUY, 0.001);
order.waitForUpdate(2000, IOrder.State.FILLED);
order.close();
}
@Override
public void onMessage(IMessage message) throws JFException {
IOrder order = message.getOrder();
if (order == null) {
return;
}
console.getOut().println(message);
if (message.getType() == IMessage.Type.ORDER_CLOSE_OK) {
if (message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_SL)) {
console.getInfo().println(order.getLabel() + " ストップロスによるクローズ");
} else {
console.getInfo().println(order.getLabel() + " ストップロス以外によるクローズ");
}
}
}
サンプルソースコード:
Stoploss_OrderClosedBySL.java
サンプル【ストップロスの管理】
このサンプルでは以下の順序で特定のオーダーのストップロスを管理します。
- オーダー作成時にストップロスを追加する
- 既存のオーダーにストップロスを追加する
- ストップロスを削除する
- ストップロスを変更します。
サンプルソースコード:
ManageSL.java
サンプル【ストップロスの追跡】
このサンプルでは以下のオーダーを行います
- tick受信毎にストップロスとリミットを、現在のマーケット価格から一定価格離した状態に更新します。
- 最初のストップロスとリミット価格のラインをチャート上に描画します。
- 現在のマーケット価格が、最初のストップロスとリミット価格のいずれかを抜けたらログ出力します。
サンプルソースコード:
SlTpUpdateWithOrigLines.java
サンプル【ブレークイーブン】
含み益が5pipsに到達したら、ストップロス価格をエントリー価格に移動します。
サンプルソースコード:
BreakEven.java
サンプル【手動によるブレークイーブン調整】
ブレークイーブンレベルでチャート上にライン描画します、ユーザーが手動でチャート上のラインを移動してレベル調整する事が出来ます。
サンプルソースコード:
BreakEvenHLine.java
サンプル【複数オーダーのブレークイーブン】
複数のオーダーに同じブレークイーブンロジックを適用します。
サンプルソースコード:
BreakEvenMultipleOrders.java
サンプル【トレーリングストップ追跡】
トレーリングストップによるストップロス変化の追跡を行います。
ストラテジーで両方向の2つのオーダーを作成し、一つはストップロスでクローズされるようにし、もう一つはトレーリングステップでストップロスが更新されるようにします。
また、ストップロス更新回数をカウントします。
サンプルソースコード:
TrailingStepTest.java