Xu hướng kênh phong bì trung bình di chuyển theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-11-23 15:06:32
Tags:

img

Tổng quan

Chiến lược theo xu hướng kênh phong bì trung bình động là một chiến lược theo xu hướng dựa trên đường trung bình động và các chỉ số kênh. Nó nhận ra sự đánh giá và theo dõi xu hướng giá bằng cách thiết lập kênh trung bình động đa cấp. Chiến lược cũng kết hợp tính toán trung bình động của các khung thời gian khác nhau để đạt được sự hợp nhất nhiều khung thời gian, giúp nắm bắt xu hướng lớn hơn.

Chiến lược logic

Nguyên tắc cốt lõi của chiến lược này dựa trên chức năng theo dõi xu hướng của các đường trung bình động và phán đoán kênh của các chỉ số Envelop. Chiến lược sử dụng các tham số có thể cấu hình như thời gian trung bình động, loại mịn, nguồn giá, vv để xây dựng một đường trung bình động cơ bản. Sau đó các kênh lên và xuống được thiết lập theo các giá trị thay đổi phần trăm được thiết lập bởi các tham số. Khi giá vượt qua kênh dưới, đi dài; khi giá vượt qua kênh trên, đi ngắn. Đồng thời, chiến lược giới thiệu một đường trung bình động độc lập như đường dừng lỗ.

Cụ thể, chiến lược có các đặc điểm sau:

  1. Hỗ trợ cả hai hoạt động dài và ngắn, đánh giá hướng xu hướng thông qua các kênh lên và xuống.

  2. Mở tối đa 4 lệnh, thực hiện lệnh mở kim tự tháp thông qua các lớp polyline để theo đuổi lợi nhuận cao hơn.

  3. Thiết lập trung bình động mở và trung bình động đóng độc lập để đạt được mức dừng chính xác.

  4. Hỗ trợ tính toán trung bình động của các khung thời gian khác nhau (1 phút đến 1 ngày) để đạt được sự hợp nhất nhiều khung thời gian.

  5. Các đường trung bình động mở và đóng hỗ trợ lựa chọn 6 chế độ làm mịn khác nhau, có thể được tối ưu hóa cho các loại và chu kỳ khác nhau.

  6. Sự thay đổi tích cực và tiêu cực có thể được nhập để điều chỉnh các kênh và theo đuổi những bước đột phá chính xác hơn.

Lý thuyết giao dịch cụ thể của chiến lược là như sau:

  1. Tính toán đường trung bình động mở đầu của chỉ số chuẩn và lấy 4 đường đột phá theo tỷ lệ phần trăm được thiết lập của các tham số.

  2. Khi giá vượt qua đường kênh dưới, mở các vị trí để đi dài; khi giá vượt qua đường kênh trên, mở các vị trí để đi ngắn.

  3. Tính toán trung bình động đóng cửa độc lập như là đường dừng lỗ. Khi giá giảm xuống dưới đường một lần nữa, dừng lỗ các lệnh dài trong các lớp; khi giá tăng lên trên đường một lần nữa, dừng lỗ các lệnh ngắn trong các lớp.

  4. Có thể mở tối đa 4 lệnh. Sử dụng mở lệnh kim tự tháp lớp để theo đuổi lợi nhuận cao hơn.

Thông qua nguyên tắc của chiến lược này, có thể thấy rằng chiến lược tích hợp các yếu tố như theo dõi xu hướng của các đường trung bình động, tín hiệu đột phá của phán đoán kênh và thiết lập các đường dừng lỗ độc lập để tạo thành một hệ thống xu hướng tương đối nghiêm ngặt và hoàn chỉnh.

Phân tích lợi thế

