Sistema de decisão de negociação de tartarugas


Data de criação: 2024-02-29 14:28:25 última modificação: 2024-02-29 14:28:25
cópia: 4 Cliques: 912
1
focar em
1617
Seguidores

Sistema de decisão de negociação de tartarugas

Visão geral

O sistema de decisão de negociação da Beira é uma estratégia de negociação de seguimento de tendências baseada na teoria das rupturas. Ele gera sinais de negociação através de médias móveis dos preços mais altos e mais baixos das variedades de negociação, permitindo a identificação de tendências potenciais. Ele gera sinais de negociação quando os preços atingem o preço mais alto ou mais baixo dentro do período especificado.

Princípio da estratégia

Os sinais de estratégia central do sistema de decisão de negociação de criptomoedas são gerados pela comparação do preço com o preço máximo do ciclo N1 e o preço mínimo do ciclo N2. Quando o preço atravessa o máximo do ciclo N1, um sinal de compra é gerado; Quando o preço atravessa o mínimo do ciclo N2 abaixo do preço, um sinal de venda é gerado. O modo de fechamento é usado para controlar a geração de novos sinais.

Após a abertura da posição, será comparada em tempo real a relação entre o preço e o preço de parada, gerando um sinal de parada móvel. Ao mesmo tempo, também será comparada a relação entre o preço e a linha de acréscimo, gerando um sinal de acréscimo. O preço de parada e a linha de acréscimo estão relacionados ao ATR.

Cada vez que uma posição é aberta, a unidade de posse é calculada para evitar o impacto de uma única perda no capital total, retirando uma certa proporção do capital inicial. A perda individual é limitada a um certo limite.

Análise de vantagens

O sistema de tomada de decisão de transações de marisco tem as seguintes vantagens:

  1. Capturar tendências potenciais: Comparando a relação entre os preços e os preços mais altos e mais baixos do ciclo, para determinar a direção das tendências potenciais, é possível capturar tendências potenciais de preços mais cedo.

  2. Gerenciamento de risco: o uso de gestão de fundos e de stop loss para controlar o risco de perda individual e global.

  3. Gerenciamento de acréscimo: o acréscimo apropriado permite obter lucros adicionais na tendência.

  4. Integridade: Combina gestão de fundos, gestão de perdas e gestão de acréscimos para tornar o sistema de decisão mais completo.

  5. Simples e claro: as regras de geração de sinais são simples, diretas, fáceis de entender e verificar.

Análise de Riscos

O sistema de decisão de negociação de criptomoedas também apresenta alguns riscos:

  1. Risco de falsa ruptura: o preço pode ocorrer quando a ruptura falsa do preço mais alto ou mais baixo, causando sinais errados. Pode-se ajustar adequadamente os parâmetros para filtrar algumas falsas rupturas.

  2. Risco de reversão de tendência: existe o risco de reversão de preços após a acumulação de posições, resultando em maiores perdas. O número de acumulações deve ser adequadamente limitado e as perdas devem ser interrompidas em tempo hábil.

  3. Risco de otimização de parâmetros: Diferentes configurações de parâmetros de mercado podem ser muito diferentes. Os parâmetros de otimização de mercado devem ser divididos para reduzir o risco.

Direção de otimização

O sistema de tomada de decisão de transações de marcas também pode ser otimizado em:

  1. Adição de filtros: detecta a intensidade da ruptura do preço e filtra algumas falsas rupturas.

  2. Otimização da estratégia de stop loss: como rastrear de forma racional o stop loss e encontrar o equilíbrio entre proteger os lucros e reduzir o stop loss desnecessário.

  3. Optimização de parâmetros de segmentação: combinação de parâmetros de otimização para diferentes características de variedades.

  4. Aumentar a aprendizagem de máquina: usar algoritmos de aprendizagem de máquina para auxiliar na direção das tendências.

Resumir

O sistema de decisão de negociação de praias julga a direção da tendência potencial comparando o preço com a relação entre o preço mais alto e o preço mais baixo no período especificado e, em combinação com o módulo de gerenciamento de risco, constrói todo o sistema de decisão. Ele possui uma capacidade de acompanhamento de tendências mais forte, mas também possui alguns problemas de otimização de parâmetros e risco de falso rompimento.

