Myo_LS_D Количественная стратегия

Автор:Чао Чжан, Дата: 2024-01-15 14:56:03
Тэги:

img

Обзор

Количественная стратегия Myo_LS_D - это двойная стратегия отслеживания стоп-прибыли, основанная на длинных и коротких позициях. Стратегия сочетает в себе несколько индикаторов, таких как скользящие средние, прорывы цен и коэффициенты риска и доходности для создания торговых сигналов. Она достигает высокого уровня выигрыша и уровня прибыли на основе точного суждения о тренде.

Принцип

Стратегия состоит в основном из модуля оценки тренда, модуля длинной позиции, модуля короткой позиции, модуля отслеживания стоп-прибыли и т.д.

  1. Модуль оценки тренда использует канал Donchain для определения общего направления тренда.

  2. Модуль длинной позиции учитывает такие факторы, как новые максимумы, минимумы, длинные скользящие средние позиции и т. д. Модуль короткой позиции учитывает новые максимумы, минимумы, короткие скользящие средние позиции и другие факторы. Это обеспечивает открытие позиций при прорыве критических ценовых точек вверх или вниз.

  3. Модуль отслеживания стоп-прибыли использует две скользящие средние SMA разных циклов для отслеживания изменений цен в режиме реального времени. Когда цена проходит через линию скользящей средней, позиция закрывается для получения прибыли. Этот вид отслеживания в режиме реального времени может максимизировать прибыль от тренда.

  4. Установка стоп-потери учитывает увеличенную стоп-потерю, чтобы держать точку стоп-потерь далеко от уровня поддержки, чтобы избежать нокаута.

Анализ преимуществ

Наибольшее преимущество этой стратегии заключается в том, что она создает и отслеживает отдельные длинные и короткие позиции.

  1. Отдельные длинные и короткие позиции могут максимизировать возможности получения прибыли за счет использования односторонних трендовых торговых возможностей.

  2. Отслеживание стоп-прибыли может получить более высокую маржу прибыли за счет корректировки в режиме реального времени.

  3. Увеличенные остановки могут уменьшить вероятность нокаута и снизить риск потерь.

Риски и решения

Основные риски этой стратегии сосредоточены в следующих точках:

  1. Оптимизация может быть достигнута путем соответствующей корректировки параметров Donchain или добавления других индикаторов для суждения.

  2. Отслеживание стоп-прибыли слишком агрессивно и может преждевременно остановить прибыль, не будучи в состоянии поддерживать прибыль.

  3. Размер стоп-лосса слишком мал, что может увеличить вероятность нокаута. Соответствующее расширение величины стоп-лосса может смягчить риски.

Руководство по оптимизации

Основными направлениями оптимизации этой стратегии являются:

  1. Оптимизировать модуль оценки тренда для повышения точности оценки.

  2. Например, перемещение линий стоп-прифта пропорционально.

  3. Расширение диапазона стоп-потери или рассмотрение остановок сжатия может еще больше снизить вероятность нокаута.

  4. Различные сорта имеют разные параметры. Оптимальные комбинации параметров могут быть получены посредством обучения для дальнейшего улучшения прибыли от стратегии.

Резюме

В целом, стратегия 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)

Больше