Theo mã và phân tích logic, xu hướng kênh theo chiến lược đường trung bình động có những lợi thế sau:

  1. Phối hợp nhiều khung thời gian cải thiện xác suất nắm bắt xu hướng quy mô lớn. Chiến lược hỗ trợ tính toán trung bình động của các chu kỳ khác nhau từ 1 phút đến 1 ngày. Cài đặt các trung bình động mở và dừng lỗ với các chu kỳ khác nhau đạt được sự hợp nhất của sức đánh giá xu hướng nhiều khung thời gian, thuận lợi hơn cho việc nắm bắt xu hướng quy mô lớn.

  2. Phương pháp mở lệnh kim tự tháp theo đuổi lợi nhuận lớn hơn. Chiến lược có thể mở tối đa 4 lệnh. Bằng cách mở lệnh nhiều lớp, nó cân bằng tỷ lệ lợi nhuận và theo đuổi lợi nhuận lớn hơn trong khi kiểm soát rủi ro.

  3. 6 loại trung bình động có sẵn để lựa chọn và khả năng thích nghi rất mạnh. Trung bình động mở và dừng lỗ hỗ trợ việc lựa chọn 6 chế độ bao gồm SMA / EMA / Động cơ trung bình động, có thể được tối ưu hóa cho các giống và chu kỳ khác nhau để cải thiện khả năng thích nghi.

  4. Các đường kênh có thể điều chỉnh làm cho phán đoán đột phá chính xác hơn. Chiến lược cho phép nhập các tham số tỷ lệ phần trăm chuyển động kênh để điều chỉnh chiều rộng kênh để tối ưu hóa đối với các giống hoặc môi trường thị trường khác nhau, cải thiện độ chính xác của phán đoán đột phá.

  5. Đường dừng lỗ độc lập là hữu ích cho việc kiểm soát rủi ro. Chiến lược tính toán một đường trung bình động độc lập như là đường đóng để dừng lỗ lệnh dài hoặc ngắn, có thể làm giảm đáng kể rủi ro giao dịch và tránh đuổi theo các lệnh thua lỗ.

  6. Cấu trúc mã là rõ ràng và dễ phát triển thứ hai. Chiến lược được viết bằng Pine Script với cấu trúc rõ ràng và dễ hiểu và phát triển thứ hai. Người dùng có thể tiếp tục tối ưu hóa các tham số hoặc thêm logic khác dựa trên khuôn khổ hiện có.

Phân tích rủi ro

Mặc dù logic chiến lược tổng thể nghiêm ngặt và kiểm soát rủi ro đã được thực hiện, vẫn có một số rủi ro giao dịch cần phải nhận thức được, đặc biệt bao gồm:

  1. Nguy cơ đảo ngược xu hướng quy mô lớn. Giả định cốt lõi của chiến lược là giá sẽ tiếp tục tăng đều đặn, với một số xu hướng. Tuy nhiên, khi xu hướng quy mô lớn đảo ngược, nó sẽ có tác động lớn hơn đến lợi nhuận của chiến lược.

  2. Rủi ro đột phá không hợp lệ. Trong các thị trường bên cạnh hoặc sốc, giá có thể giảm xuống dưới đường kênh sau khi đột phá, điều này sẽ gây ra việc theo đuổi bằng cách mất lệnh. Các thông số cần được tối ưu hóa để giảm các trường hợp như vậy.

  3. Quản lý rủi ro kỳ vọng. Chiến lược đặt ra 4 lớp lệnh kim tự tháp để theo đuổi lợi nhuận cao hơn, dẫn đến lợi nhuận đáng kể trong thời gian lợi nhuận nhưng cũng giảm mạnh kỳ vọng trong thời gian mất mát. Điều này đòi hỏi các nhà đầu tư phải có kỹ năng quản lý tâm lý chuyên nghiệp.

  4. Rủi ro tối ưu hóa tín hiệu. Chiến lược liên quan đến điều chỉnh và tối ưu hóa trên nhiều thông số như chiều rộng kênh và chu kỳ trung bình động. Điều này đòi hỏi các chuyên gia phải có kinh nghiệm tối ưu hóa để tránh quá tải.

  5. Rủi ro điều kiện thị trường đặc biệt: Điều kiện thị trường cực đoan như khoảng cách nhanh hoặc giới hạn đường ngắn sẽ làm tổn hại đáng kể đến logic chiến lược, vì vậy cần phải chú ý đến các chỉ số rủi ro hệ thống để dừng lỗ kịp thời.

Nói chung, chiến lược chủ yếu dựa trên xu hướng tăng trưởng quy mô lớn cho lợi nhuận, và chỉ áp dụng cho các giống và môi trường thị trường có đặc điểm bền vững lâu dài.

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