Código-fonte da estratégia
/*backtest
start: 2024-01-29 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
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/
// © 李和邪 
// 本脚本所有内容只适用于交流学习,不构成投资建议,所有后果自行承担。
//@version=5
strategy(title='Turtle Trading Strategy@lihexie',
   shorttitle='OKX-海龟交易系统@李和邪',
   overlay=true,
   pyramiding=4,
   initial_capital = 1000,
   default_qty_type = strategy.percent_of_equity,
   default_qty_value=100,
   slippage = 0,
   commission_type = strategy.commission.percent,
   commission_value = 0.05)

// 输入参数
from_date = input(timestamp("2013-01-01T00:00:00+08:00"), "From Date/开始日期")
end_date = input(timestamp("2024-08-01T00:00:00+08:00"), "To Date/结束日期")
valid_date() => true
current_mode = input.string("Mode 1", "Enter Mode/进场系统",['Mode 1','Mode 2'])
// mode 1
entry_length = input.int(20, 'Entry Length/系统1进场长度', minval=1)  // 进场长度
exit_length = input.int(10, 'Exit Length/系统2出场长度', minval=1)  // 出场长度
// mode 2
entry_length_mode2 = input.int(55, 'Mode2 Entry Length/系统2进场长度', minval=1)  // 进场长度
exit_length_mode2 = input.int(20, 'Mode2 Exit Length/系统2出场长度', minval=1) 
atr_period = input.int(14, "ATR Period/计算ATR的周期", minval=1)  // ATR周期
risk_per_trade = input.float(0.02, "Risk Per Trade/每笔交易的风险,0.02就是2%", minval=0.001, maxval=1)  // 每笔交易的风险
initial_stop_atr_multiple = input.float(2, "Initial Stop ATR Multiple/止损使用的ATR倍数", minval=0.1, maxval=10)  // 初始止损ATR倍数
pyramid_atr_multiple = input.float(0.5, "Pyramid ATR Multiple/加仓使用的ATR倍数", minval=0.1, maxval=10)  // 加仓ATR倍数
max_units = input.int(4, "Max Units/最大头寸单位数", minval=1, maxval=10)  // 最大头寸单位数

highlighting = input(title='Highlighter On/Off ?/是否高亮显示', defval=true)  // 是否高亮显示


// 初始化变量
var int units = 0
var float trailing_stop_long = na
var float trailing_stop_short = na
var float real_entry_price_long = na
var float real_entry_price_short = na
var float add_unit_price_long = na
var float add_unit_price_short = na
var bool last_trade_win = false
// 计算ATR
atr = ta.atr(atr_period)

// 计算单位大小
unit_size = (strategy.equity * risk_per_trade) / (initial_stop_atr_multiple * atr)

// 切换模式
mode_signal = current_mode == "Mode 1" ? (last_trade_win==false?true:false) : true

float entry_price_long = na
float entry_price_short = na
float exit_price_long = na
float exit_price_short = na
// 计算进场和出场价格
if current_mode == "Mode 1"
    entry_price_long := ta.highest(entry_length)
    entry_price_short := ta.lowest(entry_length)
    exit_price_long := ta.lowest(exit_length)
    exit_price_short := ta.highest(exit_length)
else
    entry_price_long := ta.highest(entry_length_mode2)
    entry_price_short := ta.lowest(entry_length_mode2)
    exit_price_long := ta.lowest(exit_length_mode2)
    exit_price_short := ta.highest(exit_length_mode2)

// 计算止损价格
stop_price_long = entry_price_long - (initial_stop_atr_multiple * atr)
stop_price_short = entry_price_short + (initial_stop_atr_multiple * atr)

// 交易逻辑
// 生成买入和卖出信号
long_signal = ta.crossover(close, entry_price_long[1]) and strategy.position_size==0 and valid_date()
short_signal = ta.crossunder(close, entry_price_short[1]) and strategy.position_size==0 and valid_date()
// 生成出场信号
exit_long_signal = ta.crossunder(close, exit_price_long[1]) and strategy.position_size > 0 and valid_date()
exit_short_signal = ta.crossover(close, exit_price_short[1]) and strategy.position_size < 0 and valid_date()

if long_signal 
    if mode_signal
        strategy.entry("Long", strategy.long, qty=unit_size, stop=stop_price_long)
        units := 1
        trailing_stop_long := stop_price_long
        real_entry_price_long := close
        add_unit_price_long := real_entry_price_long+pyramid_atr_multiple*atr
    else
        last_trade_win:=false
if short_signal 
    if mode_signal
        strategy.entry("Short", strategy.short, qty=unit_size, stop=stop_price_short)
        units := 1
        trailing_stop_short := stop_price_short
        real_entry_price_short := close
        add_unit_price_short := real_entry_price_short-pyramid_atr_multiple*atr
    else
        last_trade_win:=false
// 出场逻辑
if exit_long_signal
    last_trade_win := strategy.position_avg_price<close?true:false
    strategy.close_all("SL")
    units := 0
    real_entry_price_long := na
    add_unit_price_long := na
    trailing_stop_long := na
if exit_short_signal
    last_trade_win := strategy.position_avg_price>close?true:false
    strategy.close_all("SS")
    units := 0
    real_entry_price_short := na
    add_unit_price_short := na
    trailing_stop_short := na

// 生成加仓信号
add_unit_signal = (close > add_unit_price_long or close < add_unit_price_short) and units[1] < max_units and valid_date()
// 加仓逻辑
if add_unit_signal
    if strategy.position_size > 0
        strategy.entry("AL", strategy.long, qty=unit_size)
        real_entry_price_long := close
        add_unit_price_long := real_entry_price_long+pyramid_atr_multiple*atr
        trailing_stop_long := real_entry_price_long - (initial_stop_atr_multiple * atr)
    if strategy.position_size < 0
        strategy.entry("AS", strategy.short, qty=unit_size)
        real_entry_price_short := close
        add_unit_price_short := real_entry_price_short-pyramid_atr_multiple*atr
        trailing_stop_short := real_entry_price_short + (initial_stop_atr_multiple * atr)
    units := units + 1

// 移动止损逻辑
trailing_stop_long_signal = ta.crossunder(close, trailing_stop_long) and strategy.position_size > 0 and valid_date()
trailing_stop_short_signal = ta.crossover(close, trailing_stop_short) and strategy.position_size < 0 and valid_date()

if trailing_stop_long_signal
    last_trade_win := strategy.position_avg_price<close?true:false
    strategy.close_all("TSL")
    units := 0
    real_entry_price_long := na
    add_unit_price_long := na
    trailing_stop_long := na
if trailing_stop_short_signal
    last_trade_win := strategy.position_avg_price>close?true:false
    strategy.close_all("TSS")
    units := 0
    real_entry_price_short := na
    add_unit_price_short := na
    trailing_stop_short := na

// 美化图表
plot_entry_lowest = plot(entry_price_short, 'Lower', color=color.new(#0094FF, 0))  // 绘制进场最低线
plot_entry_highest = plot(entry_price_long, 'Upper', color=color.new(#0094FF, 0))  // 绘制进场最高线
entry_line = ta.barssince(short_signal) <= ta.barssince(long_signal) ? entry_price_short : entry_price_long  // 进场线
exit_line = ta.barssince(short_signal) <= ta.barssince(long_signal) ? exit_price_short : exit_price_long  // 出场线
plot(entry_line, title='Trend Line', color=color.new(#ff52f1, 0), linewidth=2)  // 绘制趋势线
plot_exit = plot(exit_line, title='Exit Line', color=color.new(color.blue, 0), linewidth=1, style=plot.style_circles)  // 绘制出场线

entry_long_color = highlighting and strategy.position_size>0 ? color.new(color.green, transp = 88) : na
entry_short_color = highlighting and strategy.position_size<0 ? color.new(color.red, transp = 88) : na
fill(plot_entry_highest, plot_exit, color=entry_long_color, title='Background') // 高亮多头趋势
fill(plot_entry_lowest, plot_exit, color=entry_short_color, title='Background') // 高亮空头趋势