Chiến lược chéo trung bình di chuyển

Tác giả:ChaoZhang, Ngày: 2023-10-24 16:39:40
Tags:

img

Tổng quan

Chiến lược này dựa trên nguyên tắc chéo trung bình động. Nó đi dài khi trung bình di chuyển ngắn hạn vượt qua trên trung bình di chuyển dài hạn từ dưới, và đi ngắn khi trung bình di chuyển ngắn hạn vượt qua dưới trung bình di chuyển dài hạn từ trên.

Chiến lược logic

Chiến lược chủ yếu tính toán các đường trung bình di chuyển đơn giản ngắn hạn và dài hạn và xác định hướng xu hướng dựa trên sự chéo chéo của chúng.

Cụ thể, nó đầu tiên tính toán trung bình di chuyển ngắn hạn xMA và trung bình di chuyển dài hạn, trong đó thời gian ngắn là Len và thời gian dài là 2*Len.

Sau đó nó kiểm tra xem MA ngắn hạn vượt qua trên MA dài hạn, và tạo ra một tín hiệu dài nếu sự giao thoa xảy ra.

Khi nhận được tín hiệu dài, nó mở một vị trí dài ở giá thị trường nếu không có vị trí. Khi nhận được tín hiệu ngắn, nó mở một vị trí ngắn ở giá thị trường nếu không có vị trí.

Ngoài ra, điểm dừng lỗ và lấy lợi nhuận được cấu hình. Đối với các giao dịch dài, điểm dừng lỗ được thiết lập ở mức giá nhập - tỷ lệ giảm lỗ dừng * giá nhập, và lấy lợi nhuận ở mức giá nhập + tỷ lệ lấy lợi nhuận * giá nhập. Đối với các giao dịch ngắn, điểm dừng lỗ được thiết lập ở mức giá nhập + tỷ lệ giảm lỗ dừng * giá nhập, và lấy lợi nhuận ở mức giá nhập - tỷ lệ lấy lợi nhuận * giá nhập.

Cuối cùng, các đường trung bình động được vẽ để hình dung để hỗ trợ xác định xu hướng.

Ưu điểm

  • Đơn giản và dễ hiểu, thích hợp cho người mới bắt đầu.

  • Có thể theo dõi hiệu quả xu hướng thị trường dựa trên đường chéo trung bình động.

  • Rủi ro được kiểm soát bằng cách cấu hình dừng lỗ và lấy lợi nhuận.

  • Việc hình dung các đường trung bình động trực quan phản ánh những thay đổi xu hướng.

Rủi ro

  • Các đường trung bình động có tác dụng chậm trễ, có thể gây ra việc bỏ lỡ các điểm đầu vào tốt nhất.

  • Cấu hình stop loss không đúng có thể dẫn đến việc dừng quá rộng hoặc quá chặt.

  • Giá whipsawing có thể tạo ra tín hiệu sai.

  • Tối ưu hóa chỉ dựa trên thời gian trung bình động có thể dẫn đến quá phù hợp.

Những rủi ro này có thể được giảm bằng cách sử dụng các điểm dừng lỏng lẻo hơn, tối ưu hóa các kết hợp thời gian trung bình động, thêm các chỉ số bộ lọc vv.

Hướng dẫn tối ưu hóa

  • Thêm các chỉ số khác như MACD, KDJ để lọc để tránh tín hiệu sai.

  • Tối ưu hóa sự kết hợp của các khoảng thời gian trung bình động ngắn và dài để tìm các thông số tối ưu.

  • Kiểm tra các chiến lược dừng lỗ / lấy lợi nhuận khác nhau như dừng lại.

  • Thêm kích thước vị trí để tối ưu hóa việc sử dụng vốn.

Tóm lại

Chiến lược này có logic rõ ràng và đơn giản, có thể theo dõi xu hướng hiệu quả dựa trên đường chéo trung bình động, và có rủi ro có thể kiểm soát được. Nó phù hợp cho người mới bắt đầu học hỏi. Nhưng chỉ dựa vào đường trung bình động có thể tạo ra tín hiệu sai. Vẫn còn nhiều chỗ để tối ưu hóa nó trong nhiều khía cạnh để làm cho nó mạnh mẽ hơn.


/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')

Thêm nữa