
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.
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.
O sistema de tomada de decisão de transações de marisco tem as seguintes vantagens:
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.
Gerenciamento de risco: o uso de gestão de fundos e de stop loss para controlar o risco de perda individual e global.
Gerenciamento de acréscimo: o acréscimo apropriado permite obter lucros adicionais na tendência.
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.
Simples e claro: as regras de geração de sinais são simples, diretas, fáceis de entender e verificar.
O sistema de decisão de negociação de criptomoedas também apresenta alguns riscos:
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.
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.
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.
O sistema de tomada de decisão de transações de marcas também pode ser otimizado em:
Adição de filtros: detecta a intensidade da ruptura do preço e filtra algumas falsas rupturas.
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.
Optimização de parâmetros de segmentação: combinação de parâmetros de otimização para diferentes características de variedades.
Aumentar a aprendizagem de máquina: usar algoritmos de aprendizagem de máquina para auxiliar na direção das tendências.
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.
/*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') // 高亮空头趋势