Chiến lược hệ thống trung bình động vững chắc

Tác giả:ChaoZhang, Ngày: 2023-11-24 15:11:18
Tags:

img

Tổng quan

Chiến lược này là một hệ thống trung bình động dựa trên 4 SMMA (Smoothed Moving Average) với các khoảng thời gian khác nhau và 1 chỉ số EMA. Nó kết hợp nhiều công cụ phân tích kỹ thuật để hình thành một chiến lược giao dịch thông qua phán đoán xu hướng. Chiến lược này chủ yếu phù hợp với giao dịch nội ngày trái phiếu 15 phút EURUSD có đòn bẩy cao.

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

Chỉ số EMA là một chỉ số giao dịch có tính năng phân tích các xu hướng dài hạn.

Khi đường trung bình di chuyển ngắn hạn (như SMMA 3 giai đoạn) vượt qua đường trung bình di chuyển dài hạn (như EMA 200 giai đoạn), một tín hiệu mua được tạo ra. Khi đường trung bình di chuyển ngắn hạn vượt qua đường trung bình di chuyển dài hạn, một tín hiệu bán được tạo ra. Bằng cách đánh giá sự sắp xếp của nhiều đường trung bình di chuyển, hướng xu hướng được xác định.

Ngoài ra, chiến lược cũng thiết lập điểm dừng lợi nhuận và dừng lỗ để kiểm soát rủi ro.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Cấu trúc trung bình động đa cấp có thể xác định hiệu quả hướng xu hướng và giảm các tín hiệu sai.

  2. Chỉ số SMMA lọc hiệu quả tiếng ồn thị trường, và chỉ số EMA phát hiện xu hướng dài hạn.

  3. Nó phù hợp với các tài khoản đòn bẩy cao để khuếch đại lợi nhuận giao dịch.

  4. Các điểm dừng lợi nhuận và dừng lỗ được thiết lập để kiểm soát rủi ro hiệu quả.

  5. Tối ưu hóa các loại giao dịch (EURUSD) và chu kỳ (15 phút) để làm cho nó có lợi hơn.

Phân tích rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. Số lượng lớn các đường trung bình động có thể bỏ lỡ các cơ hội đảo ngược ngắn hạn.

  2. Đòn bẩy cao làm tăng lỗ trong khi tăng lợi nhuận.

  3. Khi đường trung bình động tạo ra tín hiệu, xu hướng ngắn hạn có thể đã đảo ngược.

  4. Giá hối đoái EURUSD có thể trải qua sự biến động mạnh mẽ, mang lại rủi ro lớn hơn.

Để đáp ứng những rủi ro này, chúng tôi có thể điều chỉnh thích hợp tỷ lệ đòn bẩy, tối ưu hóa các tham số của đường trung bình động, giới thiệu các chỉ số khác để đánh giá sự đảo ngược xu hướng, v.v. để tối ưu hóa.

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

Các hướng tối ưu hóa chính của chiến lược này bao gồm:

  1. Đánh giá hiệu suất của các giống và chu kỳ khác nhau và chọn các thông số tối ưu.

  2. Kiểm tra các kết hợp và số lượng khác nhau của các đường trung bình động.

  3. Tăng các chỉ số khối lượng hoặc biến động để xác định các điểm đảo ngược ngắn hạn.

  4. Tăng điều chỉnh năng động của phạm vi dừng lợi nhuận và dừng lỗ.

  5. Thêm chỉ số ENU để xác định điểm đảo ngược.

Thông qua thử nghiệm và tối ưu hóa đa khía cạnh, sự ổn định và lợi nhuận của chiến lược có thể được cải thiện đáng kể.

Tóm lại

Chiến lược trung bình động này tích hợp các lợi thế của các chỉ số trung bình động để tạo thành một hệ thống đánh giá xu hướng mạnh mẽ. Nó tối ưu hóa các loại và chu kỳ giao dịch và rất phù hợp với giao dịch trong ngày đòn bẩy cao. Thông qua điều chỉnh tham số và thử nghiệm tối ưu hóa, chiến lược này có thể trở thành một chiến lược giao dịch thuật toán hiệu quả và đáng tin cậy.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 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/
// © SoftKill21

//@version=4
strategy("Money maker EURUSD 15min" )
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)
 


startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)




len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len

len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2

len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3

len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4  : (smma4[1] * (len4 - 1) + src4) / len4

len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)

timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")

extraEntry =timeinrange(timeframe.period, "0745-1030")

time_cond = true
//time_cond2 = time >= startDate and time <= finishDate and extraEntry

//

longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma  and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 and time_cond
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma  and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 and time_cond


//longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma  and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 and time_cond2
//shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma  and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 and time_cond2

//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond



tp=input(300,title="tp")
sl=input(300,title="sl")

strategy.initial_capital  = 50000

//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(1,type=input.float,title="Risk %")/100           //risk % per trade


    //Calculate the size of the next trade
temp01 = balance * risk     //Risk in USD
temp02 = temp01/sl        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 1000)
    size := 1000           //Set min. lot size

dataL = (close-out5)*100000
dataS = (out5-close)*100000

minDistanceL = (smma4 - out5)*100000
minDistanceS= (out5 - smma4)*100000


strategy.entry("long",1,1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
    
strategy.entry("short",0,1,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)



strategy.close_all(when = not london, comment="london finish")
//strategy.close_all(when = not extraEntry, comment="london finish")



// maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)



Thêm nữa