Chiến lược theo dõi xu hướng kênh bao trung bình động


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

Chiến lược theo dõi xu hướng kênh bao trung bình động

Tổng quan

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

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

Nguyên tắc cốt lõi của chiến lược này dựa trên tính năng theo dõi xu hướng của đường trung bình di chuyển và phán đoán kênh của chỉ số Envelop. Chiến lược xây dựng đường trung bình di chuyển chuẩn bằng các tham số có thể cấu hình như chu kỳ đường trung bình di chuyển, loại mài dũa, nguồn giá. Sau đó, dựa trên giá trị chuyển đổi phần trăm được đặt cho các tham số, xây dựng đường đi lên xuống.

Chính sách này có những đặc điểm sau:

  1. hỗ trợ cho cả hoạt động tăng và giảm, để đánh giá xu hướng theo kênh tăng và giảm.

  2. Có thể mở tối đa 4 thẻ để thực hiện việc đặt hàng kim tự tháp bằng cách phân tầng theo đường cong để kiếm được nhiều tiền hơn.

  3. Có thể cấu hình trung bình di chuyển mở và trung bình di chuyển độc lập để thực hiện dừng lỗ chính xác.

Hỗ trợ tính toán trung bình di chuyển trong các chu kỳ thời gian khác nhau (từ 1 phút đến 1 ngày) và kết hợp nhiều khung thời gian.

  1. Mạng trung bình chuyển động của kho mở và kho hỗ trợ 6 tùy chọn chế độ trơn khác nhau, có thể được tối ưu hóa cho các giống và chu kỳ khác nhau.

  2. Có thể nhập số lượng di chuyển tích cực âm để điều chỉnh kênh, theo đuổi đột phá chính xác hơn.

Các giao dịch cụ thể trong chiến lược này như sau:

  1. Tính trung bình chuyển động mở đầu cơ sở, đặt phần trăm theo tham số, có 4 đường phá vỡ.

  2. Khi giá phá vỡ đường dẫn dưới, hãy đặt nhiều thứ tự; khi giá phá vỡ đường dẫn trên, hãy đặt trần theo thứ tự.

  3. Tính toán trung bình di chuyển vị trí yên độc lập, làm đường dừng lỗ. Khi giá giảm xuống đường này một lần nữa, dừng lại cho nhiều đơn một lần; Khi giá phá vỡ đường này một lần nữa, dừng lại cho đơn một lần.

  4. Bạn có thể mở tối đa 4 thẻ để kiếm thêm tiền bằng cách sử dụng hệ thống kim tự tháp phân tầng.

Nguyên tắc của chiến lược này cho thấy rằng chiến lược này kết hợp các yếu tố như theo dõi xu hướng của đường trung bình di chuyển, tín hiệu đột phá của phán đoán kênh và thiết lập đường dừng độ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ế

Dựa trên mã chiến lược và phân tích logic, chiến lược theo dõi xu hướng kênh envelop trung bình di động này có những ưu điểm sau:

  1. Kết hợp nhiều khung thời gian, tăng khả năng nắm bắt xu hướng cấp lớn. Chiến lược hỗ trợ tính toán trung bình di chuyển trong các chu kỳ khác nhau từ 1 phút đến 1 ngày, có thể cấu hình mở vị trí và dừng lỗ bằng cách sử dụng trung bình di chuyển trong các chu kỳ khác nhau, kết hợp phán đoán xu hướng của nhiều khung thời gian, thuận lợi hơn để nắm bắt xu hướng cấp lớn.

  2. Phương pháp bồi thường kim tự tháp, theo đuổi lợi nhuận cao hơn. Chiến lược có thể mở tối đa 4 tờ, bằng cách cân bằng tỷ lệ lợi nhuận và lỗ hổng bằng cách tăng bồi thường theo cấp bậc, theo đuổi lợi nhuận cao hơn với giả định kiểm soát rủi ro.

  3. 6 mô hình trung bình di chuyển có thể lựa chọn, có khả năng thích ứng. Các mô hình 6 mô hình như trung bình di chuyển mở và dừng hỗ trợ SMA / EMA / trung bình di động di động, có thể được tối ưu hóa cho các giống và chu kỳ khác nhau, do đó cải thiện khả năng thích ứng.

  4. Dòng kênh có thể điều chỉnh, đánh giá đột phá chính xác. Chiến lược có thể nhập tham số phần trăm di chuyển kênh, điều chỉnh chiều rộng kênh, do đó có thể được tối ưu hóa cho các giống hoặc môi trường thị trường khác nhau, tăng độ chính xác của đánh giá đột phá.

  5. Đường dừng độc lập, giúp kiểm soát rủi ro. Chiến lược tính toán đường trung bình di chuyển độc lập như đường cân bằng, dừng lỗ trên đơn hoặc đơn trống, có thể làm giảm đáng kể rủi ro giao dịch, tránh tiêm theo dõi.

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

