Sistem Keputusan Perdagangan Penyu

Penulis:ChaoZhang, Tarikh: 2024-02-29 14:28:25
Tag:

img

Ringkasan

Sistem Keputusan Perdagangan Penyu adalah strategi perdagangan mengikut trend berdasarkan teori pecah. Ia menjana isyarat perdagangan dengan bergerak purata harga tertinggi dan terendah dalam tempoh tertentu untuk mengenal pasti trend yang berpotensi. Isyarat perdagangan dihasilkan apabila harga pecah di atas atau di bawah harga tertinggi atau terendah dalam tempoh yang ditentukan. Strategi ini juga menggabungkan penangguhan, piramid, dan modul pengurusan wang untuk membentuk sistem keputusan yang agak lengkap.

Prinsip Strategi

Isyarat strategi teras Sistem Keputusan Perdagangan Penyu dihasilkan dengan membandingkan harga dengan harga tertinggi dalam tempoh N1 dan harga terendah dalam tempoh N2. Isyarat panjang dihasilkan apabila harga melintasi harga tertinggi dalam tempoh N1. Isyarat pendek dihasilkan apabila harga melintasi harga terendah dalam tempoh N2. Mod penutupan digunakan untuk mengawal penjanaan isyarat baru.

Selepas membuka kedudukan, harga akan dibandingkan dengan harga stop loss dalam masa nyata untuk menjana isyarat berhenti. Juga, bandingkan harga dengan baris tambahan untuk menjana isyarat piramid. Kedua-dua harga stop loss dan baris tambahan berkaitan dengan ATR.

Apabila membuka kedudukan setiap kali, unit kedudukan dikira dengan mengambil peratusan tertentu daripada modal awal untuk mengelakkan kesan kerugian tunggal pada jumlah modal.

Analisis Kelebihan

Sistem Keputusan Perdagangan Penyu mempunyai kelebihan berikut:

  1. Mengesan trend berpotensi: Dengan membandingkan harga dengan harga tertinggi dan terendah sepanjang tempoh untuk menentukan arah trend berpotensi, trend harga berpotensi boleh ditangkap lebih awal.

  2. Pengurusan risiko: Gunakan pengurusan wang dan hentikan kerugian untuk mengawal risiko kerugian tunggal dan keseluruhan.

  3. Pengurusan piramid: Piramid yang sesuai boleh memperoleh keuntungan tambahan dari trend.

  4. Integriti: Menggabungkan pengurusan wang, pengurusan kehilangan berhenti dan pengurusan piramid menjadikan sistem keputusan lebih lengkap.

  5. Sederhana dan jelas: Peraturan penjanaan isyarat adalah mudah dan mudah, mudah difahami dan disahkan.

Analisis Risiko

Sistem Keputusan Perdagangan Penyu juga mempunyai beberapa risiko:

  1. Risiko pecah palsu: Harga mungkin mempunyai pecah palsu di atas atau di bawah harga tertinggi atau terendah, menyebabkan isyarat yang salah. Parameter boleh diselaraskan dengan sewajarnya untuk menapis beberapa pecah palsu.

  2. Risiko pembalikan trend: Terdapat risiko bahawa kerugian meningkat selepas piramida apabila harga berbalik.

  3. Risiko pengoptimuman parameter: Tetapan parameter boleh sangat berbeza untuk pasaran yang berbeza, parameter harus dioptimumkan secara berasingan untuk setiap pasaran untuk mengurangkan risiko.

Arahan pengoptimuman

Sistem Keputusan Perdagangan Penyu juga boleh dioptimumkan dalam aspek berikut:

  1. Tambah penapis: Mengesan momentum harga untuk menapis beberapa penembusan palsu.

  2. Mengoptimumkan strategi stop loss: Bagaimana untuk menjejaki stop loss dengan munasabah dan mencapai keseimbangan antara melindungi keuntungan dan mengurangkan stop loss yang tidak perlu.

  3. Pengoptimuman parameter mengikut pasaran: Mengoptimumkan kombinasi parameter untuk ciri-ciri jenis yang berbeza.

  4. Tambah pembelajaran mesin: Gunakan algoritma pembelajaran mesin untuk membantu menilai arah trend.

Ringkasan

Sistem Keputusan Perdagangan Penyu menilai arah trend yang berpotensi dengan membandingkan harga dengan harga tertinggi dan terendah dalam tempoh tertentu, dan membina keseluruhan sistem keputusan dengan modul pengurusan risiko. Ia mempunyai keupayaan pengesanan trend yang kuat, dan juga mempunyai beberapa risiko pecah palsu dan pengoptimuman parameter. Strategi ini boleh berfungsi sebagai model asas untuk perdagangan kuantitatif, dan dapat diperluas dan dioptimumkan berdasarkan ini untuk membangunkan sistem keputusan yang sesuai untuk diri sendiri.


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

Lebih lanjut