Система принятия решений по торговле черепахами

Автор:Чао Чжан, Дата: 2024-02-29 14:28:25
Тэги:

img

Обзор

Торговая система решения черепахи - это торговая стратегия, основанная на теории прорыва. Она генерирует торговые сигналы путем перемещения средних самых высоких и самых низких цен в течение определенных периодов для выявления потенциальных тенденций. Торговые сигналы генерируются, когда цены выходят выше или ниже самых высоких или самых низких цен в указанные периоды. Стратегия также включает в себя остановки, пирамиды и модули управления деньгами, чтобы сформировать относительно полную систему решения.

Принцип стратегии

Основные сигналы стратегии системы принятия решений торговой черепахи генерируются путем сравнения цены с самыми высокими ценами за периоды N1 и самыми низкими ценами за периоды N2. Длинный сигнал генерируется, когда цена пересекает высокую цену за периоды N1. Краткий сигнал генерируется, когда цена пересекает ниже самой низкой цены за периоды N2. Режим остановки используется для управления генерацией нового сигнала.

После открытия позиции цена будет сравниваться с ценой стоп-лосса в режиме реального времени, чтобы генерировать сигналы стоп-лосса. Кроме того, сравнивайте цену с линией добавления, чтобы генерировать сигналы пирамиды.

При каждом открытии позиции единица позиции рассчитывается с использованием определенного процента от начального капитала, чтобы избежать влияния единого убытка на общий капитал.

Анализ преимуществ

Система принятия решений по торговле черепахами имеет следующие преимущества:

  1. Установление потенциальных тенденций: путем сравнения цен с самыми высокими и самыми низкими ценами в течение периодов для определения потенциальных направлений тренда, потенциальные тенденции цен могут быть обнаружены раньше.

  2. Управление рисками: Использование управления деньгами и стоп-лосса для контроля отдельных и общих рисков потери.

  3. Управление пирамидами: надлежащая пирамида может получить дополнительную прибыль от тенденций.

  4. Целостность: объединение управления деньгами, управления стоп-лоссами и управления пирамидами делает систему принятия решений более полной.

  5. Простые и понятные: правила генерации сигнала просты и понятны, легко понять и проверить.

Анализ рисков

Система принятия решений о торговле черепахами также несет определенные риски:

  1. Риск ложного прорыва: цены могут иметь ложные прорывы выше или ниже самых высоких или самых низких цен, вызывая неправильные сигналы.

  2. Риск переворота тренда: существует риск того, что потеря увеличится после пирамидирования, когда цены перевернутся. Количество пирамидирования должно быть ограничено соответствующим образом и своевременно остановить потери.

  3. Оптимизация параметров риска: параметры могут сильно различаться для разных рынков, параметры должны быть оптимизированы отдельно для каждого рынка для снижения рисков.

Руководство по оптимизации

Система принятия решений по торговле черепахами также может быть оптимизирована в следующих аспектах:

  1. Добавьте фильтры: обнаружите импульс прорывов цен, чтобы отфильтровать ложные прорывы.

  2. Оптимизировать стратегии стоп-лосса: как разумно отслеживать стоп-лосы и находить баланс между защитой прибыли и сокращением ненужных стоп-лосов.

  3. Оптимизация параметров по рынкам: оптимизация комбинаций параметров для характеристик различных сортов.

  4. Добавьте машинное обучение: Используйте алгоритмы машинного обучения, чтобы помочь судить о направлениях тренда.

Резюме

Система принятия решений торговой черепахи оценивает потенциальное направление тренда путем сравнения цен с самыми высокими и самыми низкими ценами за определенные периоды и строит всю систему принятия решений с помощью модулей управления рисками. У нее есть сильная способность отслеживания тренда, а также есть некоторые риски ложных прорывов и оптимизации параметров. Эта стратегия может служить базовой моделью для количественной торговли и быть расширена и оптимизирована на этой основе для разработки соответствующих систем принятия решений для себя.


/*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') // 高亮空头趋势

Больше