Phân tích rủi ro

Mặc dù chiến lược này có tính logic nghiêm ngặt và kiểm soát rủi ro, nhưng vẫn có một số rủi ro giao dịch cần lưu ý, bao gồm:

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

  2. Rủi ro phá vỡ thất bại. Trong thị trường cân bằng hoặc biến động, giá có thể giảm trở lại sau khi phá vỡ đường dẫn. Điều này sẽ gây ra tiêm theo dõi, cần phải giảm sự xuất hiện của tình huống này thông qua các tham số tối ưu hóa.

  3. Quản lý rủi ro giá trị mong đợi. Chiến lược đặt thêm 4 tầng để theo đuổi lợi nhuận cao hơn, điều này mang lại lợi nhuận đáng kể khi lợi nhuận, nhưng giá trị mong đợi giảm rõ rệt trong thời gian thua lỗ. Điều này đòi hỏi nhà đầu tư có khả năng quản lý tâm lý chuyên nghiệp.

  4. Nguy cơ điều chỉnh tín hiệu. Chiến lược liên quan đến việc điều chỉnh tối ưu hóa nhiều tham số, chẳng hạn như chiều rộng kênh, chu kỳ trung bình di chuyển, v.v. Điều này đòi hỏi các nhà phân tích định lượng chuyên nghiệp có kinh nghiệm tối ưu hóa để tránh rủi ro quá phù hợp.

  5. Rủi ro đặc biệt của thị trường. Các rủi ro cực đoan như Gap nhanh hoặc ngày giới hạn giá ngắn có thể phá vỡ rất nhiều logic chiến lược, trong trường hợp này cần chú ý đến các chỉ số rủi ro hệ thống và dừng lỗ kịp thời.

Nhìn chung, chiến lược này chủ yếu phụ thuộc vào xu hướng cấp lớn để kiếm lợi nhuận, 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 trong thời gian dài. Ngoài ra, tối ưu hóa đa tham số và kiểm soát tâm lý cũng là chìa khóa để đảm bảo lợi nhuận ổn định của chiến lược.

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

Các hướng tối ưu hóa chính tiếp theo cho chiến lược theo dõi xu hướng kênh envelop của trung bình di động bao gồm:

  1. Tự thích ứng tối ưu hóa đường dẫn và đường dừng dựa trên thuật toán học máy. Các mô hình đường dẫn và đường dừng có thể được đào tạo bằng thuật toán như LSTM, dự đoán đường dẫn, để dự đoán giá và tránh rủi ro thông minh hơn.

  2. Kết hợp với các chỉ số cảm xúc, tỷ lệ nắm giữ vị trí của tổ chức để tối ưu hóa các yếu tố phụ trợ như logic gia tăng. Có thể thêm các chỉ số như phán đoán sóng tuyệt đối, cảm xúc của thị trường, kiểm soát rủi ro trong danh mục, tối ưu hóa logic gia tăng vị trí kim tự tháp.

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

  4. Mở rộng phân tích liên kết của các loại tương tự, xây dựng hệ thống kiểm soát rủi ro thống nhất. Mở rộng chiến lược của một loại duy nhất hiện tại sang nhiều thị trường tương tự như hàng hóa, tiền kỹ thuật số, kiểm soát rủi ro thống nhất thông qua phân tích liên kết, nâng cao tính ổn định của chiến lược.

  5. Tăng khả năng giải thích chính sách, cải thiện khả năng sử dụng của người dùng. Sử dụng các phương pháp như SHAP để phân tích mức độ ảnh hưởng của từng biến nhập vào kết quả chính sách, sắp xếp tầm quan trọng đầu ra, làm cho logic chính sách được giải thích rõ ràng hơn cho người dùng.

Việc tiếp tục tối ưu hóa tính ổn định, tính xác thực và dễ sử dụng của chiến lược bằng cách giới thiệu các phương pháp thuật toán như học máy, mô hình đa yếu tố là những hướng nâng cao chính trong chiến lược tiếp theo.

Tóm tắt

Nhìn chung, chiến lược theo dõi xu hướng kênh động trung bình envelop này kết hợp ba yếu tố cốt lõi của việc theo dõi xu hướng của đường trung bình di chuyển, phán đoán xu hướng của chỉ số kênh và kiểm soát rủi ro của đường dừng độc lập. Trong thị trường xu hướng nghiêm ngặt, chiến lược có thể cung cấp sự thực hiện ổn định và có lợi nhuận đột phá.

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