
Le système de décision de négociation de la côte est une stratégie de négociation de suivi de tendance basée sur la théorie des ruptures. Il génère des signaux de négociation en identifiant des tendances potentielles en utilisant des moyennes mobiles des prix les plus élevés et les plus bas de la variété de négociation. Il génère des signaux de négociation lorsque les prix franchissent le prix le plus élevé ou le plus bas d’une période donnée.
Les signaux stratégiques centraux du système de décision de négociation du littoral sont générés en comparant la relation entre le prix et le prix le plus élevé du cycle N1 et le prix le plus bas du cycle N2. Un signal d’achat est généré lorsque le prix est au-dessus du prix le plus élevé du cycle N1; un signal de vente est généré lorsque le prix est au-dessous du prix le plus bas du cycle N2.
Après l’ouverture d’une position, la relation entre le prix et le prix d’arrêt est comparée en temps réel, générant un signal de stop mobile. En même temps, la relation entre le prix et la ligne d’acquisition est comparée, générant un signal d’acquisition. Le prix d’arrêt et la ligne d’acquisition sont liés à l’ATR.
Chaque fois qu’une position est ouverte, les unités de détention sont calculées pour éviter l’impact d’une perte individuelle sur le capital total en prenant un certain pourcentage du capital initial. La perte individuelle est limitée à un certain nombre de points.
Les avantages du système de décision de transaction de la côte sont les suivants:
Capture des tendances potentielles: en comparant les prix avec les plus hauts et les plus bas du cycle, on détermine la direction des tendances potentielles et on capte les tendances potentielles plus tôt.
Gestion des risques: la gestion des fonds et le stop loss sont utilisés pour contrôler les risques de pertes individuelles et globales.
La gestion de l’hypothèque: une hypothèque appropriée permet d’obtenir des bénéfices supplémentaires dans la tendance.
L’intégrité: la combinaison de la gestion des capitaux, de la gestion des pertes et de la gestion de l’hypothèque rend le système de décision plus complet.
Simple et clair: les règles de génération du signal sont simples, directes, faciles à comprendre et à vérifier.
Le système de décision sur les transactions sur la plage présente également des risques:
Risque de fausse rupture: les prix peuvent avoir une fausse rupture du prix le plus élevé ou le plus bas, ce qui provoque un signal erroné. Des paramètres peuvent être ajustés de manière appropriée pour filtrer certaines fausses ruptures.
Risque d’inversion de tendance: il existe un risque d’augmentation des pertes suite à une inversion des prix après la mise en place de la position. Le nombre de mises en place doit être limité de manière appropriée et les pertes doivent être arrêtées à temps.
Risque d’optimisation des paramètres: les paramètres de différents marchés peuvent varier considérablement, il convient de segmenter les paramètres d’optimisation des marchés pour réduire les risques.
Le système de décision sur les transactions sur les plages peut également être optimisé dans les domaines suivants:
Ajout de filtres: détecte la force des ruptures de prix et filtre les fausses ruptures.
Optimiser les stratégies de stop loss: comment suivre raisonnablement les stops et trouver un équilibre entre la protection des bénéfices et la réduction des pertes inutiles.
Optimisation des paramètres de segmentation: combinaison de paramètres optimisés pour les différentes caractéristiques des variétés.
Augmentation de l’apprentissage automatique: l’utilisation d’algorithmes d’apprentissage automatique pour aider à déterminer la direction des tendances
Le système décisionnel de négociation de la côte permet de déterminer la direction de la tendance potentielle en comparant les prix avec les plus hauts et les plus bas prix au cours d’une période donnée et de construire l’ensemble du système de décision en combinant le module de gestion des risques. Il a une forte capacité de suivi des tendances, mais il existe également un certain risque de faux-saut et des problèmes d’optimisation des paramètres.
/*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') // 高亮空头趋势