Chiến lược giao cắt đường trung bình động


Ngày tạo: 2023-10-24 16:39:40 sửa đổi lần cuối: 2023-10-24 16:39:40
sao chép: 0 Số nhấp chuột: 671
1
tập trung vào
1617
Người theo dõi

Chiến lược giao cắt đường trung bình động

Tổng quan

Chiến lược này dựa trên nguyên tắc chéo giữa các đường trung bình di chuyển, khi đường trung bình ngắn hạn vượt qua đường trung bình dài hạn từ phía dưới và trống khi đường trung bình ngắn hạn vượt qua đường trung bình dài hạn từ phía trên, là một chiến lược theo dõi xu hướng điển hình.

Nguyên tắc chiến lược

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

Cụ thể, chiến lược này đầu tiên tính toán đường trung bình ngắn hạn xMA và đường trung bình dài hạn, đường trung bình ngắn hạn là Len và đường trung bình dài hạn là 2*Len。

Sau đó, chiến lược đánh giá xem đường trung bình ngắn hạn có đi qua đường trung bình dài hạn hay không, và nếu nó đi qua, nó sẽ tạo ra tín hiệu đa; đánh giá xem đường trung bình ngắn hạn có đi qua đường trung bình dài hạn hay không, và nếu nó đi qua, nó sẽ tạo ra tín hiệu trống.

Sau khi nhận được tín hiệu làm nhiều, nếu không có vị trí hiện tại, hãy mở thêm vị trí theo giá thị trường; Sau khi nhận được tín hiệu làm giảm, nếu không có vị trí hiện tại, hãy mở vị trí theo giá thị trường.

Ngoài ra, chiến lược cũng đặt điểm dừng lỗ. Sau khi thực hiện nhiều hơn, hãy đặt giá dừng lỗ là giá nhập - tỷ lệ phần trăm dừng lỗ*Giá vào, giá dừng là giá vào + tỷ lệ dừng*Giá nhập; thiết lập giá dừng lỗ sau khi tháo lỗ là giá nhập + phần trăm dừng lỗ*Giá vào, giá dừng là giá vào - tỷ lệ phần trăm dừng*Giá vé.

Cuối cùng, chiến lược cũng xuất ra một đường cong hình ảnh bằng phẳng để hỗ trợ đánh giá xu hướng.

Lợi thế chiến lược

  • Các nhà nghiên cứu cho rằng: “Sự phát triển của một nền kinh tế toàn cầu là một bước đi quan trọng trong quá trình phát triển kinh tế toàn cầu”.

  • Các trung bình di chuyển có thể giúp theo dõi xu hướng thị trường một cách hiệu quả.

  • Thiết lập điểm dừng lỗ để kiểm soát rủi ro;

  • Hình ảnh hiển thị đường cong đồng tuyến, phản ánh trực quan sự thay đổi xu hướng.

Rủi ro chiến lược

  • Đường trung bình có tính chậm trễ, có thể gây ra nguy cơ bỏ lỡ thời điểm xuất phát tốt nhất;

  • Thiết lập điểm dừng không hợp lý có thể dẫn đến việc dừng lỗ quá nhẹ hoặc quá nghiêm ngặt;

  • Có thể có tín hiệu giả của đường trung bình khi giá cổ phiếu dao động mạnh;

  • Các tham số được tối ưu hóa chỉ dựa trên tham số chu kỳ trung bình có thể dẫn đến quá phù hợp.

Những rủi ro này có thể được giảm bớt bằng cách nới lỏng lỗ hổng thích hợp, tối ưu hóa các tham số của chu kỳ trung bình và thêm các bộ lọc cho các chỉ số khác.

Hướng tối ưu hóa chiến lược

  • Thêm các chỉ số khác để lọc, chẳng hạn như MACD, KDJ, v.v. để tránh sai vị trí đồng nhất tạo ra tín hiệu sai;

  • Tối ưu hóa đa kết hợp cho đường trung bình ngắn hạn và chiều dài đường trung bình dài hạn để tìm ra các tham số tốt nhất;

  • Kiểm tra các chiến lược dừng lỗ khác nhau, chẳng hạn như dừng lời nói, dừng động;

  • Thêm mô-đun quản lý vị trí để tối ưu hóa hiệu quả sử dụng vốn.

Tóm tắt

Kế hoạch tổng thể của chiến lược này rõ ràng và đơn giản, dựa trên phương pháp định hướng xu hướng, có thể theo dõi xu hướng một cách hiệu quả, và có thể kiểm soát rủi ro, phù hợp với tài liệu tham khảo học tập mới. Tuy nhiên, chỉ dựa vào đường ngang có thể có tín hiệu sai, có rất nhiều không gian tối ưu hóa, có thể cải thiện tối ưu hóa từ nhiều khía cạnh, làm cho chiến lược ổn định và đáng tin cậy hơn.

Mã nguồn chiến lược
/*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')