Status changed from New to Waiting for information
package SQ.Blocks.Indicators.DPO; import com.strategyquant.lib.*; import com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; import com.strategyquant.datalib.DataInfo; import com.strategyquant.datalib.InstrumentInfo; import SQ.Internal.IndicatorBlock; import SQ.Calculators.AverageCalculator; /** * Indicator name as it will be displayed in UI, and its return type. * Possible return types: * ReturnTypes.Price - indicator is drawn on the price chart, like SMA, Bollinger Bands etc. * ReturnTypes.Number - indicator is drawn on separate chart, like CCI, RSI, MACD * ReturnTypes.PriceRange - indicator is price range, like ATR. */ @BuildingBlock(name="(DPO) Detrended Price Oscillator", display="DPO(@Chart@#Period#)[#Shift#]", returnType = ReturnTypes.Number) @Help("DPO help text") @Indicator(oscillator=true, middleValue=0, min=-0.1, max=0.1, step=0.00001) public class DPO extends IndicatorBlock { @Parameter public ChartData Input; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int Period; @Output public DataSeries Value; //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ @Override protected void OnBarUpdate() throws TradingException { if (CurrentBar < Period) { Value.set(0, 0); } else { int n = (int)(Period / 2) + 1; double sum = 0; int count = 0; for(int i = n;i<(n+Period);i++){ sum = sum +Input.Close.get(i); count++; } double avg = sum/Period; double dpo = Input.Close.get(0)- avg; Value.set(0, dpo); } } }
package SQ.Blocks.Indicators.DPO; import SQ.Internal.ConditionBlock; import com.strategyquant.lib.*; import com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; @BuildingBlock(name="(DPOAL) DPO is above Level", display=" DPO(@Chart@#Period#) is above #Level#", returnType = ReturnTypes.Boolean) @OppositeBlock(value="DPOBelowLevel",oscillator=true, middleValue=0) @ParameterSet(set="Period=10") @ParameterSet(set="Period=20") @ParameterSet(set="Period=40") @ParameterSet(set="Period=80") @ParameterSet(set="Period=100") @ParameterSet(set="Period=12") @ParameterSet(set="Period=24") @ParameterSet(set="Period=48") @ParameterSet(set="Period=96") @ParameterSet(set="Period=120") public class DPOAboveLevel extends ConditionBlock { @Parameter public ChartData Chart; @Parameter(defaultValue="14", minValue=2, maxValue=10000, step=1) public int Period; @Parameter(defaultValue="0", minValue=-0.01, maxValue=0.01, step=0.00001) public double Level; @Parameter public int Shift; //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ @Override public boolean OnBlockEvaluate() throws TradingException { DPO indicator = Strategy.Indicators.DPO(Chart, Period); double value= indicator.Value.getRounded(Shift,5); return (value > Level); } }
Status changed from Waiting for information to Refused
Attachment image-0.png added