Đối với xu hướng kênh bao bì trung bình động này theo chiến lược, các hướng tối ưu hóa chính bao gồm:

  1. Tối ưu hóa thích nghi của các đường kênh và các đường dừng lỗ dựa trên các thuật toán học máy. Các mô hình như LSTM và dự đoán quỹ đạo có thể được sử dụng để đào tạo các mô hình đường kênh và dừng lỗ để đạt được dự đoán giá thông minh hơn và tránh rủi ro.

  2. Kết hợp các yếu tố phụ như chỉ số tâm lý, tỷ lệ cân nhắc danh mục đầu tư để tối ưu hóa logic kim tự tháp. Các yếu tố như biến động tuyệt đối và tâm lý thị trường có thể được thêm vào để kiểm soát rủi ro danh mục đầu tư và tối ưu hóa logic mở lệnh kim tự tháp.

  3. Đưa ra các mô hình chi phí giao dịch và trượt để cải thiện tính xác thực của backtesting.

  4. Mở rộng phân tích tương quan giữa các lớp tài sản tương tự để xây dựng các khung kiểm soát rủi ro thống nhất. Mở rộng chiến lược tài sản duy nhất hiện tại đến nhiều thị trường tương tự như hàng hóa và tiền điện tử, và thống nhất kiểm soát rủi ro thông qua phân tích tương quan để cải thiện sự ổn định của chiến lược.

  5. Sử dụng các phương pháp như SHAP để phân tích tầm quan trọng của mỗi biến đầu vào đối với kết quả chiến lược, xếp hạng tầm quan trọng đầu ra và làm cho logic chiến lược minh bạch và dễ giải thích hơn cho người dùng.

Việc giới thiệu các thuật toán như học máy và mô hình đa yếu tố để tối ưu hóa hơn nữa tính ổn định, tính xác thực và khả năng sử dụng chiến lược là hướng cải tiến chính đi về phía trước.

Tóm lại

Tóm lại, chiến lược theo xu hướng kênh bao bọc trung bình động tích hợp ba điểm chính: theo dõi xu hướng của trung bình động, xác định xu hướng của các chỉ số kênh và các đường dừng lỗ độc lập để kiểm soát rủi ro. Trong các thị trường xu hướng nghiêm ngặt, chiến lược có thể cung cấp lợi nhuận ổn định với một lượng xu hướng sau lợi nhuận hợp lý. Nhưng người dùng cần chú ý đến môi trường thị trường vĩ mô, tối ưu hóa các tham số đúng cách và quản lý rủi ro, để chiến lược có thể thích nghi với các thị trường giao dịch phức tạp và luôn thay đổi. Nhìn chung, chiến lược cung cấp cho người dùng một giải pháp theo dõi xu hướng tương đối hoàn chỉnh và nghiêm ngặt, và là một khuôn khổ chiến lược định lượng rất phù hợp cho phát triển độc quyền và phát triển thứ cấp.


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

// This source code is subject to the terms of the GNU Affero General Public License v3.0 at https://www.gnu.org/licenses/agpl-3.0.html
//@version=4
strategy(title = "HatiKO Envelopes", shorttitle = "HatiKO Envelopes", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 4, initial_capital=10, calc_on_order_fills=false)

//Settings
isLotSizeAvgShifts=input(true, title ="Calculate lot size with avgPrice shifts (HatiKO  calculate)")

lotsize_Short = input(100, defval = 100, minval = 0, maxval = 10000, title = "Lot short, %")
lotsize_Long = input(100, defval = 100, minval = 0, maxval = 10000, title = "Lot long, %")

//Shorts Open Config
timeFrame_Short =  input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Short")
ma_type_Short = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Short")
Short_Data_input = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Short")
len_Short = input(3, minval = 1, title = "MA Length Short")
offset_Short = input(0, minval = 0, title = "MA offset Short")

//Longs Open Config
timeFrame_Long =  input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Long")
ma_type_Long = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Long")
Long_Data_input = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Long")
len_Long = input(3, minval = 1, title = "MA Length Long")
offset_Long = input(0, minval = 0, title = "MA offset Long")

