매개변수 승수 전략: 여러 지표의 시장 메트로놈 융합

RSI ADX momentum ROC ATR VOLUME ACCELERATION SLOPE
생성 날짜: 2025-09-25 13:02:08 마지막으로 수정됨: 2025-09-25 13:02:08
복사: 0 클릭수: 138
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

매개변수 승수 전략: 여러 지표의 시장 메트로놈 융합 매개변수 승수 전략: 여러 지표의 시장 메트로놈 융합

, 이건 신세안의 전략이냐?

이 전략은 마치 시장에 ‘슈퍼 레이더’를 설치하는 것과 같습니다. 단순히 한 두 개의 지표를 보는 것이 아니라, 9 개의 다른 기술 지표를 밴드처럼 함께 조립하는 것입니다. 각각의 지표는 ‘악기’입니다. 전략은 그들이 조화로운 ‘노트’를 연주할 때만 거래 신호를 발산합니다.

의 핵심이 밝혀졌습니다.

이 전략의 핵심은 “변수 곱하기” 개념에 있습니다. RSI, ADX, 운동량, 변화율, ATR, 교통량, 가속도 및 경사 등과 같은 지표를 먼저 표준화한 다음 “통합 힘 값”을 얻습니다. 요리처럼, 각 조미료에는 최적의 비율이 있습니다. 이 전략은 시장에서 다양한 “조미료”의 완벽한 조화를 찾도록 도와줍니다.

맞춤형 거래 도구

이 전략의 가장 멋진 점은 무엇입니까? 당신은 블록을 짓는 것처럼 자유롭게 조합 할 수 있습니다! 특정 지표를 사용하지 않으려면? 그냥 꺼주세요. 주기 변수를 조정하고 싶으면? 당신이 좋아하는 대로. 심지어 SMA 트렌드 필터는 역동 거래의 큰 구멍을 피하는 데 도움이됩니다. 이것은 “거래 전략 DIY 툴킷”과 같습니다.

실전 사용 가이드

피트 가이드는 여기에 있습니다! 이 전략은 특히 흔들림과 추세가 혼합된 시장 환경에 적합합니다. 파란색 제품 라인이 상향으로 오르는 동안 더 많은 것을 할 때, 주황색의 평평선을 통과 할 때 공백을 만들 수 있습니다. 전략은 또한 자동 평정 메커니즘을 정교하게 설정하여 역전 신호가 발생했을 때 포지션을 유지하지 않도록합니다.

전략 소스 코드
//@version=5
strategy("Parametric Multiplier Backtester", shorttitle="PMB", overlay=false)

// Author: Script_Algo
// License: MIT
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// === Input Parameters ===
// Price
useClose = input.bool(true, "▪ Use Price", group="Parameter Settings")
priceSource = input.source(close, "Price Source", group="Parameter Settings")

// RSI
useRSI = input.bool(true, "▪ Use RSI", group="Parameter Settings")
rsiLength = input.int(8, "RSI Period", minval=1, group="Parameter Settings")
rsiSource = input.source(close, "RSI Source", group="Parameter Settings")

// ADX
useADX = input.bool(true, "▪ Use ADX", group="Parameter Settings")
adxLength = input.int(11, "ADX Period", minval=1, group="Parameter Settings")

// Momentum
useMomentum = input.bool(true, "▪ Use Momentum", group="Parameter Settings")
momLength = input.int(8, "Momentum Period", minval=1, group="Parameter Settings")
momSource = input.source(close, "Momentum Source", group="Parameter Settings")

// ROC
useROC = input.bool(true, "▪ Use ROC", group="Parameter Settings")
rocLength = input.int(3, "ROC Period", minval=1, group="Parameter Settings")
rocSource = input.source(close, "ROC Source", group="Parameter Settings")

// ATR
useATR = input.bool(true, "▪ Use ATR", group="Parameter Settings")
atrLength = input.int(40, "ATR Period", minval=1, group="Parameter Settings")

// Volume
useVolume = input.bool(true, "▪ Use Volume", group="Parameter Settings")
volumeSmoothing = input.int(200, "Volume Smoothing", minval=1, group="Parameter Settings")

// Acceleration
useAcceleration = input.bool(true, "▪ Use Acceleration", group="Parameter Settings")
accLength = input.int(500, "Acceleration Period", minval=1, group="Parameter Settings")
accSource = input.source(close, "Acceleration Source", group="Parameter Settings")

// Slope
useSlope = input.bool(true, "▪ Use Slope", group="Parameter Settings")
slopeLength = input.int(6, "Slope Period", minval=2, group="Parameter Settings")
slopeSource = input.source(close, "Slope Source", group="Parameter Settings")

// Normalization
normalizeValues = input.bool(true, "Normalize Values", group="General Settings")
lookbackPeriod = input.int(20, "Normalization Period", minval=10, group="General Settings")

// Product line smoothing
smoothProduct = input.bool(true, "Smooth Product Line", group="General Settings")
smoothingLength = input.int(200, "Smoothing Period", minval=1, group="General Settings")

