거북이 거래 결정 시스템


생성 날짜: 2024-02-29 14:28:25 마지막으로 수정됨: 2024-02-29 14:28:25
복사: 4 클릭수: 912
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

거북이 거래 결정 시스템

개요

해안 거래 결정 시스템은 돌파 이론에 기반한 트렌드 추적 거래 전략이다. 거래 품종의 최고 가격과 최저 가격의 이동 평균을 통해 거래 신호를 생성하여 잠재적인 트렌드를 식별한다. 가격이 지정된 주기 내에서 최고 가격 또는 최저 가격을 돌파 할 때 거래 신호를 생성한다. 이 전략은 동시에 이동 중지, 재고 관리 및 자금 관리 모듈을 결합하여 보다 완전한 의사 결정 시스템으로 만든다.

전략 원칙

바닷가 거래 의사 결정 시스템의 핵심 전략 신호는 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') // 高亮空头趋势