//Shorts Close Config
isEnableShortCustomClose=input(false, title ="Mode close MA Short")
timeFrame_close_Short = input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Short Close")
ma_type_close_Short = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Close Short")
Short_Data_input_close = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Short Close")
len_Short_close = input(3, minval = 1, title = "MA Length Short Close")
shortDeviation = input( 0.0, title = "Short Deviation %",step=0.1)
offset_Short_close = input(0, minval = 0, title = "MA offset Short Close")

//Longs Close Config
isEnableLongCustomClose=input(false, title ="Mode close MA Long")
timeFrame_close_Long =  input(defval = "Current.", options = ["Current.", "1m", "3m", "5m", "10m", "15m", "20m", "30m", "45m", "1H","2H","3H","4H","1D"], title = "Timeframe Long Close")
ma_type_close_Long = input(defval = "1. SMA", options = ["1. SMA", "2. PCMA", "3. EMA", "4. WMA", "5. DEMA", "6. ZLEMA"], title = "MA Type Close Long")
Long_Data_input_close = input(defval = "7.OHLC4", options = ["1.Open", "2.High", "3.Low", "4.Close", "5.HL2", "6.HLC3", "7.OHLC4", "8.OC2"], title = "Data Long Close")
len_Long_close = input(3, minval = 1, title = "MA Length Long Close")
longDeviation = input( -0.0, title = "Long Deviation %",step=0.1)
offset_Long_close = input(0, minval = 0, title = "MA offset Long Close")

shift_Short4_percent = input(0.0, title = "Short Shift 4")
shift_Short3_percent = input(10.0, title = "Short Shift 3")
shift_Short2_percent = input(7.0, title = "Short Shift 2")
shift_Short1_percent = input(4.0, title = "Short Shift 1")
shift_Long1_percent = input(-4.0, title = "Long Shift 1")
shift_Long2_percent = input(-7.0, title = "Long Shift 2")
shift_Long3_percent = input(-10.0, title = "Long Shift 3")
shift_Long4_percent = input( -0.0, title = "Long Shift 4")
isEnableDoubleLotShift3_Long=input(false, title ="Shift3 Long LotSize*2")
isEnableDoubleLotShift3_Short=input(false, title ="Shift3 Short LotSize*2")

year_Start = input(19, defval = 19, minval = 10, maxval = 99, title = "From Year 20XX")
year_End = input(99, defval = 99, minval = 10, maxval = 99, title = "To Year 20XX")
month_Start = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
month_End = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
day_Start = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
day_End = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

short4_isActive = shift_Short4_percent != 0 and lotsize_Short > 0
short3_isActive = shift_Short3_percent != 0 and lotsize_Short > 0
short2_isActive = shift_Short2_percent != 0 and lotsize_Short > 0
short1_isActive = shift_Short1_percent != 0 and lotsize_Short > 0
long1_isActive = shift_Long1_percent != 0 and lotsize_Long > 0
long2_isActive = shift_Long2_percent != 0 and lotsize_Long > 0
long3_isActive = shift_Long3_percent != 0 and lotsize_Long > 0
long4_isActive = shift_Long4_percent != 0 and lotsize_Long > 0

mult = 1 / syminfo.mintick
is_time_true = time > timestamp(2000+year_Start, month_Start, day_Start, 00, 00) and time < timestamp(2000+ year_End, month_End, day_End, 23, 59)

//MA
TFsecurity_Short = timeFrame_Short == "4H"?60*4:timeFrame_Short=="3H"?60*3:timeFrame_Short=="2H"?60*2:timeFrame_Short=="1H"?60:timeFrame_Short=="45m"?45:timeFrame_Short=="30m"?30:timeFrame_Short=="20m"?20:timeFrame_Short=="15m"?15:timeFrame_Short=="10m"?10:timeFrame_Short=="5m"?5:timeFrame_Short=="3m"?3:1
TFsecurity_Long = timeFrame_Long == "4H"?60*4:timeFrame_Long=="3H"?60*3:timeFrame_Long=="2H"?60*2:timeFrame_Long=="1H"?60:timeFrame_Long=="45m"?45:timeFrame_Long=="30m"?30:timeFrame_Long=="20m"?20:timeFrame_Long=="15m"?15:timeFrame_Long=="10m"?10:timeFrame_Long=="5m"?5:timeFrame_Long=="3m"?3:1

