ドキュメント

アプリケーション

最終更新日:2020年5月27日(マーク・フリック)

インジケーターとシグナルの追加

StrategyQuantには、組み込みの機能を使用して、新しいインジケーターやシグナルブロックを追加することができます。 コードエディタ.

SQコードエディター

 

StrategyQuantのすべてのインジケーターとシグナルはJavaスニペットとして実装されており、ソースコード全体が公開されています。.

一般的に言って:

  • すべてのインジケーターは実装しなければならない OnBarUpdate() メソッド – ここに実際のインジケーターのアルゴリズムがあります。.
  • すべてのシグナルは、trueまたはfalseを返すOnBlockEvaluate()メソッドを実装する必要があります

これらのメソッドはすべてのバーで呼び出され、インジケーターやシグナルは最新の値のみを計算して出力バッファに格納する必要があります。.

インジケーターやシグナルブロックには、期間やチャートなどのパラメータがあります。SQスニペットでは、これらを表現するために「@」アノテーションを使用し、これらのパラメータは標準的なJavaクラスの変数として定義されます。.

 

ブロック注釈の例

注釈では、ブロックの名前とタイプ、およびどの変数がインジケーターパラメータで、どれが計算値のバッファであるかを定義しています。.

勢い

@BuildingBlock(name="(MO) モメンタム", display="モメンタム(#Period#)[#Shift#]", returnType = ReturnTypes.Number)
@Indicator(oscillator=true, middleValue=100, min=96, max=104, step=0.1)
public class Momentum extends IndicatorBlock {

    @Parameter(defaultChartIndex=0)
    public DataSeries Input;
    
    @Parameter(defaultValue="14")
    public int Period;

    @Output(name = "Momentum", color = Colors.Red)
    public DataSeries Value;

 

モメンタムはレベル(シグナルブロック)よりも低い

@BuildingBlock(name="モメンタムがレベルを下回っている", display="モメンタム(#Period#) < #Level#", returnType = ReturnTypes.Boolean)
public class MomLower extends ConditionBlock {
    
    @Parameter
    public DataSeries Input;
    
    @Parameter(defaultValue="14", minValue=2, maxValue=10000, step=1)
    public int Period;

    @Parameter(defaultValue="0", minValue=0, maxValue=200, step=0.01, builderMinValue=96, builderMaxValue=104, builderStep=0.1)
    public double Level;

    @Parameter
    public int Shift;

 

 

インジケーターの OnBarUpdate() メソッドの例

以下にいくつかのインジケーターの例を示しますが、ほとんどの場合、SQアーキテクチャのおかげでコードは非常にシンプルです。すべてのバーですべての値を計算する必要はなく、最後のバーの値だけで十分です。.

勢い

protected void OnBarUpdate() throws TradingException {
    if(CurrentBar == 0) {
        Value.set(0, 0);
    } else {		
        Value.set(0, Input.get(0) * 100.0 / Input.get(Math.min(Period, CurrentBar)));
    }
}

 

ATR

protected void OnBarUpdate() throws TradingException {
    double curHigh = Chart.High.get(0);
    double curLow = Chart.Low.get(0);
    double trueRange = curHigh - curLow;
    
    if (CurrentBar == 0){
        Value.set(0, trueRange);
    }
    else {
        double prevClose = Chart.Close.get(1);
        trueRange = Math.max(Math.abs(curLow - prevClose), Math.max(trueRange, Math.abs(curHigh - prevClose)));
        
        Value.set(0, ((Math.min(CurrentBar + 1, Period) - 1 ) * Value.get(1) + trueRange) / Math.min(CurrentBar + 1, Period));
    }
}

 

CCI

protected void OnBarUpdate() throws TradingException {
    averageCalculator.onBarUpdate(Input.get(0), CurrentBar);
    
    if (CurrentBar == 0) {
        Value.set(0, 0);
    } 
    else {
        double mean = 0;
        double sma = averageCalculator.getValue();
        
        for (int idx = Math.min(CurrentBar, Period - 1); idx >= 0; idx--) {
            mean += Math.abs(Input.get(idx) - sma);
        }
        
        if(mean < 0.0000000001) {
            Value.set(0, 0);
        } else {
            double cci = (Input.get(0) - sma) / (mean == 0 ? 1 : (0.015 * (mean / Math.min(Period, CurrentBar + 1))));
            Value.set(0, cci);
        }
    }
}

CCIが追加のヘルパー・クラスであるAverageCalculatorを使用していることがわかります。このクラスの完全なソースコードも、スニペットSQ/Calculators/AverageCalculator.javaで利用可能です。

 

Signals OnBlockEvaluate() メソッドの例

CCIが水準より高い

シグナルのコードはインジケーターのものよりもはるかにシンプルです。通常、インジケーターの値を取得し、それを他の何かと比較することだけで構成されています。.

public boolean OnBlockEvaluate() throws TradingException {
    CCI indicator = Strategy.Indicators.CCI(Input, Period);
    double value1 = indicator.Value.getRounded(Shift, 4);
    
    return (value1 > Level);
}

 

 

ステップ・バイ・ステップの例

詳細については、以下のステップバイステップの例をご確認ください。

 

この記事は参考になりましたか? この記事は役に立った この記事は役に立たなかった

0 コメント
最古の
最新 最も投票された