先ずは
ストラテジー作成に記載されている手順に従って、新規ストラテジークラスを作成します。
概要
指定した通貨ペアの前日の日足データをフェッチし、初回オーダーの方向を決めます。
前日の終値が始値段より大きい場合、ロングオーダーします。小さい場合はショートオーダーします。
リミットクローズでポジションが閉じられた場合、同じ方向で成行オーダーし5pips(tpPipsOnProfit)のリミット設定します。
ストップロスクローズでポジションが閉じられた場合、反対方向でオーダーし10pips(tpPipsOnLoss)のリミット設定します。
設定可能なパラメータ定義
@Configurableアノテーションを使用して、ストラテジーの設定可能なパラメータを定義します。
以下のソースコードは4つの設定可能なパラメータ(通貨ペア・ロット・リミット・ストップロス)を定義します。
engineとhistoryフィールドは、オーダー送信したり、ヒストリーからバーデータをフェッチする為に使用されます。
public class SimpleTpSlStrategy implements IStrategy {
@Configurable("通貨ペア")
public Instrument instrument = Instrument.EURUSD;
@Configurable("ロット")
public double amount = 0.001;
@Configurable("ストップロス")
public int slPips = 10;
@Configurable("リミット(ストップロスクローズ時)")
public int tpPipsOnLoss = 10;
@Configurable("リミット(リミットクローズ時)")
public int tpPipsOnProfit = 5;
private IEngine engine;
private IHistory history;
private IConsole console;
private IContext context;
private IOrder order;
onStartメソッド
onStartメソッドはストラテジー開始時に呼び出されます。
このメソッドで初回オーダーの処理を行います。
以下のソースコードはヒストリーから前日の日足データをフェッチし、初回オーダーの方向と初回オーダーを行います。
submitOrderメソッドは、ストップロスとリミット価格を算出し、新規オーダーを行います。
public class SimpleTpSlStrategy implements IStrategy {
public void onStart(IContext context) throws JFException {
this.engine = context.getEngine();
this.history = context.getHistory();
this.console = context.getConsole();
this.context = context;
context.setSubscribedInstruments(java.util.Collections.singleton(instrument));
IBar prevDailyBar = history.getBar(instrument, Period.DAILY, OfferSide.ASK, 1);
OrderCommand orderCmd = prevDailyBar.getClose() > prevDailyBar.getOpen()
? OrderCommand.BUY
: OrderCommand.SELL;
submitOrder(amount, orderCmd, tpPipsOnLoss);
}
private void submitOrder(double amount, OrderCommand orderCmd, double tpPips) throws JFException {
double slPrice, tpPrice;
ITick lastTick = history.getLastTick(instrument);
if (orderCmd == OrderCommand.BUY) {
slPrice = lastTick.getAsk() - slPips * instrument.getPipValue();
tpPrice = lastTick.getAsk() + tpPips * instrument.getPipValue();
} else {
slPrice = lastTick.getBid() + slPips * instrument.getPipValue();
tpPrice = lastTick.getBid() - tpPips * instrument.getPipValue();
}
order = engine.submitOrder( orderCmd.toString() + System.currentTimeMillis(), instrument, orderCmd, amount,
0, 20, slPrice, tpPrice);
}
onMessageメソッド
onMessageメソッドは新しいメッセージを受信する度に呼び出されます。
以下のソースコードではポジションクローズされた時にのみ処理されるようにフィルタリングします。
またポジションクローズされる度に新しいオーダーをする為に使用します。
public void onMessage(IMessage message) throws JFException {
if (message.getType() != Type.ORDER_CLOSE_OK
|| !message.getOrder().equals(order)
) {
return;
}
console.getInfo().format("%s リミット/ストップによるクローズ %.1f pips", order.getLabel(), order.getProfitLossInPips()).println();
if (message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_TP)) {
submitOrder(amount, order.getOrderCommand(), tpPipsOnProfit);
} else if (message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_SL)) {
OrderCommand orderCmd = order.isLong() ? OrderCommand.SELL : OrderCommand.BUY;
submitOrder(amount, orderCmd, tpPipsOnLoss);
} else {
console.getOut().println("ストラテジー以外の方法でクローズされました。ストラテジーを停止します。");
context.stop();
}
}
サンプルソースコード
サンプルソースコード:
SimpleTpSlStrategy.java