oc2 = (open + close) / 2
lag_Short = (len_Short - 1) / 2//floor((len_Short - 1) / 2)
lag_Long = (len_Long - 1) / 2 //floor((len_Long - 1) / 2)

source_Short = Short_Data_input == "1.Open" ? open : Short_Data_input == "2.High" ? high : Short_Data_input == "3.Low" ? low : Short_Data_input == "4.Close" ? close : Short_Data_input == "5.HL2" ? hl2 : Short_Data_input == "6.HLC3" ? hlc3 : Short_Data_input == "7.OHLC4" ? ohlc4 : Short_Data_input == "8.OC2" ? oc2: close
source_Long = Long_Data_input == "1.Open" ? open : Long_Data_input == "2.High" ? high : Long_Data_input == "3.Low" ? low : Long_Data_input == "4.Close" ? close : Long_Data_input == "5.HL2" ? hl2 : Long_Data_input == "6.HLC3" ? hlc3 : Long_Data_input == "7.OHLC4" ? ohlc4 : Long_Data_input == "8.OC2" ? oc2: close

preS_MA_Short = ma_type_Short == "1. SMA" ? sma(source_Short, len_Short) : ma_type_Short == "2. PCMA"? (highest(high, len_Short) + lowest(low, len_Short)) / 2 : ma_type_Short == "3. EMA" ? ema(source_Short, len_Short) : ma_type_Short == "4. WMA" ? wma(source_Short, len_Short) : ma_type_Short == "5. DEMA" ? (2 * ema(source_Short,len_Short) - ema(ema(source_Short,len_Short), len_Short)) : ma_type_Short == "6. ZLEMA" ? ema(source_Short + (source_Short - source_Short[lag_Short]), len_Short) : na
preS_MA_Long = ma_type_Long == "1. SMA" ? sma(source_Long, len_Long) :ma_type_Long == "2. PCMA"? (highest(high, len_Long) + lowest(low, len_Long)) / 2 : ma_type_Long == "3. EMA" ? ema(source_Long, len_Long) : ma_type_Long == "4. WMA" ? wma(source_Long, len_Long) : ma_type_Long == "5. DEMA" ? (2 * ema(source_Long,len_Long) - ema(ema(source_Long,len_Long), len_Long)) : ma_type_Long == "6. ZLEMA" ? ema(source_Long + (source_Long - source_Long[lag_Long]), len_Long) : na
pre_MA_Short = timeFrame_Short == "Current." ? preS_MA_Short : security(syminfo.tickerid, tostring(TFsecurity_Short), preS_MA_Short)
pre_MA_Long = timeFrame_Long == "Current." ? preS_MA_Long : security(syminfo.tickerid, tostring(TFsecurity_Long), preS_MA_Long)

MA_Short = (round(pre_MA_Short * mult) / mult)[offset_Short]
MA_Long = (round(pre_MA_Long * mult) / mult)[offset_Long]

Level_Long1 = long1_isActive ? round((MA_Long + MA_Long* shift_Long1_percent / 100) * mult) / mult : na
Level_Long2 = long2_isActive ? round((MA_Long + MA_Long* shift_Long2_percent / 100) * mult) / mult : na
Level_Long3 = long3_isActive ? round((MA_Long + MA_Long* shift_Long3_percent / 100) * mult) / mult : na
Level_Long4 = long4_isActive ? round((MA_Long + MA_Long* shift_Long4_percent / 100) * mult) / mult : na
Level_Short1 = short1_isActive ? round((MA_Short + MA_Short*shift_Short1_percent/ 100) * mult) / mult : na
Level_Short2 = short2_isActive ? round((MA_Short + MA_Short*shift_Short2_percent/ 100) * mult) / mult : na
Level_Short3 = short3_isActive ? round((MA_Short + MA_Short*shift_Short3_percent/ 100) * mult) / mult : na
Level_Short4 = short4_isActive ? round((MA_Short + MA_Short*shift_Short4_percent/ 100) * mult) / mult : na

//MA_Close
lag_Short_close = (len_Short_close - 1) / 2 //floor((len_Short_close - 1) / 2)
lag_Long_close = (len_Long_close - 1) / 2 //floor((len_Long_close - 1) / 2)

