Vayne 发表于 2019-9-17 15:24:21

杜高斯贝自用软件的一个指标

杜高斯贝自用软件JForex Platform一个指标.有没有编程高手看看这个指标的原理?以下附代码:
package com.dukascopy.indicators;

import com.dukascopy.api.DefaultColors;
import com.dukascopy.api.indicators.IIndicator;
import com.dukascopy.api.indicators.IIndicatorContext;
import com.dukascopy.api.indicators.IIndicatorsProvider;
import com.dukascopy.api.indicators.IndicatorInfo;
import com.dukascopy.api.indicators.IndicatorResult;
import com.dukascopy.api.indicators.InputParameterInfo;
import com.dukascopy.api.indicators.IntegerRangeDescription;
import com.dukascopy.api.indicators.OptInputParameterInfo;
import com.dukascopy.api.indicators.OutputParameterInfo;

public class VolatilityQualityIndex1 implements IIndicator {

    private static final int OPEN = 0;
    private static final int CLOSE = 1;
    private static final int HIGH = 2;
    private static final int LOW = 3;
    private static final int VOLUME = 4;

    private IndicatorInfo indicatorInfo;
    private InputParameterInfo[] inputParameterInfos;
    private OptInputParameterInfo[] optInputParameterInfos;
    private OutputParameterInfo[] outputParameterInfos;

    private final double[][][] inputs = new double[][];
    private final double[][] outputs = new double[];

    private IIndicator atr;
    private IIndicator smaShort;
    private IIndicator smaLong;

    @Override
    public void onStart(IIndicatorContext context) {
      indicatorInfo = new IndicatorInfo("VQI", "Volatility Quality Index", "Volatility Indicators", false, false, true, 1, 2, 3);

      inputParameterInfos = new InputParameterInfo[] {
            new InputParameterInfo("Price", InputParameterInfo.Type.PRICE)
      };

      optInputParameterInfos = new OptInputParameterInfo[] {
            new OptInputParameterInfo("Short MA Periods", OptInputParameterInfo.Type.OTHER, new IntegerRangeDescription(9, 2, 2000, 1)),
            new OptInputParameterInfo("Long MA Periods", OptInputParameterInfo.Type.OTHER, new IntegerRangeDescription(200, 2, 2000, 1))
      };

      outputParameterInfos = new OutputParameterInfo[] {
            new OutputParameterInfo("VQI", OutputParameterInfo.Type.DOUBLE, OutputParameterInfo.DrawingStyle.LINE),
            new OutputParameterInfo("VQI Short MA", OutputParameterInfo.Type.DOUBLE, OutputParameterInfo.DrawingStyle.LINE),
            new OutputParameterInfo("VQI Long MA", OutputParameterInfo.Type.DOUBLE, OutputParameterInfo.DrawingStyle.LINE)
      };

      outputParameterInfos.setColor(DefaultColors.OLIVE_DRAB);
      outputParameterInfos.setColor(DefaultColors.RED);
      outputParameterInfos.setColor(DefaultColors.YELLOW);

      IIndicatorsProvider indicatorsProvider = context.getIndicatorsProvider();
      atr = indicatorsProvider.getIndicator("ATR");
      atr.setOptInputParameter(0, 1);
      smaShort = indicatorsProvider.getIndicator("SMA");
      smaLong = indicatorsProvider.getIndicator("SMA");
    }

    @Override
    public IndicatorResult calculate(int startIndex, int endIndex) {
      if (startIndex - getLookback() < 0) {
            startIndex = getLookback();
      }
      if (startIndex > endIndex) {
            return new IndicatorResult(0, 0);
      }

      double[] atrOutput = new double;
      atr.setInputParameter(0, inputs);
      atr.setOutputParameter(0, atrOutput);
      atr.calculate(startIndex - Math.max(smaShort.getLookback(), smaLong.getLookback()), endIndex);

      double[] smaInput = new double;
      double prevVqi = 0;

      for (int i = startIndex - Math.max(smaShort.getLookback(), smaLong.getLookback()), j = 0; i <= endIndex; i++, j++) {
            double vqi = ((atrOutput != 0) && (inputs != inputs) ?
                  (inputs - inputs / atrOutput +
                  (inputs - inputs) / (inputs - inputs)) / 2 : prevVqi);

            smaInput = (j > 0 ? smaInput : 0) +
                  Math.abs(vqi) * (2 * inputs - inputs - inputs) / 2;

            prevVqi = vqi;
      }

      for (int i = Math.max(smaShort.getLookback(), smaLong.getLookback()), j = 0; i < smaInput.length; i++, j++) {
            outputs = smaInput;
      }

      smaShort.setInputParameter(0, smaInput);
      smaShort.setOutputParameter(0, outputs);
      smaShort.calculate(Math.max(smaShort.getLookback(), smaLong.getLookback()), smaInput.length - 1);

      smaLong.setInputParameter(0, smaInput);
      smaLong.setOutputParameter(0, outputs);
      smaLong.calculate(Math.max(smaShort.getLookback(), smaLong.getLookback()), smaInput.length - 1);

      return new IndicatorResult(startIndex, endIndex - startIndex + 1);
    }

    @Override
    public IndicatorInfo getIndicatorInfo() {
      return indicatorInfo;
    }

    @Override
    public InputParameterInfo getInputParameterInfo(int index) {
      if (index < inputParameterInfos.length) {
            return inputParameterInfos;
      }
      return null;
    }

    @Override
    public OptInputParameterInfo getOptInputParameterInfo(int index) {
      if (index < optInputParameterInfos.length) {
            return optInputParameterInfos;
      }
      return null;
    }

    @Override
    public OutputParameterInfo getOutputParameterInfo(int index) {
      if (index < outputParameterInfos.length) {
            return outputParameterInfos;
      }
      return null;
    }

    @Override
    public void setInputParameter(int index, Object array) {
      inputs = (double[][]) array;
    }

    @Override
    public void setOptInputParameter(int index, Object value) {
      switch (index) {
      case 0:
            int shortPeriod = (Integer) value;
            smaShort.setOptInputParameter(0, shortPeriod);
            break;
      case 1:
            int longPeriod = (Integer) value;
            smaLong.setOptInputParameter(0, longPeriod);
            break;
      default:
            throw new ArrayIndexOutOfBoundsException(index);
      }
    }

    @Override
    public void setOutputParameter(int index, Object array) {
      outputs = (double[]) array;
    }

    @Override
    public int getLookback() {
      return atr.getLookback() + Math.max(smaShort.getLookback(), smaLong.getLookback());
    }

    @Override
    public int getLookforward() {
      return 0;
    }
}


页: [1]
查看完整版本: 杜高斯贝自用软件的一个指标