単純移動平均によるトレード


このチュートリアルパートではSMAインジケータを使ったトレードをするストラテジーを紹介します。
SMAインジケータで上昇トレンドの時に買い、下降トレンドの時に売ります。

前回作成したストラテジーを利用し、SMA(単純移動平均)インジケータを追記します。

ストラテジーの内容は、最後に確定した2本バー(1つ前のバーと、2つ前のバー)のSMAインジケータの値を使用し、
その値に応じて売買の判断を行います。

SMAメソッドのパラメータでローソク足間の取得方法を指定します。
インジケータ算出のローソク足間については、インジケータ算出の項目参照。


onBarメソッドに新しいコードを実装する為の準備をします。
SMAメソッドの為に時間軸設定と、SMAメソッドが返す配列参照の為の定数が必要です。



@Configurable( "SMA期間" )
public int smaTimePeriod = 30;

private static final int PREV = 1;
private static final int SECOND_TO_LAST = 0;

private void printMe(String toPrint){
    console.getOut().println(toPrint);
}




onBarメソッドに以下コードを追記します。


public void onBar( Instrument instrument, Period period, IBar askBar, IBar bidBar ) throws JFException {    

    // 通貨ペアと時間軸でフィルタリング
    if (!instrument.equals(myInstrument) || !period.equals(myPeriod)) {
        return; // 終了
    }                

    IEngine.OrderCommand myCommand = null;
    int candlesBefore = 2, candlesAfter = 0;

    // SMAの最後の確定バーと、最後から2つ目の確定バーを取得
    previousBar = myOfferSide == OfferSide.ASK ? askBar : bidBar;
    long currBarTime = previousBar.getTime();
    double sma[] = indicators.sma(instrument, period, myOfferSide, IIndicators.AppliedPrice.CLOSE,
            smaTimePeriod, Filter.NO_FILTER, candlesBefore, currBarTime, candlesAfter);


    // 後で結果とチャートを比較出来るようにメッセージ出力します。
    // SMAが上昇トレンドなら買いオーダーを行います。
    // SMAが下降トレンドなら買いオーダーを行います。

    printMe( String.format("SMAの値: 2つ前 = %.5f; 1つ前 = %.5f", sma[SECOND_TO_LAST], sma[PREV]));        
    if( sma[PREV] > sma[SECOND_TO_LAST]){
        printMe("SMA上昇"); // インジケータが上昇している
         myCommand = IEngine.OrderCommand.BUY;
    } else if ( sma[PREV] < sma[SECOND_TO_LAST]){
        printMe("SMA下降"); // インジケータが下降している
        myCommand = IEngine.OrderCommand.SELL;
    } else {
        return;
    }


    // ポジションをチェックしオーダー済みポジションがあるかチェックします。
    // ポジションがある場合はmyCommandと同じ方向のオーダーかチェックします。
    // 同じ方向のオーダーの場合は何もしません。
    // 異なる方向のオーダー(SMAトレンドが変わった)の場合はポジションをクローズして、新たにオーダーします。

    order = engine.getOrder("MyStrategyOrder");                      
    if (order != null && engine.getOrders().contains(order) && order.getOrderCommand() != myCommand){
        order.close();
        order.waitForUpdate(IOrder.State.CLOSED); // ポジションがクローズされるまで待ちます
        console.getOut().println( order.getLabel() + " ラベルのポジションをクローズしました");            
    }

    // 新規オーダーの場合は、または同じラベルのポジションが存在しない場合は、 新規オーダーを行います。
    if ( order == null || !engine.getOrders().contains(order) ){
        engine.submitOrder("MyStrategyOrder" , instrument, myCommand, 0.001);
    }

}



サンプルソースコード:SMASampleTrade.java


作成したストラテジーのテストを行います。
チャートを開いたら、ストラテジーのパラメータで設定する時間軸と同じ時間軸にチャート設定します。
このテストでは次のパラメータを使用します。





  ボタンをクリックしてチャートにSMAインジケータを追加します。
"検索"欄に"SMA"と入力し、左のツリーから"Common" ⇒ "Overlap Studies"を選択し、"Simple Moving Average"を選択します。
インジケータを選択したら、次のように設定します。




チャート上で最後の2つの確定したバーで判定されている事が確認出来ます。
SMAトレンドラインが変化する度に売買される事が確認出来ます。



続いて、Strategyタブで出力メッセージを確認します。
SMAインジケータの算出値とオーダーメッセージを確認出来ます。




インジケータ算出の詳細については、インジケータ算出の項目を参照して下さい。



スポンサーリンク

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


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


Top

inserted by FC2 system