Myo_LS_D Estratégia quantitativa

Autora:ChaoZhang, Data: 2024-01-15 14:56:03
Tags:

img

Resumo

A estratégia quantitativa Myo_LS_D é uma estratégia de stop-profit de rastreamento duplo baseada em posições longas e curtas. A estratégia combina múltiplos indicadores, como médias móveis, avanços de preços e rácios risco-retorno para construir sinais de negociação.

Princípio

A estratégia consiste principalmente num módulo de avaliação da tendência, um módulo de posição longa, um módulo de posição curta, um módulo de rastreamento de stop profit, etc.

  1. O módulo de julgamento de tendências usa o canal Donchain para determinar a direção geral da tendência.

  2. O módulo de posição longa leva em consideração fatores como novos máximos, mínimos, posições médias móveis longas, etc. O módulo de posição curta considera novos máximos, mínimos, posições médias móveis curtas e outros fatores.

  3. O módulo de rastreamento de stop profit usa duas médias móveis SMA de diferentes ciclos para rastrear mudanças de preço em tempo real.

  4. A configuração de stop loss considera a stop loss ampliada para manter o ponto de stop loss longe do nível de suporte para evitar ser nocauteado.

Análise das vantagens

A maior vantagem desta estratégia é a construção separada de posições longas e curtas e a estratégia de rastreamento de stop profit.

  1. As posições longas e curtas separadas podem maximizar as oportunidades de lucro através da captura de oportunidades de negociação de tendências unilaterais.

  2. O rastreamento do stop profit pode obter uma maior margem de lucro através de ajustes em tempo real.

  3. Paradas ampliadas podem reduzir a probabilidade de ser nocauteado e reduzir o risco de perdas.

Risco e soluções

Os principais riscos desta estratégia concentram-se nos seguintes pontos:

  1. O julgamento incorreto da tendência pode resultar em posições e perdas contrárias. A otimização pode ser alcançada ajustando adequadamente os parâmetros de Donchain ou adicionando outros indicadores para julgamento.

  2. O rastreamento do stop profit é muito agressivo e pode parar o lucro prematuramente sem ser capaz de sustentar ganhos.

  3. O intervalo de stop loss é muito pequeno, o que pode aumentar a probabilidade de ser nocauteado.

Orientações de otimização

As principais direcções de otimização para esta estratégia são:

  1. Otimizar o módulo de julgamento da tendência para melhorar a precisão do julgamento.

  2. Ajustar o método de rastreamento de stop profit para expandir ainda mais o espaço de lucro, por exemplo, mover linhas de stop profit proporcionalmente.

  3. A expansão do intervalo de stop loss ou a consideração de paradas de contração podem reduzir ainda mais a probabilidade de ser eliminado.

  4. Diferentes variedades têm parâmetros diferentes. Combinações ótimas de parâmetros podem ser obtidas através de treinamento para melhorar ainda mais os retornos da estratégia.

Resumo

Em geral, a estratégia Myo_LS_D é uma estratégia quantitativa relativamente madura e estável de rastreamento duplo de stop-profit. Ela tem vantagens óbvias e riscos controláveis. É uma das soluções quantitativas que vale a pena manter a longo prazo. As otimizações futuras podem permitir melhoria contínua do desempenho para torná-la uma estratégia quantitativa ainda mais superior.


/*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)

Mais.