Skip to content

Latest commit

 

History

History
325 lines (238 loc) · 15.3 KB

海龟交易决策系统Turtle-Trading-Decision-System.md

File metadata and controls

325 lines (238 loc) · 15.3 KB

Name

海龟交易决策系统Turtle-Trading-Decision-System

Author

ChaoZhang

Strategy Description

IMG [trans]

概述

海龟交易决策系统是一个基于突破理论的趋势跟踪交易策略。它通过交易品种的最高价和最低价的移动平均线生成交易信号,实现潜在趋势的识别。当价格突破指定周期内的最高价或最低价时产生交易信号。该策略同时结合了移动止损、加仓管理和资金管理模块,使其成为一个较为完整的决策系统。

策略原理

海龟交易决策系统的核心策略信号通过比较价格与 N1 周期最高价和 N2 周期最低价的大小关系来产生。当价格上穿 N1 周期最高价时,产生买入信号;当价格下穿 N2 周期最低价时,产生卖出信号。Shutdown 模式用于控制新的信号产生。

在开仓后,会实时比较价格与止损价的大小关系,生成移动止损信号。同时,也会比较价格与加仓线的关系,产生加仓信号。止损价和加仓线均与ATR有关。

每次开仓时候计算持仓单位,通过取初始资金的一定比例来规避单笔损失对总资本的影响。单笔损失被限定在一定范围内。

优势分析

海龟交易决策系统具有以下几个优势:

  1. 捕捉潜在趋势:通过比较价格与周期最高最低价的关系判断潜在趋势方向,能较早地捕捉到潜在的价格趋势。

  2. 风险管理:采用资金管理和止损来控制单笔及总体的损失风险。

  3. 加仓管理:适当加仓能够获得趋势中的额外利润。

  4. 完整性:结合了资金管理、止损管理和加仓管理,使决策系统更加完备。

  5. 简单明了:信号生成规则简单直接,容易理解和验证。

风险分析

海龟交易决策系统也存在一些风险:

  1. 假突破风险:价格可能出现假突破最高价或最低价的情况,造成错误信号。可以适当调整参数过滤掉一些假突破。

  2. 趋势反转风险:存在加仓后的价格反转导致亏损加大的风险。应适当限制加仓次数,并及时止损。

  3. 参数优化风险:不同市场参数设置会有较大不同,应分市场优化参数以降低风险。

优化方向

海龟交易决策系统还可以从以下几个方面进行优化:

  1. 增加过滤器:检测价格突破的力度,过滤掉部分假突破。

  2. 优化止损策略:如何合理跟踪止损,在保护利润和减少不必要止损中寻找平衡。

  3. 分市场参数优化:针对不同品种特点优化参数组合。

  4. 增加机器学习:利用机器学习算法辅助判断趋势方向。

总结

海龟交易决策系统通过比较价格与指定周期内最高最低价的关系判断潜在趋势方向,并结合风险管理模块构建整个决策系统。它具有较强的趋势跟踪能力,同时也存在一定的假突破风险与参数优化问题。该策略可以作为量化交易的一个基础模型,并在此基础上进行扩展与优化,开发出适合自己的决策系统。

||

Overview

The Turtle Trading Decision System is a trend-following trading strategy based on the breakout theory. It generates trading signals by moving averages of highest and lowest prices over specific periods to identify potential trends. Trading signals are generated when prices break out above or below the highest or lowest prices over the specified periods. The strategy also incorporates trailing stops, pyramiding, and money management modules to form a relatively complete decision system.

Strategy Principle

The core strategy signals of the Turtle Trading Decision System are generated by comparing the price with the highest prices over N1 periods and the lowest prices over N2 periods. A long signal is generated when the price crosses above the highest price over N1 periods. A short signal is generated when the price crosses below the lowest price over N2 periods. The shutdown mode is used to control new signal generation.

After opening a position, the price will be compared with the stop loss price in real time to generate trailing stop signals. Also, compare the price with the add-on line to generate pyramiding signals. Both stop loss price and add-on line are related to ATR.

When opening a position each time, the position unit is calculated by taking a certain percentage of the initial capital to avoid the impact of a single loss on the total capital. Single losses are limited within a certain range.

Advantage Analysis

The Turtle Trading Decision System has the following advantages:

  1. Capture potential trends: By comparing prices with highest and lowest prices over periods to determine potential trend directions, potential price trends can be captured earlier.

  2. Risk management: Use money management and stop loss to control single and overall loss risks.

  3. Pyramiding management: Appropriate pyramiding can obtain additional profits from trends.

  4. Integrity: Combining money management, stop loss management and pyramiding management makes the decision system more complete.

  5. Simple and clear: The signal generation rules are simple and straightforward, easy to understand and verify.

Risk Analysis

The Turtle Trading Decision System also has some risks:

  1. False breakout risk: Prices may have false breakouts above or below the highest or lowest prices, causing wrong signals. Parameters can be adjusted appropriately to filter out some false breakouts.

  2. Trend reversal risk: There is a risk that the loss increases after pyramiding when prices reverse. The number of pyramiding should be limited appropriately and stops losses in time.

  3. Parameter optimization risk: Parameters settings can vary greatly for different markets, parameters should be optimized separately for each market to reduce risks.

Optimization Directions

The Turtle Trading Decision System can also be optimized in the following aspects:

  1. Add filters: Detect the momentum of price breakouts to filter out some false breakouts.

  2. Optimize stop loss strategies: How to reasonably track stop losses and strike a balance between protecting profits and reducing unnecessary stop losses.

  3. Parameter optimization by market: Optimize parameter combinations for the characteristics of different varieties.

  4. Add machine learning: Use machine learning algorithms to assist in judging trend directions.

Summary

The Turtle Trading Decision System judges the potential trend direction by comparing prices with the highest and lowest prices over specified periods, and constructs the entire decision system with risk management modules. It has strong trend tracking capability, and also has some risks of false breakouts and parameter optimization. This strategy can serve as a basic model for quantitative trading, and be expanded and optimized on this basis to develop appropriate decision systems for yourself.

[/trans]

Strategy Arguments

Argument Default Description
v_input_1 timestamp(2013-01-01T00:00:00+08:00) From Date/开始日期
v_input_2 timestamp(2024-08-01T00:00:00+08:00) To Date/结束日期
v_input_string_1 Mode 1 Enter Mode/进场系统
v_input_int_1 20 Entry Length/系统1进场长度
v_input_int_2 10 Exit Length/系统2出场长度
v_input_int_3 55 Mode2 Entry Length/系统2进场长度
v_input_int_4 20 Mode2 Exit Length/系统2出场长度
v_input_int_5 14 ATR Period/计算ATR的周期
v_input_float_1 0.02 Risk Per Trade/每笔交易的风险,0.02就是2%
v_input_float_2 2 Initial Stop ATR Multiple/止损使用的ATR倍数
v_input_float_3 0.5 Pyramid ATR Multiple/加仓使用的ATR倍数
v_input_int_6 4 Max Units/最大头寸单位数
v_input_3 true Highlighter On/Off ?/是否高亮显示

Source (PineScript)

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

Detail

https://www.fmz.com/strategy/443132

Last Modified

2024-02-29 14:28:25