
Chiến lược này là hệ thống giao dịch theo dõi xu hướng dựa trên đường trung bình động hàm mũ 5 ngày (EMA). Nó phân tích mối quan hệ vị trí giữa giá và EMA và kết hợp điều chỉnh động của mục tiêu dừng lỗ và lợi nhuận để nắm bắt xu hướng thị trường. Chiến lược này áp dụng phương pháp quản lý vị thế phần trăm và tính đến các yếu tố chi phí giao dịch, khiến nó trở nên thực tế và linh hoạt cao.
Logic cốt lõi của chiến lược này là xác định thời điểm vào lệnh dựa trên sự tương tác giữa giá và đường EMA 5 ngày. Cụ thể, khi giá cao nhất của giai đoạn hiện tại thấp hơn đường EMA và xảy ra đột phá trong giai đoạn hiện tại, hệ thống sẽ đưa ra tín hiệu mua. Đồng thời, chiến lược này cũng bao gồm một điều kiện bổ sung tùy chọn yêu cầu giá đóng cửa phải cao hơn giá của kỳ trước để tăng độ tin cậy của tín hiệu. Để kiểm soát rủi ro, chiến lược này cung cấp hai phương pháp dừng lỗ: dừng lỗ động dựa trên mức thấp trước đó và dừng lỗ dựa trên điểm cố định. Mục tiêu lợi nhuận được thiết lập linh hoạt dựa trên tỷ lệ rủi ro-lợi nhuận, đảm bảo tiềm năng lợi nhuận của giao dịch.
Đây là một chiến lược theo xu hướng hợp lý và được thiết kế tốt, có thể nắm bắt hiệu quả xu hướng thị trường thông qua sự kết hợp giữa các chỉ báo EMA và hành vi giá. Chiến lược này có cơ chế tương đối hoàn chỉnh để kiểm soát rủi ro và quản lý lợi nhuận, đồng thời cung cấp nhiều hướng để tối ưu hóa, có giá trị thực tiễn cao và có thể cải thiện. Sau đó, tính ổn định và lợi nhuận của chiến lược có thể được cải thiện hơn nữa bằng cách bổ sung phân tích đa giai đoạn, điều chỉnh cơ chế dừng lỗ, v.v.
/*backtest
start: 2024-12-29 00:00:00
end: 2025-01-05 00:00:00
period: 30m
basePeriod: 30m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Demo GPT - PowerOfStocks 5EMA", overlay=true)
// Inputs
enableSL = input.bool(false, title="Enable Extra SL")
usl = input.int(defval=5, title="SL Distance in Points", minval=1, maxval=100)
riskRewardRatio = input.int(defval=3, title="Risk to Reward Ratio", minval=3, maxval=25)
showSell = input.bool(true, title="Show Sell Signals")
showBuy = input.bool(true, title="Show Buy Signals")
buySellExtraCond = input.bool(false, title="Buy/Sell with Extra Condition")
startDate = input(timestamp("2018-01-01 00:00"), title="Start Date")
endDate = input(timestamp("2069-12-31 23:59"), title="End Date")
// EMA Calculation
ema5 = ta.ema(close, 5)
// Plot EMA
plot(ema5, "EMA 5", color=color.new(#882626, 0), linewidth=2)
// Variables for Buy
var bool longTriggered = na
var float longStopLoss = na
var float longTarget = na
// Variables for Sell (used for signal visualization but no actual short trades)
var bool shortTriggered = na
var float shortStopLoss = na
var float shortTarget = na
// Long Entry Logic
if true
if (showBuy)
longCondition = high[1] < ema5[1] and high[1] < high and (not buySellExtraCond or close > close[1])
if (longCondition and not longTriggered)
entryPrice = high[1]
stopLoss = enableSL ? low[1] - usl * syminfo.mintick : low[1]
target = enableSL ? entryPrice + (entryPrice - stopLoss) * riskRewardRatio : high[1] + (high[1] - low[1]) * riskRewardRatio
// Execute Buy Order
strategy.entry("Buy", strategy.long, stop=entryPrice)
longTriggered := true
longStopLoss := stopLoss
longTarget := target
label.new(bar_index, entryPrice, text="Buy@ " + str.tostring(entryPrice), style=label.style_label_up, color=color.green, textcolor=color.white)
// Short Signal Logic (Visual Only)
if (true)
if (showSell)
shortCondition = low[1] > ema5[1] and low[1] > low and (not buySellExtraCond or close < close[1])
if (shortCondition and not shortTriggered)
entryPrice = low[1]
stopLoss = enableSL ? high[1] + usl * syminfo.mintick : high[1]
target = enableSL ? entryPrice - (stopLoss - entryPrice) * riskRewardRatio : low[1] - (high[1] - low[1]) * riskRewardRatio
// Visual Signals Only
label.new(bar_index, entryPrice, text="Sell@ " + str.tostring(entryPrice), style=label.style_label_down, color=color.red, textcolor=color.white)
shortTriggered := true
shortStopLoss := stopLoss
shortTarget := target
// Exit Logic for Buy
if longTriggered
// Stop-loss Hit
if low <= longStopLoss
strategy.close("Buy", comment="SL Hit")
longTriggered := false
// Target Hit
if high >= longTarget
strategy.close("Buy", comment="Target Hit")
longTriggered := false
// Exit Logic for Short (Signals Only)
if shortTriggered
// Stop-loss Hit
if high >= shortStopLoss
shortTriggered := false
// Target Hit
if low <= shortTarget
shortTriggered := false