Количественная стратегия Myo_LS_D - это двойная стратегия отслеживания стоп-прибыли, основанная на длинных и коротких позициях. Стратегия сочетает в себе несколько индикаторов, таких как скользящие средние, прорывы цен и коэффициенты риска и доходности для создания торговых сигналов. Она достигает высокого уровня выигрыша и уровня прибыли на основе точного суждения о тренде.
Стратегия состоит в основном из модуля оценки тренда, модуля длинной позиции, модуля короткой позиции, модуля отслеживания стоп-прибыли и т.д.
Модуль оценки тренда использует канал Donchain для определения общего направления тренда.
Модуль длинной позиции учитывает такие факторы, как новые максимумы, минимумы, длинные скользящие средние позиции и т. д. Модуль короткой позиции учитывает новые максимумы, минимумы, короткие скользящие средние позиции и другие факторы. Это обеспечивает открытие позиций при прорыве критических ценовых точек вверх или вниз.
Модуль отслеживания стоп-прибыли использует две скользящие средние SMA разных циклов для отслеживания изменений цен в режиме реального времени. Когда цена проходит через линию скользящей средней, позиция закрывается для получения прибыли. Этот вид отслеживания в режиме реального времени может максимизировать прибыль от тренда.
Установка стоп-потери учитывает увеличенную стоп-потерю, чтобы держать точку стоп-потерь далеко от уровня поддержки, чтобы избежать нокаута.
Наибольшее преимущество этой стратегии заключается в том, что она создает и отслеживает отдельные длинные и короткие позиции.
Отдельные длинные и короткие позиции могут максимизировать возможности получения прибыли за счет использования односторонних трендовых торговых возможностей.
Отслеживание стоп-прибыли может получить более высокую маржу прибыли за счет корректировки в режиме реального времени.
Увеличенные остановки могут уменьшить вероятность нокаута и снизить риск потерь.
Основные риски этой стратегии сосредоточены в следующих точках:
Оптимизация может быть достигнута путем соответствующей корректировки параметров Donchain или добавления других индикаторов для суждения.
Отслеживание стоп-прибыли слишком агрессивно и может преждевременно остановить прибыль, не будучи в состоянии поддерживать прибыль.
Размер стоп-лосса слишком мал, что может увеличить вероятность нокаута. Соответствующее расширение величины стоп-лосса может смягчить риски.
Основными направлениями оптимизации этой стратегии являются:
Оптимизировать модуль оценки тренда для повышения точности оценки.
Например, перемещение линий стоп-прифта пропорционально.
Расширение диапазона стоп-потери или рассмотрение остановок сжатия может еще больше снизить вероятность нокаута.
Различные сорта имеют разные параметры. Оптимальные комбинации параметров могут быть получены посредством обучения для дальнейшего улучшения прибыли от стратегии.
В целом, стратегия Myo_LS_D является относительно зрелой и стабильной двухуровневой стратегией стоп-прибыли. Она имеет очевидные преимущества и контролируемые риски. Это одно из количественных решений, которое стоит держать в долгосрочной перспективе. Будущие оптимизации могут обеспечить непрерывное улучшение производительности, чтобы сделать ее еще более превосходной количественной стратегией.
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 4h 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/ // © agresiynin //@version=5 // ©Myo_Pionex strategy( title = "Myo_simple strategy_LS_D", shorttitle = "Myo_LS_D", overlay = true ) // var lowest_price = ta.lowest(low, 200) highest_price = ta.highest(high, 200) min_800 = ta.lowest(low, 800) max_800 = ta.highest(high, 800) tp_target_L = min_800 + (max_800 - min_800) * math.rphi tp_target_S = max_800 - (max_800 - min_800) * math.rphi sl_length_L = input.int(100, "做多的止損長度", minval = 50, maxval = 300, step = 50) sl_length_S = input.int(100, "做空的止損長度", minval = 50, maxval = 300, step = 50) sl_L = lowest_price * (1 - 0.005) sl_S = highest_price * (1 + 0.005) rrr_L = tp_target_L - sl_L / sl_L rrr_S = ta.lowest(low, 800) + ta.highest(high, 800) - ta.lowest(low, 800) * math.rphi / ta.highest(high, 200) + 0.005 * ta.highest(high, 200) - ta.lowest(low, 200) - 0.005 * ta.lowest(low, 200) smalen1 = input.int(10, "做多追蹤止盈SMA長度1", options = [5, 10, 20, 40, 60, 80]) smalen2 = input.int(20, "做多追蹤止盈SMA長度2", options = [5, 10, 20, 40, 60, 80]) smalen1_S = input.int(5, "做空追蹤止盈SMA長度1", options = [5, 10, 20, 40, 60, 80]) smalen2_S = input.int(10, "做空追蹤止盈SMA長度2", options = [5, 10, 20, 40, 60, 80]) TrendLength_L = input.int(400, "做多趨勢線", options = [100, 200, 300, 400, 500]) TrendLength_S = input.int(300, "做空趨勢線", options = [100, 200, 300, 400, 500]) SMA1 = ta.sma(close, smalen1) SMA2 = ta.sma(close, smalen2) SMA1_S = ta.sma(close, smalen1_S) SMA2_S = ta.sma(close, smalen2_S) shortlength = input.int(20, "短期均價K線數量") midlength = input.int(60, "中期均價K線數量") longlength = input.int(120, "長期均價K線數量") ShortAvg = math.sum(close, shortlength)/shortlength MidAvg = math.sum(close, midlength)/midlength LongAvg = math.sum(close, longlength)/longlength // Trend basePeriods = input.int(8, minval=1, title="趨勢基準線") basePeriods_Short = input.int(26, "做空基準線") donchian(len) => math.avg(ta.lowest(len), ta.highest(len)) baseLine = donchian(basePeriods) baseLine_Short = donchian(basePeriods_Short) trend = request.security(syminfo.tickerid, "D", baseLine) isUptrend = false isDowntrend = false baseLine_D = request.security(syminfo.tickerid, "D", baseLine) plot(baseLine_D, color=#B71C1C, title="趨勢基準線") if close[0] > baseLine_D isUptrend := true if close[0] < baseLine_Short isDowntrend := true // Long // Condition // entry con_a = low > lowest_price ? 1 : 0 con_b = high > highest_price ? 1 : 0 con_c = close[0] > ta.sma(close, TrendLength_L) ? 1 : 0 con_d = isUptrend ? 1 : 0 con_e = rrr_L > 3 ? 1 : 0 con_a1 = close[0] > ShortAvg[shortlength] ? 1 : 0 con_b1 = close[0] > MidAvg[midlength] ? 1 : 0 // close con_f = ta.crossunder(close, SMA1) and ta.crossunder(close, SMA2) ? 1 : 0 con_g = close < ta.lowest(low, sl_length_L)[1] * (1 - 0.005) ? 1 : 0 // exit con_h = tp_target_L // Main calculation LongOpen = false AddPosition_L = false if con_a + con_b + con_c + con_e + con_a1 + con_b1 >= 4 and con_d >= 1 LongOpen := true // Short // Condition // entry con_1 = high < highest_price ? 1 : 0 con_2 = low < lowest_price ? 1 : 0 con_3 = close[0] < ta.sma(close, TrendLength_S) ? 1 : 0 con_4 = isDowntrend ? 1 : 0 con_5 = rrr_S > 3 ? 1 : 0 con_11 = close[0] < ShortAvg[shortlength] ? 1 : 0 con_12 = close[0] < MidAvg[midlength] ? 1 : 0 // close con_6 = ta.crossover(close, SMA1_S) and ta.crossover(close, SMA2_S) ? 1 : 0 con_7 = close > ta.highest(high, sl_length_S)[1] * (1 + 0.005) ? 1 : 0 // exit con_8 = tp_target_S // Main calculation ShortOpen = false AddPosition_S = false if con_1 + con_2 + con_3 + con_4 + con_5 + con_11 + con_12 >= 5 ShortOpen := true // // execute // strategy.initial_capital = 50000 if strategy.position_size == 0 if LongOpen strategy.entry("Long Open" , strategy.long , comment= "Long Open " + str.tostring(close[0]), qty=strategy.initial_capital/close[0]) if strategy.position_size > 0 if (con_f > 0 or con_g > 0 or ShortOpen) and close <= baseLine_D strategy.close_all(comment="Close Long " + str.tostring(close[0])) if strategy.position_size == 0 if ShortOpen strategy.entry("Short Open" , strategy.short , comment= "Short Open " + str.tostring(close[0]), qty=strategy.initial_capital/close[0]) if strategy.position_size < 0 if (con_6 > 0 or con_7 > 0 or LongOpen) and close >= baseLine_D strategy.close_all(comment="Close Short " + str.tostring(close[0])) plot(ta.sma(close, TrendLength_L), color=#e5c212, title="LTradeTrend") plot(ta.sma(close, TrendLength_S), color=#1275e5, title="STradeTrend") plot(SMA1, "SMA1", color = color.lime, linewidth = 2) plot(SMA2, "SMA2", color = color.rgb(255, 0, 255), linewidth = 2)