MACD của chiến lược sức mạnh tương đối

Tác giả:ChaoZhang, Ngày: 2023-12-21 12:01:01
Tags:

img

Tổng quan

Chiến lược này dựa trên hai chỉ số nổi tiếng: MACD và Relative Strength (RS). Bằng cách kết hợp chúng, chúng ta có được tín hiệu mua mạnh mẽ. Trên thực tế, đặc điểm đặc biệt của chiến lược này là nó tạo ra một chỉ số từ một chỉ số. Do đó, chúng ta xây dựng một MACD có nguồn gốc là giá trị của RS. Chiến lược chỉ lấy tín hiệu mua, bỏ qua tín hiệu bán vì chúng chủ yếu là thua lỗ. Ngoài ra còn có một phương pháp quản lý tiền giúp chúng ta tái đầu tư một phần lợi nhuận hoặc giảm kích thước đơn đặt hàng trong trường hợp mất mát đáng kể.

Chiến lược logic

RS là một chỉ số đo lường sự bất thường giữa động lực và giả định hiệu quả thị trường. Nó được sử dụng bởi các chuyên gia và là một trong những chỉ số mạnh mẽ nhất. Ý tưởng là sở hữu các tài sản hoạt động tốt hơn mức trung bình, dựa trên hiệu suất trong quá khứ của chúng. Chúng tôi tính toán RS bằng công thức này:

RS = Giá hiện tại / Giá cao nhất trong RS Thời gian dài

Do đó, chúng ta có thể định vị giá hiện tại liên quan đến giá cao nhất trong khoảng thời gian được xác định bởi người dùng này.

MACD là một trong những chỉ số nổi tiếng nhất, đo khoảng cách giữa hai đường trung bình chuyển động theo cấp số nhân: một nhanh và một chậm hơn. Một khoảng cách rộng cho thấy động lực nhanh và ngược lại. Chúng ta sẽ vẽ ra giá trị của khoảng cách này và gọi đường này là macdline. MACD sử dụng một đường trung bình chuyển động thứ ba với thời gian thấp hơn hai đường đầu tiên.

Điều quan trọng cần lưu ý là hai MAs đầu tiên được xây dựng bằng cách sử dụng các giá trị RS như nguồn của chúng. Vì vậy, chúng tôi đã chỉ xây dựng một chỉ số của một chỉ số.

Phân tích lợi thế

Chiến lược này kết hợp hai chỉ số rất mạnh: MACD và RS. MACD có thể nắm bắt xu hướng ngắn hạn và thay đổi động lực trong khi RS phản ánh sự mạnh mẽ của xu hướng trung bình đến dài hạn. Sử dụng chúng cùng nhau xem xét cả các yếu tố ngắn hạn và dài hạn, làm cho tín hiệu mua đáng tin cậy hơn.

Ngoài ra, chiến lược này rất độc đáo bởi nó lấy MACD từ chỉ số RS, tăng cường hiệu quả của chiến lược một cách sáng tạo.

Cuối cùng, chiến lược có các cơ chế quản lý rủi ro và dừng lỗ kiểm soát rủi ro hiệu quả và hạn chế lỗ cho mỗi giao dịch.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này là khả năng các chỉ số RS và MACD đưa ra tín hiệu sai. Mặc dù cả hai chỉ số đều mạnh mẽ, nhưng không chỉ số kỹ thuật nào có thể dự đoán 100% tương lai và tín hiệu đôi khi có thể thất bại. Ngoài ra, chính RS có khuynh hướng phán đoán xu hướng trung bình dài hạn và có thể tạo ra các tín hiệu gây hiểu lầm trong ngắn hạn.

Để giảm rủi ro, các tham số của RS và MACD có thể được điều chỉnh để phù hợp hơn với các công cụ giao dịch cụ thể và môi trường thị trường. Ngoài ra, có thể áp đặt phạm vi dừng lỗ nghiêm ngặt hơn. Nói chung, sử dụng stop loss để kiểm soát mỗi lỗ giao dịch là phương pháp tốt nhất để giải quyết rủi ro của chiến lược này.

