Một chiến lược hệ thống trung bình động vững chắc và mạnh mẽ


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

Một chiến lược hệ thống trung bình động vững chắc và mạnh mẽ

Tổng quan

Chiến lược này là một hệ thống trung bình di chuyển dựa trên 4 chu kỳ khác nhau của SMMA (Smooth Moving Average) và một chỉ số EMA. Nó kết hợp một số công cụ phân tích kỹ thuật chứng khoán để tạo ra chiến lược giao dịch thông qua việc đánh giá xu hướng. Chiến lược này chủ yếu áp dụng cho các trái phiếu EURUSD 15 phút của tài khoản có mức độ đòn bẩy cao để giao dịch trong ngày.

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

Chiến lược này sử dụng 4 tham số khác nhau SMMA ((3, 6, 9, 50) và 1 EMA ((200) để xây dựng một hệ thống trung bình di chuyển nhiều tầng. Chỉ số SMMA có thể lọc hiệu quả tiếng ồn thị trường và đánh giá xu hướng. Chỉ số EMA phát hiện xu hướng dài hạn.

Một tín hiệu mua được tạo ra khi một trung bình di chuyển ngắn hạn (ví dụ như SMMA 3 chu kỳ) đi qua một trung bình di chuyển dài hạn (ví dụ như EMA 200 chu kỳ). Một tín hiệu bán được tạo ra khi một trung bình di chuyển ngắn hạn đi qua một trung bình di chuyển dài hạn.

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

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

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

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

  3. Các tài khoản được sử dụng để tăng lợi nhuận giao dịch.

  4. Đặt điểm dừng để kiểm soát rủi ro hiệu quả.

  5. Tối ưu hóa loại giao dịch ((EURUSD) và chu kỳ ((15 phút)), làm cho nó có lợi thế 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ử dụng trung bình di chuyển rất nhiều, có thể bỏ lỡ cơ hội đảo ngược ngắn hạn.

  2. Lợi nhuận cao làm tăng mức thua lỗ và lợi nhuận.

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

  4. EURUSD có thể biến động mạnh, gây ra rủi ro lớn hơn.

Đối với những rủi ro này, có thể điều chỉnh thích hợp các nhân đòn bẩy, tối ưu hóa các tham số của đường trung bình di chuyển, giới thiệu các chỉ số khác để xác định sự đảo ngược của thị trường.

Hướng tối ưu hóa

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

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

  2. Kiểm tra các kết hợp tham số khác nhau và số lượng trung bình di chuyển.

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

  4. Điều chỉnh động để tăng stop loss.

  5. Tham gia ENU là một bước ngoặt.

Bằng cách thử nghiệm và tối ưu hóa nhiều mặt, bạn có thể cải thiện đáng kể tính ổn định và lợi nhuận của chiến lược.

Tóm tắt

Chiến lược trung bình di chuyển này tích hợp các lợi thế của chỉ số đường trung bình để tạo ra một hệ thống phán đoán xu hướng vững chắc. Nó tối ưu hóa các loại và chu kỳ giao dịch, rất phù hợp với giao dịch trong ngày có lợi nhuận cao. Bằng cách điều chỉnh tham số và kiểm tra tối ưu hóa, chiến lược này có thể trở thành chiến lược giao dịch thuật toán hiệu quả và đáng tin cậy.

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