pre_PCMA_Short_close = (highest(high, len_Short_close) + lowest(low, len_Short_close)) / 2
pre_PCMA_Long_close = (highest(high, len_Long_close) + lowest(low, len_Long_close)) / 2

source_Short_close = Short_Data_input_close == "1.Open" ? open : Short_Data_input_close == "2.High" ? high : Short_Data_input_close == "3.Low" ? low : Short_Data_input_close == "4.Close" ? close : Short_Data_input_close == "5.HL2" ? hl2 : Short_Data_input_close == "6.HLC3" ? hlc3 : Short_Data_input_close == "7.OHLC4" ? ohlc4 : Short_Data_input_close == "8.OC2" ? oc2: close
source_Long_close = Long_Data_input_close == "1.Open" ? open : Long_Data_input_close == "2.High" ? high : Long_Data_input_close == "3.Low" ? low : Long_Data_input_close == "4.Close" ? close : Long_Data_input_close == "5.HL2" ? hl2 : Long_Data_input_close == "6.HLC3" ? hlc3 : Long_Data_input_close == "7.OHLC4" ? ohlc4 : Long_Data_input_close == "8.OC2" ? oc2: close

preS_MA_Short_close = ma_type_close_Short == "1. SMA" ? sma(source_Short_close, len_Short_close) : ma_type_close_Short == "2. PCMA"? (highest(high, len_Short_close) + lowest(low, len_Short_close)) / 2 : ma_type_close_Short == "3. EMA" ? ema(source_Short_close, len_Short_close) : ma_type_close_Short == "4. WMA" ? wma(source_Short_close, len_Short_close) : ma_type_close_Short == "5. DEMA" ? (2 * ema(source_Short_close,len_Short_close) - ema(ema(source_Short_close,len_Short_close), len_Short_close)) : ma_type_close_Short == "6. ZLEMA" ? ema(source_Short_close + (source_Short_close - source_Short_close[lag_Short_close]), len_Short_close) : na
preS_MA_Long_close = ma_type_close_Long == "1. SMA" ? sma(source_Long_close, len_Long_close) : ma_type_close_Long == "2. PCMA"? (highest(high, len_Long_close) + lowest(low, len_Long_close)) / 2 : ma_type_close_Long == "3. EMA" ? ema(source_Long_close, len_Long_close) : ma_type_close_Long == "4. WMA" ? wma(source_Long_close, len_Long_close) : ma_type_close_Long == "5. DEMA" ? (2 * ema(source_Long_close,len_Long_close) - ema(ema(source_Long_close,len_Long_close), len_Long_close)) : ma_type_close_Long == "6. ZLEMA" ? ema(source_Long_close + (source_Long_close - source_Long_close[lag_Long_close]), len_Long_close) : na

TFsecurity_close_Short=timeFrame_close_Short=="4H"?60*4:timeFrame_close_Short=="3H"?60*3:timeFrame_close_Short=="2H"?60*2:timeFrame_close_Short=="1H"?60:timeFrame_close_Short=="45m"?45:timeFrame_close_Short=="30m"?30:timeFrame_close_Short=="20m"?20:timeFrame_close_Short=="15m"?15:timeFrame_close_Short=="10m"?10:timeFrame_close_Short=="5m"?5:timeFrame_close_Short=="3m"?3:1
TFsecurity_close_Long=timeFrame_close_Long=="4H"?60*4:timeFrame_close_Long=="3H"?60*3:timeFrame_close_Long=="2H"?60*2:timeFrame_close_Long=="1H"?60:timeFrame_close_Long=="45m"?45:timeFrame_close_Long=="30m"?30:timeFrame_close_Long=="20m"?20:timeFrame_close_Long=="15m"?15:timeFrame_close_Long=="10m"?10:timeFrame_close_Long=="5m"?5:timeFrame_close_Long=="3m"?3:1

pre_MA_close_Short = isEnableShortCustomClose? security(syminfo.tickerid, timeFrame_close_Short=="Current."?timeframe.period:tostring(TFsecurity_close_Short), preS_MA_Short_close) : preS_MA_Short_close
pre_MA_close_Long = isEnableLongCustomClose?  security(syminfo.tickerid, timeFrame_close_Long=="Current."?timeframe.period:tostring(TFsecurity_close_Long), preS_MA_Long_close) : preS_MA_Long_close

