この戦略は様々な技術指標と戦略を組み合わせ,主に指数のエントリーポイントとアウトプートのポイントを決定します.
鍵となる論理は
開いた,閉じた,高い,低いを含む移動平均キャンドルを計算
MAキャンドルのモメントとモメントの線形回帰を計算する
MAキャンドルの直線回帰を計算する
SuperTrend を使って,全体的な方向性を決定します.
運動回帰がマイナスから正または強く正に変わると
ポジティブからネガティブに変化したり 弱くなったりすると
この戦略は,指数取引のタイミングを決定するための短期および長期間の市場動向とリズムを評価するための様々な指標を合成しています.
MAキャンドルは中長期の傾向を反映しています
リグレッション分析は傾向の変化を特定する
スーパートレンドは全体的な方向性を支援します
複数の指標により正確性が向上します
複雑なパラメータ最適化
複数の指標をバランスさせるのが難しい
頻度が少ない信号は,取引頻度が低いことを意味します.
この戦略は,短期および長期的パターン分析によって市場タイミング信号を明らかにすることを目的としています.しかし,パラメータ調整とモデル最適化には改善が必要です.
/*backtest start: 2023-09-06 00:00:00 end: 2023-09-13 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © HeWhoMustNotBeNamed //@version=4 strategy("MACandles-LinearRegression-Strategy", shorttitle="MALinReg - Strategy", overlay=false, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01) resolution = "" MAType = input(title="Moving Average Type (MA Candles)", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) LoopbackBars = input(60, title="Length (MA Candles)", step=10) MMAType = input(title="Moving Average Type (Momentum)", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) MLength = input(20, title="MA Length (Momentum)", step=10) lb = input(40 , title="Look Back Period Percentile High/Low", step=10, minval=10, maxval=100) ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%") pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%") mult = input(3.0 , minval=1, maxval=5, title="Bollinger Band Standard Devaition Up") aggressiveLong = input(true) longTrades = input(true) useVixFix = input(false) i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time) i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time) inDateRange = true f_getMovingAverage(source, MAType, length)=> ma = sma(source, length) if(MAType == "ema") ma := ema(source,length) if(MAType == "hma") ma := hma(source,length) if(MAType == "rma") ma := rma(source,length) if(MAType == "vwma") ma := vwma(source,length) if(MAType == "wma") ma := wma(source,length) ma f_getMACandles(resolution, MAType, LoopbackBars)=> oOpen = f_getMovingAverage(open, MAType, LoopbackBars) oClose = f_getMovingAverage(close, MAType, LoopbackBars) oHigh = f_getMovingAverage(high, MAType, LoopbackBars) oLow = f_getMovingAverage(low, MAType, LoopbackBars) [oOpen, oClose, oHigh, oLow] f_getVixFixLinReg(oClose, oLow, MLength)=> wvf = ((highest(oClose, MLength)-oLow)/(highest(oClose, MLength)))*100 sDev = mult * stdev(wvf, MLength) midLine = sma(wvf, MLength) lowerBand = midLine - sDev upperBand = midLine + sDev rangeHigh = (highest(wvf, lb)) * ph rangeLow = (lowest(wvf, lb)) * pl col = wvf >= upperBand or wvf >= rangeHigh ? color.lime : color.gray val = linreg(wvf, MLength, 0) absVal = abs(val) linRegColor = val>val[1]? (val > 0 ? color.green : color.orange): (val > 0 ? color.lime : color.red) vixFixState = (col == color.lime) ? 1: 0 vixFixState := strategy.position_size == 0? max(vixFixState, nz(vixFixState[1],0)) : vixFixState [val, absVal, wvf, col, linRegColor, vixFixState] f_getMACandlesLinReg(oClose, MMAType, MLength, mult, lb, ph, pl)=> ma = f_getMovingAverage(oClose, MMAType, MLength) maDiff = oClose - ma val = linreg(maDiff, MLength,0) absVal = abs(val) linRegColor = iff( val > 0, iff( val > nz(val[1]), color.green, color.lime), iff( val < nz(val[1]), color.red, color.orange)) sDev = mult * stdev(maDiff, MLength) midLine = sma(maDiff, MLength) lowerBand = midLine - sDev upperBand = midLine + sDev rangeHigh = (highest(maDiff, lb)) * ph rangeLow = (lowest(maDiff, lb)) * pl col = maDiff >= upperBand or maDiff >= rangeHigh ? color.lime : maDiff <= lowerBand or maDiff <= rangeLow ? color.orange : color.silver absMaDiff = abs(maDiff) [val, absVal, maDiff, absMaDiff, col, linRegColor] f_getSupertrend(resolution, oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, AtrMult, wicks)=> truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1]) averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength) atr = averagetruerange * AtrMult longWicks = wicks shortWicks = wicks longStop = oClose - atr longStopPrev = nz(longStop[1], longStop) longStop := (longWicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = oClose + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := (shortWicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and (longWicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (shortWicks[1]? oLow : oClose) < longStopPrev ? -1 : dir [dir, longStop, shortStop] f_getMACandlesAndSupertrend(MAType, LoopbackBars, AtrMult, wicks)=> oOpen = f_getMovingAverage(open, MAType, LoopbackBars) oClose = f_getMovingAverage(close, MAType, LoopbackBars) oHigh = f_getMovingAverage(high, MAType, LoopbackBars) oLow = f_getMovingAverage(low, MAType, LoopbackBars) [dir, longStop, shortStop] = f_getSupertrend(resolution, oOpen, oClose, oHigh, oLow, MAType, LoopbackBars, AtrMult, wicks) dir [oOpen, oClose, oHigh, oLow] = f_getMACandles(resolution, MAType, LoopbackBars) dir = f_getMACandlesAndSupertrend("sma", 200, 1, false) colorByPreviousClose = false candleColor = colorByPreviousClose ? (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver) [vval, vabsVal, wvf, vcol, vlinRegColor, vixFixState] = f_getVixFixLinReg(oClose, oLow, MLength) [val, absVal, maDiff, absMaDiff, col, linRegColor] = f_getMACandlesLinReg(oClose, MMAType, MLength, mult, lb, ph, pl) plot(useVixFix?na:absMaDiff, title="Momentum", style=plot.style_histogram, linewidth = 4, color=col) plot(useVixFix?wvf:na, title="VIX Fix", style=plot.style_histogram, linewidth = 4, color=vcol) plot(useVixFix?na:-absVal, title="Linear Regression (Momentum)", style=plot.style_histogram, linewidth=4, color=linRegColor) plot(useVixFix?-vabsVal:na, title="Linear Regression (VIX Fix)", style=plot.style_histogram, linewidth=4, color=vlinRegColor) exitColor = longTrades? color.orange : color.silver exitPreviousColor = longTrades? color.silver : color.lime longCondition = (useVixFix? (vixFixState == 1 and vlinRegColor == color.lime) : ((linRegColor == color.orange and linRegColor[1] == color.red) or (linRegColor == color.green and linRegColor[1] != color.green and aggressiveLong))) and inDateRange and dir>0 exitLongCondition = (col == exitColor and col[1] == exitColor and col[2] == exitPreviousColor and (linRegColor != color.green or not aggressiveLong)) strategy.entry("Long", strategy.long, when=longCondition, oca_name="oca_buy") strategy.close("Long", when=exitLongCondition)