La stratégie combine l’indicateur de la courbe de Hall et l’indicateur de la courbe de Hall pour identifier l’orientation des tendances du marché et suivre le fonctionnement de la tendance.
Les principales logiques de transaction sont les suivantes:
Calcul de la moyenne dynamique de McKinney pour déterminer la direction de la tendance générale du marché
La courbe de Hall est traversée par des signaux spécifiques de plus de vide.
Indicateurs auxiliaires sélectifs pour la vérification du signal
Mise en place d’un mécanisme de gestion des risques basé sur le principe de l’arrêt et de l’arrêt
La courbe de Hall est inversée à l’arrêt de la position
Cette stratégie simplifie le processus de suivi des tendances et vise à automatiser les systèmes pour qu’ils correspondent au rythme du marché et réduisent l’influence de la pensée individuelle.
La ligne moyenne détermine l’orientation générale, les indicateurs auxiliaires sont sélectifs
La courbe de Hall génère un signal clair de plus de vide
Réglementer la gestion des risques et réduire les erreurs
Les paramètres et les conditions de filtrage doivent être optimisés pour les tests
Il y a une incertitude quant à l’exactitude des tendances.
La courbe de Hall peut être retardée et générer un faux signal.
Cette stratégie vise à aligner les tendances sur les systèmes mécanisés et à simplifier les processus d’exploitation. Cependant, l’optimisation des paramètres et la limitation des indicateurs doivent être prises en compte pour améliorer la stabilité.
/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © Milleman
//@version=4
strategy("Millebot", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.04)
// Risk management settings
Spacer2 = input(false, title="=== Risk management settings ===")
Risk = input(1.0, title="% Risk")/100
RRR = input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20)
SL = input(5,title="StopLoss %",step=0.25)/100
// Baseline : McGinley Dynamic
Spacer3 = input(false, title="=== Baseline - Switch L/S ===")
McG_Source = input(close, title="McGinley source")
McG_length = input(50, title=" McG length", minval=1)
McG_LS_Switch = 0.0
McG_LS_Switch := na(McG_LS_Switch[1]) ? ema(McG_Source, McG_length) : McG_LS_Switch[1] + (McG_Source - McG_LS_Switch[1]) / (McG_length * pow(McG_Source/McG_LS_Switch[1], 4))
// Confirmation indicator
Spacer4 = input(false, title="=== Confirmation indicator ===")
C1_Act = input(false, title=" Confirmation indicator Activation")
C1_src = input(ohlc4, title="Source")
C1_len = input(5,title="Length")
C1 = sma(C1_src,C1_len)
// Entry indicator : Hull Moving Average
Spacer5 = input(false, title="=== Entry indicator configuration ===")
src = input(ohlc4, title="Source")
length = input(50,title="Length HMA")
HMA = ema(wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length))),1)
//VARIABLES MANAGEMENT
TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1]
TriggerxATR = 0.0, TriggerxATR := TriggerxATR[1]
SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1]
isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1]
//LOGIC
GoLong = crossover(HMA[0],HMA[1]) and strategy.position_size == 0.0 and (McG_LS_Switch/McG_LS_Switch[1] > 1) and (not C1_Act or C1>C1[1])
GoShort = crossunder(HMA[0],HMA[1]) and strategy.position_size == 0.0 and (McG_LS_Switch/McG_LS_Switch[1] < 1) and (not C1_Act or C1<C1[1])
//FRAMEWORK
//Long
if GoLong and not GoLong[1]
isLong := true, TriggerPrice := close
TPPrice := TriggerPrice * (1 + (SL * RRR))
SLPrice := TriggerPrice * (1-SL)
Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice //Het aantal contracts moet meegegeven worden. => budget * risk / %afstand tot SL / prijs = aantal contracts
strategy.entry("Long", strategy.long, comment=tostring(round(TriggerxATR/TriggerPrice*1000)), qty=Entry_Contracts)
strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice, qty_percent = 100)
if isLong and crossunder(HMA[0],HMA[1])
strategy.close_all(comment="TrendChange")
isLong := false
//Short
if GoShort and not GoShort[1]
isShort := true, TriggerPrice := close
TPPrice := TriggerPrice * (1 - (SL * RRR))
SLPrice := TriggerPrice * (1 + SL)
Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice //Het aantal contracts moet meegegeven worden. => budget * risk / %afstand tot SL / prijs = aantal contracts
strategy.entry("Short", strategy.short, comment=tostring(round(TriggerxATR/TriggerPrice*1000)), qty=Entry_Contracts)
strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)//, qty_percent = 100)
if isShort and crossover(HMA[0],HMA[1])
strategy.close_all(comment="TrendChange")
isShort := false
//VISUALISATION
plot(McG_LS_Switch,color=color.blue,title="Baseline")
plot(C1_Act?C1:na,color=color.white,title="confirmation Indicator")
plot(HMA, color=(HMA[0]>HMA[1]? color.green : color.red), linewidth=4, transp=40, title="Entry Indicator")
plot(isLong or isShort ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr)
plot(isLong or isShort ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr)
bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice ? color.yellow : na, transp=75, title="SL Long")
bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice ? color.yellow : na, transp=75, title="SL Short")