
El sistema de decisión de comercio de la playa es una estrategia de comercio de seguimiento de la tendencia basada en la teoría de la ruptura. Se trata de una estrategia de comercio de la identificación de la tendencia potencial mediante la generación de señales de comercio a través de las medias móviles de los precios más altos y más bajos de las variedades de comercio.
Las señales de estrategia centrales del sistema de decisión de comercio de la costa se generan mediante la comparación de la relación de magnitud de los precios con los máximos de los ciclos N1 y los mínimos de los ciclos N2. Cuando los precios suben a través de los máximos de los ciclos N1, se produce una señal de compra; cuando los precios bajan a través de los mínimos de los ciclos N2, se produce una señal de venta. El modo de cierre se utiliza para controlar la generación de nuevas señales.
Después de abrir una posición, se compara en tiempo real la relación entre el precio y el precio de parada, generando una señal de parada móvil. Al mismo tiempo, se compara la relación entre el precio y la línea de subida, generando una señal de subida. El precio de parada y la línea de subida están relacionados con el ATR.
Cada vez que se abre una posición, se calculan las unidades de tenencia para evitar el impacto de una sola pérdida en el capital total, tomando una cierta proporción del capital inicial. Las pérdidas individuales se limitan a un cierto rango.
El sistema de toma de decisiones para el comercio de mariscos tiene las siguientes ventajas:
Captura de tendencias potenciales: determina la dirección de las tendencias potenciales comparando la relación entre los precios y los máximos y mínimos del ciclo, para capturar las tendencias potenciales de precios antes.
Gestión de riesgos: el uso de la gestión de fondos y la detención de pérdidas para controlar el riesgo de pérdidas individuales y generales.
Gestión de la hipoteca: la hipoteca adecuada permite obtener ganancias adicionales en la tendencia.
Integridad: Combina la gestión de capital, la gestión de pérdidas y la gestión de acreedores para que el sistema de decisión sea más completo.
Simple y claro: las reglas de generación de señales son simples, directas, fáciles de entender y verificar.
El sistema de toma de decisiones de las transacciones de la playa también presenta algunos riesgos:
Riesgo de falsas rupturas: los precios pueden presentar falsas rupturas en los precios más altos o más bajos, causando una señal errónea. Se puede ajustar adecuadamente los parámetros para filtrar algunas falsas rupturas.
Riesgo de reversión de la tendencia: existe el riesgo de que la reversión de los precios después de la acumulación de posiciones conduzca a una mayor pérdida. Se debe limitar adecuadamente el número de acumulaciones de posiciones y detener las pérdidas a tiempo.
Optimización de parámetros de riesgo: los parámetros de configuración de diferentes mercados pueden ser muy diferentes, se debe dividir los parámetros de optimización de mercado para reducir el riesgo.
El sistema de toma de decisiones para las transacciones en la playa también puede ser optimizado en los siguientes aspectos:
Aumentar los filtros: detecta la intensidad de las rupturas en los precios y filtra las falsas rupturas.
Optimización de las estrategias de pérdidas: cómo rastrear razonablemente las pérdidas y encontrar el equilibrio entre proteger los beneficios y reducir las pérdidas innecesarias.
Optimización de parámetros de segmentación: combinación de parámetros de optimización para las características de las diferentes variedades.
Aumentar el aprendizaje automático: utilizar algoritmos de aprendizaje automático para ayudar a determinar la dirección de las tendencias.
El sistema de toma de decisiones de comercio de la playa determina la dirección de la tendencia potencial mediante la comparación de los precios con la relación de los precios más altos y más bajos en un período determinado, y se combina con el módulo de gestión de riesgos para construir todo el sistema de toma de decisiones. Tiene una fuerte capacidad de seguimiento de tendencias, pero también existe un cierto riesgo de falso avance y problemas de optimización de parámetros. La estrategia puede servir como un modelo básico de comercio cuantitativo y, sobre esta base, ampliarse y optimizarse para desarrollar su propio sistema de toma de decisiones.
/*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') // 高亮空头趋势