MA_Short_close =  (round(pre_MA_close_Short * mult) / mult)[offset_Short_close]
MA_Long_close = (round(pre_MA_close_Long * mult) / mult)[offset_Long_close]

countShifts_Long = 0
countShifts_Long:=long1_isActive?countShifts_Long+1:countShifts_Long
countShifts_Long:=long2_isActive?countShifts_Long+1:countShifts_Long
countShifts_Long:=long3_isActive?countShifts_Long+1:countShifts_Long
countShifts_Long:=long4_isActive?countShifts_Long+1:countShifts_Long
avgPriceForLotShiftLong_Data_input = MA_Long+ (MA_Long*((shift_Long1_percent+shift_Long2_percent+shift_Long3_percent+shift_Long4_percent)/countShifts_Long/100))

countShifts_Short = 0
countShifts_Short:=short1_isActive?countShifts_Short+1:countShifts_Short
countShifts_Short:=short2_isActive?countShifts_Short+1:countShifts_Short
countShifts_Short:=short3_isActive?countShifts_Short+1:countShifts_Short
countShifts_Short:=short4_isActive?countShifts_Short+1:countShifts_Short
avgPriceForLotShiftShort_Data_input = MA_Short + (MA_Short*((shift_Short1_percent+shift_Short2_percent+shift_Short3_percent+shift_Short4_percent)/countShifts_Short/100))
strategy.initial_capital = 50000
balance=strategy.initial_capital + strategy.netprofit
lotlong = 0.0
lotshort = 0.0
lotlong := (balance / avgPriceForLotShiftLong_Data_input) * (lotsize_Long / 100)     //strategy.position_size == 0 ? (strategy.equity / close) * (lotsize_Long / 100) : lotlong[1]
lotshort := (balance / avgPriceForLotShiftShort_Data_input) * (lotsize_Short / 100)    //strategy.position_size == 0 ? (strategy.equity / close) * (lotsize_Short / 100) : lotshort[1]
lotlong:= lotlong>1000000000?1000000000:lotlong
lotshort:=lotshort>1000000000?1000000000:lotshort

if isLotSizeAvgShifts==false
    lotlong := (strategy.equity / open) * (lotsize_Long / 100) 
    lotshort := (strategy.equity / open) * (lotsize_Short / 100) 

value_deviationLong=0.0
value_deviationShort=0.0

if(isEnableLongCustomClose == false )
    MA_Long_close:=MA_Long
else 
    value_deviationLong := round(MA_Long_close * longDeviation /100 * mult) / mult
    
if(isEnableShortCustomClose == false )
    MA_Short_close:=MA_Short
else 
    value_deviationShort := round(MA_Short_close * shortDeviation /100 * mult) / mult

