
Đây là chiến lược dựa trên đường trung bình động 18 ngày (SMA18), kết hợp với khả năng nhận dạng mô hình giao dịch trong ngày và cơ chế dừng lỗ thông minh. Chiến lược này chủ yếu quan sát mối quan hệ giữa giá và SMA18, kết hợp các điểm cao và thấp trong ngày và vào vị thế mua vào đúng thời điểm. Chiến lược này áp dụng kế hoạch dừng lỗ linh hoạt, có thể sử dụng điểm dừng lỗ cố định hoặc điểm thấp nhất trong hai ngày làm điểm chuẩn dừng lỗ theo sau.
Logic cốt lõi của chiến lược bao gồm các yếu tố chính sau:
Chiến lược này xây dựng một hệ thống giao dịch tương đối hoàn chỉnh bằng cách kết hợp các phương pháp phân tích từ nhiều khía cạnh. Ưu điểm cốt lõi của chiến lược này nằm ở các thiết lập tham số linh hoạt và cơ chế dừng lỗ thông minh, cho phép chiến lược này thích ứng với các môi trường thị trường khác nhau. Thông qua quá trình tối ưu hóa và cải tiến liên tục, chiến lược này dự kiến sẽ duy trì hiệu suất ổn định trong nhiều điều kiện thị trường khác nhau.
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent
strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')
insideBar() => //and high <= high[1] and low >= low[1] ? 1 : 0
open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0
inside() =>
high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]
inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
enterIndex := bar_index
enterIndex
//if strategy.position_size <= 0
// strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")
//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0
// strategy.exit("Long", stop=low[0]-belowlow,comment="exit")
// enterIndex := na
T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])
W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])
//longStopPrice = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)
//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)
showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')
isMon() =>
dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
dayofweek(time('D')) == dayofweek.sunday and showSun
clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or isWed()
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]
if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1]) //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
if tradeabove == false
strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
if tradeabove == true and (xing == false or clprior < entryline) // and high<high[1]
strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')
//if time>timestamp(2020,12,0,0,0) and isSat()
// strategy.entry("Long", strategy.long, limit=0, comment="long")
//strategy.exit("Long", stop=low-400*syminfo.mintick)
//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")
if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')
if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')
if strategy.position_avg_price > 0 and trailingtwo
strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')