今回は、JForex APIで保有ポジションをクローズする方法に関して解説します。
ポジションをクローズするために、以下の2種類のインターフェースを使用することができます。
- IOrderインターフェースのclose関数
- IEngineインターフェースのcloseOrders関数
IOrder.closeでポジションを決済する
IOrderインターフェースには、以下の4種類のclose関数が用意されています。
- void close()
- void close(double amount)
- void close(double amount, double price)
- void close(double amount, double price, double slippage)
void close()
指定オーダーに関するすべての数量を現在のマーケット価格で決済できます。
1 2 |
IOrder order = engine.getOrder("orderLabel"); order.close(); |
void close(double amount)
現在のマーケット価格でデフォルトスリページを使用して、指定された数量のポジションを決済できます。
1 2 3 |
IOrder order = engine.getOrder("orderLabel"); double amount = 0.01; order.close(amount); |
void close(double amount, double price)
デフォルトスリページを使用し、価格、数量を指定してポジションを決済できます。
1 2 3 4 5 |
IOrder order = engine.getOrder("orderLabel"); double amount = 0.01; double lastBid = history.getLastTick(Instrument.USDJPY).getBid(); double price = lastBid - 100 * Instrument.USDJPY.getPipValue(); order.close(amount,price); |
void close(double amount, double price, double slippage)
価格、数量、スリッページを指定してポジションを決済できます。
1 2 3 4 5 |
IOrder order = engine.getOrder("orderLabel"); double amount = 0.01; double lastBid = history.getLastTick(Instrument.USDJPY).getBid(); double price = lastBid - 100 * Instrument.USDJPY.getPipValue(); order.close(amount,price,5); |
IEngine.CloseOrdersでポジションを決済する
IEngineインターフェースのCloseOrders関数を使用すれば複数のポジションをクローズすることができます。
IEngineインターフェースには、以下の2種類のCloseOrders関数が用意されています。
void closeOrders(IOrder… orders)
引数にクローズしたいIOrderオブジェクトを複数指定することで、一度に複数のポジションをクローズできます。
1 |
engine.closeOrders(engine.getOrder("order1"), engine.getOrder("order2"), engine.getOrder("order3")); |
void closeOrders(Collection<IOrder> orders)
引数にIOrderのコレクションを渡すことでも複数クローズが可能です。
1 |
engine.closeOrders(engine.getOrders()); |
ポジションクローズにおける注意点
同一オーダーに対して毎秒1つ以上のclose要求を送信することは制限されます。
「IOrder.getClosePrice() 」と「IOrder.getCloseTime()」で取得できる情報は最後にクローズしたオーダーの情報のみとなります。
つまり、ポジションの一部をクローズ(partial close)した場合は最後にクローズした情報のみ読み出せます。
通常、ポジションをクローズする際は、以下のようにオーダー状態を確認することが推奨されます。
1 2 3 |
if(order.getState() == IOrder.State.FILLED || order.getState() == IOrder.State.OPENED){ order.close(); } |
コメント