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.
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.
O módulo de julgamento de tendências usa o canal Donchain para determinar a direção geral da tendência.
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.
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.
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.
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.
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.
O rastreamento do stop profit pode obter uma maior margem de lucro através de ajustes em tempo real.
Paradas ampliadas podem reduzir a probabilidade de ser nocauteado e reduzir o risco de perdas.
Os principais riscos desta estratégia concentram-se nos seguintes pontos:
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.
O rastreamento do stop profit é muito agressivo e pode parar o lucro prematuramente sem ser capaz de sustentar ganhos.
O intervalo de stop loss é muito pequeno, o que pode aumentar a probabilidade de ser nocauteado.
As principais direcções de otimização para esta estratégia são:
Otimizar o módulo de julgamento da tendência para melhorar a precisão do julgamento.
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.
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.
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.
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)