Hướng dẫn cải thiện

Đầu tiên, kiểm tra thị trường nào (ví dụ: cổ phiếu, ngoại hối, tiền điện tử vv) mang lại hiệu quả tốt nhất của chiến lược này, sau đó tập trung vào tài sản tối ưu đó.

Thứ hai, hãy thử sử dụng thuật toán học máy để tự động tối ưu hóa các tham số RS và MACD thay vì cố định chúng bằng tay.

Thứ ba, xem xét kết hợp các chỉ số khác để thiết lập tín hiệu giao dịch, hình thành một mô hình đa yếu tố để cải thiện độ chính xác tín hiệu.

Kết luận

Chiến lược này tận dụng các chỉ số MACD và RS phối hợp để cung cấp các tín hiệu mua mạnh. Sự mới lạ của nó nằm trong việc lấy MACD từ chỉ số RS, thực hiện ghép nối giữa các chỉ số để tăng hiệu quả. Chiến lược có cơ chế nhập cảnh, dừng lỗ và quản lý tiền rõ ràng kiểm soát rủi ro một cách hiệu quả.


/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © gsanson66


//This strategy calculates the Relative Strength and plot the MACD of this Relative Strenght
//We take only buy signals send by MACD
//@version=5
strategy("MACD OF RELATIVE STRENGHT STRATEGY", shorttitle="MACD RS STRATEGY", precision=4, overlay=false, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18, slippage=3)


//------------------------------TOOL TIPS--------------------------------//

t1 = "Relative Strength length i.e. number of candles back to find the highest high and compare the current price with this high."
t2 = "Relative Strength fast EMA length used to plot the MACD."
t3 = "Relative Strength slow EMA length used to plot the MACD."
t4 = "Macdline SMA length used to plot the MACD."
t5 = "The maximum loss a trade can incur (in percentage of the trade value)"
t6 = "Each gain or losse (relative to the previous reference) in an amount equal to this fixed ratio will change quantity of orders."
t7 = "The amount of money to be added to or subtracted from orders once the fixed ratio has been reached."


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, loc) =>
    label.new(bar_index, loc, text=txt, color=color, style=label.style_label_lower_right, textcolor=color.black, size=size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
rs_lenght = input.int(defval=300, minval=1, title="RS Length", group="Technical parameters", tooltip=t1)
fast_length = input(title="MACD Fast Length", defval=14, group="Technical parameters", tooltip=t2)
slow_length = input(title="MACD Slow Length", defval=26, group="Technical parameters", tooltip=t3)
signal_length = input.int(title="MACD Signal Smoothing",  minval=1, maxval=50, defval=10, group="Technical parameters", tooltip=t4)
//Risk Management
slMax = input.float(8, "Max risk per trade (in %)", minval=0, group="Risk Management", tooltip=t5)
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management", tooltip=t6)
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management", tooltip=t7)
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Relative Strenght Calculation
rs = close/ta.highest(high, rs_lenght)
//MACD of RS Calculation
[macdLine, signalLine, histLine] = ta.macd(rs, fast_length, slow_length, signal_length)
//Money management
equity = math.abs(strategy.equity - strategy.openprofit)
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=macdLine)


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size>0 and histLine<0
    strategy.close("Long")


//-------------------------------BUY CONDITION-------------------------------------//

if histLine>0 and not (strategy.position_size>0) and inRange
    qty = cashOrder/close
    stopLoss = close*(1-slMax/100)
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop=stopLoss)


//---------------------------------PLOTTING ELEMENT----------------------------------//

hline(0, "Zero Line", color=color.new(#787B86, 50))
plot(macdLine, title="MACD", color=color.blue)
plot(signalLine, title="Signal", color=color.orange)
plot(histLine, title="Histogram", style=plot.style_columns, color=(histLine>=0 ? (histLine[1] < histLine ? #26A69A : #B2DFDB) : (histLine[1] < histLine ? #FFCDD2 : #FF5252)))
plotchar(rs, "Relative Strenght", "", location.top, color=color.yellow)

Thêm nữa