トップ  >  リファレンス  >  ストラテジーAPI  >  シンプルストラテジー
シンプルストラテジー


先ずはストラテジー作成に記載されている手順に従って、新規ストラテジークラスを作成します。

概要

指定した通貨ペアの前日の日足データをフェッチし、初回オーダーの方向を決めます。
前日の終値が始値段より大きい場合、ロングオーダーします。小さい場合はショートオーダーします。
リミットクローズでポジションが閉じられた場合、同じ方向で成行オーダーし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



スポンサーリンク

スポンサーリンク
検索
リファレンスツリー


Copyright ©2016 JForexAPIで自動売買させ隊! All Rights Reserved.


Top

inserted by FC2 system