// === SMA Trend Filter ===
trendFilter = input.bool(false, "Use SMA Trend Filter", group="Trend Filter")
smaPeriod = input.int(200, "SMA Period for Filter", minval=1, group="Trend Filter")

// === Indicator Calculations ===
// RSI
rsiValue = ta.rsi(rsiSource, rsiLength)

// ADX (correct calculation)
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.tr
    plus = fixnan(100 * ta.rma(plusDM, len) / ta.rma(truerange, len))
    minus = fixnan(100 * ta.rma(minusDM, len) / ta.rma(truerange, len))
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), len)
    [adx, plus, minus]

[adxValue, diPlus, diMinus] = dirmov(adxLength)

// Momentum
momValue = (momSource / momSource[momLength]) * 100

// ROC
rocValue = ((rocSource - rocSource[rocLength]) / rocSource[rocLength]) * 100

// ATR
atrValue = ta.atr(atrLength)

// Volume
smaVolume = ta.sma(volume, volumeSmoothing)

// Acceleration (расчет ускорения цены)
accValue = (accSource / accSource[accLength] - 1) * 100

// Slope (расчет наклона линейной регрессии)
slopeValue = ta.linreg(slopeSource, slopeLength, 0) - ta.linreg(slopeSource, slopeLength, slopeLength)

// Price
priceValue = priceSource

// === Value Normalization ===
normalize_func(_value, _use, _length) =>
    if not _use
        1
    else
        if normalizeValues
            minVal = ta.lowest(_value, _length)
            maxVal = ta.highest(_value, _length)
            valueRange = maxVal - minVal
            valueRange > 0 ? (_value - minVal) / valueRange * 100 + 1 : 1
        else
            _value

// Normalized values
normPrice = normalize_func(priceValue, useClose, lookbackPeriod)
normRSI = normalize_func(rsiValue, useRSI, lookbackPeriod)
normADX = normalize_func(adxValue, useADX, lookbackPeriod)
normMomentum = normalize_func(momValue, useMomentum, lookbackPeriod)
normROC = normalize_func(rocValue, useROC, lookbackPeriod)
normATR = normalize_func(atrValue, useATR, lookbackPeriod)
normVolume = normalize_func(smaVolume, useVolume, lookbackPeriod)
normAcceleration = normalize_func(accValue, useAcceleration, lookbackPeriod)
normSlope = normalize_func(slopeValue, useSlope, lookbackPeriod)

// === Product Calculation ===
productValue = 1.0

// Multiply only if parameter is enabled
if useClose
    productValue *= normPrice

if useRSI
    productValue *= normRSI

if useADX
    productValue *= normADX

if useMomentum
    productValue *= normMomentum

if useROC
    productValue *= normROC

if useATR
    productValue *= normATR

if useVolume
    productValue *= normVolume

if useAcceleration
    productValue *= normAcceleration

if useSlope
    productValue *= normSlope

// Product line smoothing
smoothedProduct = smoothProduct ? ta.sma(productValue, smoothingLength) : productValue

// Mean line
meanLine = ta.sma(smoothedProduct, 50)

// SMA trend filter
smaFilter = ta.sma(close, smaPeriod)

// === Trading Conditions ===
// Bullish crossover (product line crosses mean line from below)
bullishCross = ta.crossover(smoothedProduct, meanLine)
// Bearish crossover (product line crosses mean line from above)
bearishCross = ta.crossunder(smoothedProduct, meanLine)

// Entry conditions with trend filter
longCondition = bullishCross and (not trendFilter or close > smaFilter)
shortCondition = bearishCross and (not trendFilter or close < smaFilter)

// === Strategy Execution ===
// Close opposite positions before opening new ones
if (longCondition)
    strategy.close("Short", comment="Close Short Entry Long")
    strategy.entry("Long", strategy.long)
    
if (shortCondition)
    strategy.close("Long", comment="Close Long Entry Short")
    strategy.entry("Short", strategy.short)

// Additional exit conditions for more precise control
if (bearishCross and strategy.position_size > 0)
    strategy.close("Long", comment="Exit Long")
    
if (bullishCross and strategy.position_size < 0)
    strategy.close("Short", comment="Exit Short")

// === Visualization (as oscillator below chart) ===
// Plot product line and mean line in separate pane
plot(smoothedProduct, color=color.blue, linewidth=2, title="Product Line")
plot(meanLine, color=color.orange, linewidth=1, title="Mean Line")

// Fill area between lines
fill(plot(smoothedProduct), plot(meanLine), color=smoothedProduct > meanLine ? color.new(color.green, 90) : color.new(color.red, 90))

// Information table
var table infoTable = table.new(position.top_right, 1, 1, bgcolor=color.white, border_width=1)
if barstate.islast
    table.cell(infoTable, 0, 0, "Current Value: " + str.tostring(smoothedProduct, "#.##"), text_color=color.black)