if MA_Short > 0 and lotshort > 0// and strategy.position_size<=0
    lotShort_Data_input = strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    strategy.entry("S1", strategy.short, lotshort, limit = Level_Short1, when = (lotShort_Data_input == 0  and short1_isActive and is_time_true ))

    lotShort_Data_input := strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    strategy.entry("S2", strategy.short, lotshort, limit = Level_Short2, when = (lotShort_Data_input <= 1 and short2_isActive and is_time_true ))

    lotshort3 = isEnableDoubleLotShift3_Short? lotshort*2 :lotshort
    lotShort_Data_input := strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    maxLotsshift3=isEnableDoubleLotShift3_Short?3:2
    strategy.entry("S3", strategy.short, lotshort3, limit = Level_Short3, when = (lotShort_Data_input <= maxLotsshift3 and short3_isActive and is_time_true ))

    lotShort_Data_input := strategy.position_size < 0 ? round(abs(strategy.position_size) / lotshort) : 0.0
    maxLotsshift4=isEnableDoubleLotShift3_Short?4:3
    strategy.entry("S4", strategy.short, lotshort, limit = Level_Short4, when = (lotShort_Data_input <= maxLotsshift4 and short4_isActive and is_time_true))
    
    strategy.exit("TPS", "S1" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    strategy.exit("TPS", "S2" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    strategy.exit("TPS", "S3" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    strategy.exit("TPS", "S4" ,limit = MA_Short_close+value_deviationShort , when = is_time_true) 
    
if MA_Long > 0 and lotlong > 0// and strategy.position_size>=0
    lotLong_Data_input = strategy.position_size > 0 ? round(strategy.position_size / lotlong) : 0.0
    strategy.entry("L1", strategy.long, lotlong, limit = Level_Long1, when = (lotLong_Data_input ==0 and long1_isActive and is_time_true))
    
    lotLong_Data_input := strategy.position_size > 0 ?  round(strategy.position_size / lotlong) : 0.0
    strategy.entry("L2", strategy.long, lotlong, limit = Level_Long2, when = ( lotLong_Data_input <= 1 and long2_isActive and is_time_true))
        
    lotlong3 = isEnableDoubleLotShift3_Long? lotlong*2 : lotlong 
    lotLong_Data_input := strategy.position_size > 0 ? round(strategy.position_size / lotlong) : 0.0
    maxLotsshift3=isEnableDoubleLotShift3_Long?3:2
    strategy.entry("L3", strategy.long, lotlong3, limit = Level_Long3, when = (lotLong_Data_input <= maxLotsshift3 and long3_isActive and is_time_true))
    
    maxLotsshift4=isEnableDoubleLotShift3_Long?4:3
    lotLong_Data_input := strategy.position_size > 0 ? round(strategy.position_size / lotlong) : 0.0
    strategy.entry("L4", strategy.long, lotlong, limit = Level_Long4, when = ( lotLong_Data_input<maxLotsshift4 and long4_isActive and is_time_true))
    
    strategy.exit( "TPL", "L1",limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    strategy.exit( "TPL", "L2", limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    strategy.exit( "TPL", "L3", limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    strategy.exit( "TPL", "L4", limit = MA_Long_close+value_deviationLong, when = is_time_true) 
    
if (MA_Long_close < close)
    strategy.close("L1")
    strategy.close("L2")
    strategy.close("L3")
    strategy.close("L4")

if (MA_Short_close > close)
    strategy.close("S1")
    strategy.close("S2")
    strategy.close("S3")
    strategy.close("S4")
    
if time > timestamp(2000+year_End, month_End, day_End, 23, 59)
    strategy.close_all()
    strategy.cancel("L1")
    strategy.cancel("L2")
    strategy.cancel("L3")
    strategy.cancel("S1")
    strategy.cancel("S2")
    strategy.cancel("S3")
    
//Lines
colorlong = color.green
colorshort = color.red

value_long1 = long1_isActive ? Level_Long1 : na
value_long2 = long2_isActive ? Level_Long2 : na
value_long3 = long3_isActive ? Level_Long3 : na
value_long4 = long4_isActive ? Level_Long4 : na
value_short1 = short1_isActive ? Level_Short1 : na
value_short2 = short2_isActive ? Level_Short2 : na
value_short3 = short3_isActive ?Level_Short3 : na
value_short4 = short4_isActive? Level_Short4 : na

value_maShort_close= isEnableShortCustomClose ? MA_Short_close : na
value_maLong_close= isEnableLongCustomClose ? MA_Long_close : na

plot(value_maShort_close + value_deviationShort, offset = 1, color = color.orange, title = "MA line Short Close")

plot(value_short4, offset = 1, color = colorshort, title = "Short Shift 4")
plot(value_short3, offset = 1, color = colorshort, title = "Short Shift 3")
plot(value_short2, offset = 1, color = colorshort, title = "Short Shift 2")
plot(value_short1, offset = 1, color = colorshort, title = "Short Shift 1")
plot(countShifts_Short>0 and lotsize_Short>0 ? MA_Short:na, offset = 1, color = color.purple, title = "MA line Short")
plot(countShifts_Long>0 and lotsize_Long>0? MA_Long:na, offset = 1, color = color.lime, title = "MA line Long")
plot(value_long1, offset = 1, color = colorlong, title = "Long Shift 1")
plot(value_long2, offset = 1, color = colorlong, title = "Long Shift 2")
plot(value_long3, offset = 1, color = colorlong, title = "Long Shift 3")
plot(value_long4, offset = 1, color = colorlong, title = "Long Shift 4")

plot(value_maLong_close + value_deviationLong, offset = 1, color = color.blue, title = "MA line Long Close")

Thêm nữa