
Chiến lược này được gọi là chiến lược giao dịch đường ngắn hiệu quả bằng cách tính toán tín hiệu giao dịch đường ngắn của DEMA và EMA kết hợp với ATR. Chiến lược giao dịch đường ngắn hiệu quả được thực hiện bằng cách tính toán tín hiệu giao dịch đường ngắn của DEMA và EMA kết hợp với chỉ số biến động của ATR.
Tính toán chỉ số DEMA DEMA là trung bình di chuyển của EMA đôi, bằng cách tính toán EMA đôi trong một chu kỳ nhất định, bạn có thể lọc hiệu quả tiếng ồn thị trường ngắn hạn và cải thiện độ chính xác của tín hiệu.
Tính toán chỉ số EMA. EMA là chỉ số trung bình di chuyển, có thể phản ứng nhanh hơn với sự thay đổi giá.
Tính toán tỷ lệ biến động ATR. ATR là một chỉ số về độ dao động thực tế, có thể phản ánh sự biến động của thị trường và mức độ rủi ro. Khi ATR tăng lên, đại diện cho sự biến động của thị trường tăng lên, dễ dàng tạo ra điều chỉnh đường ngắn.
Khi DEMA đi qua EMA, và ATR biến động lớn hơn các tham số được đặt, cho thấy giá cổ phiếu bắt đầu giảm, thị trường risk off, tại thời điểm này làm trống.
Khi DEMA quay trở lại EMA, nó cho thấy giá đã tạo ra sự hỗ trợ và bắt đầu tăng trở lại, lúc này nó đã bị xóa.
EMA kép kết hợp với EMA, có thể làm tăng hiệu quả độ chính xác của tín hiệu.
Chỉ số ATR có thể loại trừ các tín hiệu whipsaw có nguy cơ thấp.
Hoạt động ngắn hạn, phù hợp với việc theo dõi đường ngắn, có thể tránh được bảo hiểm lâu dài.
Các giao dịch có logic đơn giản, rõ ràng, dễ hiểu và dễ thực hiện.
Thiết lập ATR không đúng có thể làm mất cơ hội giao dịch.
Cần chú ý đến tín hiệu hai bên cùng một lúc, hoạt động khó khăn hơn.
ffected by short-term market volatility.
Giải pháp: Thử nghiệm tối ưu hóa tham số, điều chỉnh tham số; đơn giản hóa logic giao dịch, chỉ tập trung vào tín hiệu đơn phương; Giảm phạm vi dừng lỗ thích hợp.
Tối ưu hóa các tham số của DEMA và EMA, tìm kiếm sự kết hợp tham số tốt nhất.
Tối ưu hóa các tham số chu kỳ của ATR để xác định các chỉ số tốt nhất để đo lường sự biến động của thị trường.
Thêm các chỉ số phụ trợ khác, chẳng hạn như kênh BOLL, để tăng độ chính xác tín hiệu.
Thêm các quy tắc dừng lỗ và dừng lại để khóa thu nhập ổn định hơn.
Chiến lược này xây dựng một chiến lược giao dịch ngắn hạn đơn giản và hiệu quả thông qua các chỉ số biến động DEMA, EMA và ATR. Chiến lược giao dịch có logic rõ ràng, dễ sử dụng và có thể thích ứng với giao dịch đường ngắn tần số cao. Bước tiếp theo là tối ưu hóa tham số và tối ưu hóa quy tắc, có thể đạt được lợi nhuận vượt trội ổn định hơn.
/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 00:00:00
period: 1h
basePeriod: 15m
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/
// © Qorbanjf
//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf
//@version=4
strategy("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", overlay=true)
// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)
//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)
// get ATR VALUE
atr = atr(14)
//ATRP (Average True Price in precentage)
// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)
// ATR Logic
// atrValue = atr(atrLookback)
// atrp = (atrValue/close)*100
// plot(atrp, color=color.white, linewidth=2, transp = 30)
atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100
// Moving Average Logic
ma(maType, src, length) =>
maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))
// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry
//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and crossover(dema1, ema1)
// === INPUT BACKTEST RANGE ===
//FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//FromYear = input(defval = 2017, title = "From Year", minval = 2000)
//ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//ToYear = input(defval = 9999, title = "To Year", minval = 2017)
//Invert trade direction & flipping
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")
// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)
// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
shortStopSaved := slType ? shortStop : shortStopPercent
enterShort:= true
entry := close
// long conditions
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)
//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")
//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
from_entry="short",
limit=exitSignal ? close : na,
stop=shortStopSaved,
when=strategy.position_size > 0,
comment="end short")
//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1)
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())