『正文』
ˇ
Params Numeric BollLength(20); Numeric BollOffset(2.0); Numeric ScoreThreshold(0.65); Numeric Fund(100000);
Vars Series<Numeric> ATR; Series<Numeric> BollMid; Series<Numeric> BollUpper; Series<Numeric> BollLower; Series<Numeric> BollWidth; Series<Numeric> BollPosition;
Series<Numeric> Feature1; Series<Numeric> Feature2; Series<Numeric> Feature3; Series<Numeric> Feature4; Series<Numeric> Feature5; Series<Numeric> Feature6; Series<Numeric> Feature7;
Series<Numeric> MLSignal; Numeric Confidence; Series<Numeric> MLConfidence;
Series<Numeric> MAFast; Series<Numeric> MASlow; Series<Numeric> ADXValue; Series<Numeric> ROC; Series<Numeric> RSIValue; Series<Numeric> MACD; Series<Numeric> VolumeRatio; Series<Numeric> Lots;
Events
onBar(ArrayRef<Integer> indexs) { Lots = Max(1, Round(Fund / (O * ContractUnit * BigPointValue * MarginRatio / Rollover), 0));
ATR = AvgTrueRange(14); BollMid = Average(Close, BollLength); Numeric BollBand = StandardDev(Close, BollLength, 2); BollUpper = BollMid + BollOffset * BollBand; BollLower = BollMid - BollOffset * BollBand; BollWidth = IIF(BollMid != 0, (BollUpper - BollLower) / BollMid, 0); BollPosition = IIF((BollUpper - BollLower) != 0, (Close - BollLower) / (BollUpper - BollLower), 0.5);
MAFast = Average(Close, 10); MASlow = Average(Close, 30); Numeric TrendStrength = Abs(MAFast - MASlow) / Close; Numeric PDI = Average(Max(High - High[1], 0), 14) / ATR * 100; Numeric MDI = Average(Max(Low[1] - Low, 0), 14) / ATR * 100; Numeric DX = IIF((PDI + MDI) != 0, Abs(PDI - MDI) / (PDI + MDI) * 100, 0); ADXValue = Average(DX, 6);
if (MAFast > MASlow) { Feature1 = TrendStrength * (ADXValue / 100); } else { Feature1 = -TrendStrength * (ADXValue / 100); }
ROC = (Close - Close[5]) / Close[5] * 100; Numeric Up = Max(Close - Close[1], 0); Numeric Down = Max(Close[1] - Close, 0); Numeric RSValue = IIF(Average(Down, 14) != 0, Average(Up, 14) / Average(Down, 14), 0); RSIValue = IIF(RSValue != 0, 100 - (100 / (1 + RSValue)), 50); MACD = Average(Close, 12) - Average(Close, 26);
Feature2 = ROC * 0.5 + (RSIValue - 50) * 0.5 + (MACD / Close * 100) * 0.3;
Feature3 = (ATR / Close) * 100;
VolumeRatio = Vol / Average(Vol, 20); Feature4 = VolumeRatio;
Feature5 = BollPosition;
Feature6 = IIF(BollWidth != 0, 1.0 / (BollWidth * 100), 10);
Numeric BollExtreme = 0; if (BollPosition < 0.1 || BollPosition > 0.9) { BollExtreme = 0.3; } Numeric RSIExtreme = 0; if (RSIValue < 30 || RSIValue > 70) { RSIExtreme = 0.3; } Feature7 = Min(BollExtreme + RSIExtreme, 1.0);
MLSignal = KNN_Predictor( Feature1, Feature2, Feature3, Feature4, Feature5, Feature6, Feature7, 500, 5, 100, Confidence ); MLConfidence = Confidence;
if (High >= BollUpper[1] && MarketPosition == 0 && MLSignal[1] > 0 && MLConfidence[1] >= ScoreThreshold) { Buy(Lots, Max(Open, BollUpper[1])); Commentary("ML增强做多-置信度:" + Text(MLConfidence[1])); }
if (Low <= BollLower[1] && MarketPosition == 0 && MLSignal[1] < 0 && MLConfidence[1] >= ScoreThreshold) { SellShort(Lots, Min(Open, BollLower[1])); Commentary("ML增强做空-置信度:" + Text(MLConfidence)); }
if (MarketPosition > 0 && Low <= BollMid[1]) { Sell(0, Min(Open,BollMid[1])); Commentary("多头止损"); }
if (MarketPosition < 0 && High >= BollMid[1]) { BuyToCover(0, Max(Open,BollMid[1])); Commentary("空头止损"); }
PlotNumeric("MLSignal", MLSignal[1]); PlotNumeric("MLConfidence", MLConfidence[1]); PlotNumeric("ScoreThreshold", ScoreThreshold); }
我们需要先把7个特征计算好,默认使用的是传统指标这里可以平替为自己的指标和算法: MAFast = Average(Close, 10); MASlow = Average(Close, 30); Numeric TrendStrength = Abs(MAFast - MASlow) / Close; Numeric PDI = Average(Max(High - High[1], 0), 14) / ATR * 100; Numeric MDI = Average(Max(Low[1] - Low, 0), 14) / ATR * 100; Numeric DX = IIF((PDI + MDI) != 0, Abs(PDI - MDI) / (PDI + MDI) * 100, 0); ADXValue = Average(DX, 6); if (MAFast > MASlow) { Feature1 = TrendStrength * (ADXValue / 100); } else { Feature1 = -TrendStrength * (ADXValue / 100); } ROC = (Close - Close[5]) / Close[5] * 100; Numeric Up = Max(Close - Close[1], 0); Numeric Down = Max(Close[1] - Close, 0); Numeric RSValue = IIF(Average(Down, 14) != 0, Average(Up, 14) / Average(Down, 14), 0); RSIValue = IIF(RSValue != 0, 100 - (100 / (1 + RSValue)), 50); MACD = Average(Close, 12) - Average(Close, 26); Feature2 = ROC * 0.5 + (RSIValue - 50) * 0.5 + (MACD / Close * 100) * 0.3; Feature3 = (ATR / Close) * 100; VolumeRatio = Vol / Average(Vol, 20); Feature4 = VolumeRatio; Feature5 = BollPosition; Feature6 = IIF(BollWidth != 0, 1.0 / (BollWidth * 100), 10); Numeric BollExtreme = 0; if (BollPosition < 0.1 || BollPosition > 0.9) { BollExtreme = 0.3; } Numeric RSIExtreme = 0; if (RSIValue < 30 || RSIValue > 70) { RSIExtreme = 0.3; } Feature7 = Min(BollExtreme + RSIExtreme, 1.0);OK,接下来我们只需要传入7个特征给KNN_Predictor函数即可,如下:用户函数会把指标归一化、每个BAR生成信号和置信度。需要注意的是返回的信号和置信度需要前推使用,如下:
策略已上传到网站俱乐部后台,KNN的用户函数可以按照示例策略进行复用修改。微 信|小松鼠-松鼠Quant
微信号|viquant01