Chiến lược nhân số tham số: Sự kết hợp nhịp điệu thị trường của nhiều chỉ báo

RSI ADX momentum ROC ATR VOLUME ACCELERATION SLOPE
Ngày tạo: 2025-09-25 13:02:08 sửa đổi lần cuối: 2025-09-25 13:02:08
sao chép: 0 Số nhấp chuột: 138
2
tập trung vào
319
Người theo dõi

Chiến lược nhân số tham số: Sự kết hợp nhịp điệu thị trường của nhiều chỉ báo Chiến lược nhân số tham số: Sự kết hợp nhịp điệu thị trường của nhiều chỉ báo

Ồ, đây là chiến thuật thần tiên gì vậy?

Bạn có biết không? Chiến lược này giống như là một “siêu radar” cho thị trường! Nó không đơn giản là nhìn vào một hoặc hai chỉ số, mà là kết hợp 9 chỉ số kỹ thuật khác nhau như một ban nhạc, mỗi chỉ số là một “công cụ” và chiến lược sẽ phát ra tín hiệu giao dịch chỉ khi chúng chơi một “bảng nhạc” hòa hợp.

Các nguyên tắc cơ bản của yoga được tiết lộ

Trọng tâm! Cơ bản của chiến lược này là khái niệm “phần số nhân”. Nó tiêu chuẩn hóa các chỉ số như RSI, ADX, động lực, tỷ lệ thay đổi, ATR, khối lượng giao thông, tăng tốc và độ dốc vào cùng một quy mô, sau đó nhân chúng với nhau để có được một “giá trị tổng hợp”. Giống như nấu ăn, mỗi loại gia vị có tỷ lệ tối ưu, chiến lược này giúp bạn tìm ra sự kết hợp hoàn hảo của các “giá trị” trên thị trường!

Khả năng giao dịch tùy chỉnh

Điều tuyệt nhất về chiến lược này là bạn có thể tự do kết hợp như xây dựng khối! Không muốn sử dụng một chỉ số nào đó, hãy tắt nó đi. Bạn muốn điều chỉnh tham số chu kỳ?

Hướng dẫn ứng dụng thực tế

Hướng dẫn tránh hố! Chiến lược này đặc biệt phù hợp với môi trường thị trường hỗn hợp với các biến động và xu hướng. Khi dòng sản phẩm màu xanh vượt lên đường đồng bằng màu cam, hãy làm trống khi đi xuống. Chiến lược này cũng thiết lập một cơ chế tự động để bạn không bị giữ vị trí khi có tín hiệu đảo ngược. Hãy nhớ rằng, bật bộ lọc xu hướng sẽ giúp bạn vượt qua xu hướng lớn và tắt nó sẽ bắt được nhiều cơ hội ngắn hạn hơn!

Mã nguồn chiến lược
//@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)