Stratégie de négociation d'Orion

Auteur:ChaoZhang est là., Date: le 25 septembre 2023
Les étiquettes:

Résumé

La stratégie de trading d'Orion intègre plusieurs indicateurs techniques pour le trading quantitatif. Elle vise à identifier les sommets et les bas du marché tôt afin que les traders puissent prendre des décisions d'achat et de vente en temps opportun.

La logique de la stratégie

Le noyau de la stratégie est la courbe de signal d'Orion propriétaire. Cette courbe synthétise plusieurs indicateurs, y compris MACD, WPR, Stoch, RSI, etc. pour générer un signal composite.

De manière critique, la courbe intègre également un modèle de prédiction, qui analyse les changements de pente de la courbe pour essayer de prédire des renversements potentiels 1-2 barres à l'avance.

En outre, un indicateur d'onde de momentum est utilisé pour déterminer la direction de la tendance sur une période plus longue.

Enfin, la stratégie fournit des suggestions d'achat et de vente lorsque les signaux sont déclenchés.

Analyse des avantages

  • Plusieurs indicateurs améliorent la précision La combinaison d'indicateurs permet de confirmer les tendances et les renversements au comptant, en évitant les pièges d'un seul indicateur.

  • Le modèle de prévision fournit des alertes précoces de renversement La courbe de prédiction peut précéder les signaux réels, ce qui donne une longueur d'avance aux décisions de négociation.

  • Une vague de dynamique juge la direction générale de la tendance L'intégration d'une vague de dynamique plus longue évite de négocier contre les tendances majeures.

  • Paramètres personnalisables adaptés à différents produits Les utilisateurs peuvent ajuster les paramètres des indicateurs en fonction des caractéristiques des différents produits de négociation.

Analyse des risques

  • Modèle de prévision peut entraîner une sur-trading Le modèle de prédiction peut générer de faux signaux.

  • Optimisation difficile avec plusieurs paramètres Avec de nombreux paramètres, trouver la combinaison optimale nécessite des ensembles de données étendus et des tests prolongés.

  • L'efficacité des indicateurs doit être évaluée avec prudence Le bénéfice supplémentaire réel de chaque indicateur doit être évalué avec soin afin d'éviter toute redondance.

  • Les coûts commerciaux réels devraient être pris en considération Les coûts réels doivent être intégrés dans les backtests.

Directions d'amélioration

  • Évaluer et ajuster le modèle de prédiction
    Évaluer l'exactitude de la prédiction et optimiser les paramètres pour améliorer la fiabilité.

  • Simplifier le modèle en réduisant la redondance Adopter une évaluation de l'efficacité des indicateurs et une simplification du modèle pour éliminer toute complexité inutile.

  • Test de robustesse sur tous les marchés Effectuer des backtests sur plusieurs marchés afin de vérifier les résultats et la robustesse de l'optimisation.

  • Adapter la stratégie en fonction des coûts réels Introduire des coûts réels dans le backtest afin d'ajuster les paramètres de la stratégie pour une fréquence commerciale plus faible.

Résumé

La stratégie Orion synthétise plusieurs indicateurs et une courbe de prédiction unique pour essayer d'identifier les virages tôt. Elle a des mérites mais l'évolutivité est également limitée. Une attitude prudente est nécessaire. Des optimisations continues des aspects tels que l'efficacité du signal et l'efficacité des coûts sont nécessaires pour obtenir des gains constants à long terme dans le trading automatisé.


/*backtest
start: 2023-09-17 00:00:00
end: 2023-09-21 22:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © OrionAlgo
//          () /? | () |\|   /\ |_ (_, ()          //
//@version=4

version = '2.0'

strategy("Orion Algo Strategy v"+version, shorttitle="Orion Algo Strategy v"+version, overlay=false, pyramiding=100)


// Getting inputs --------------------------------------------------------------
userAgreement = input(true, title='I understand that Orion Algo cannot be 100% accurate and overall performance will shift with market conditions. While Orion Algo increases my chances of entering better positions, I must use smart trade management. ', type=input.bool,group='User Agreement ─────────────',
  tooltip='In order to use Orion Algo, you must click the checkbox to acknowledge the user agreement')

src = close
//smoothing inputs -------------------------------------------------------------

//superSmooth = input(true, title='Super Smooth', inline='Super Smooth', group='Smoothing ─────────────────')
superSmooth = true
smoothType = 1
superSmoothStrength = input(10, title='Super Smooth',minval = 3, inline='Super Smooth', group='Signal ────────────────────',
  tooltip='Smooths the signal. Lower values move pivots to the left while increasing noise, higher values move pivots to the right and reduce noise. 8 is a good mix of both') // set to timeframe for decent results?
//trendSmoothing = input(30, title='Trend Smooth',minval = 3, group='Smoothing ─────────────────') // set to timeframe for decent results?
trendSmoothing = 30 // set to timeframe for decent results?

showPrediction = input(false, title='Prediction', group='Signal ────────────────────',inline='prediction')
predictionBias = input(0.45, minval = 0.,maxval=1., step=0.05, title='Bias', group='Signal ────────────────────',inline='prediction')
showPredictionCurve = input(true, title='Curve', group='Signal ────────────────────',inline='prediction', tooltip='Prediction model that attempts to predict short range reversals (0-2 bars). Adjust Bias to change the prediction curve.')

//momentum wave inputs ---------------------------------------------------------
showMomentumWave = input(true, 'Momentum Wave', group='Momentum Wave ─────────────', inline='mom')
momentumWaveLength = input(3, '', group='Momentum Wave ─────────────', inline='mom', tooltip='Secondary signal that shows medium to large movements based on the input variable. The wave will change depending on the current timeframe.')
momentumOutside = input(true, 'Position Outside', group='Momentum Wave ─────────────', inline='mom2', tooltip='Positions the wave outside of the main signal area.')

//visuals input-----------------------------------------------------------------

useDarkMode = input(true, 'Dark Mode', group='Visuals ───────────────────',inline='Colors')

// 0:backgroundlines, 1:signal, 2:bullish, 3:bearish, 4:hiddenbull, 5:hiddenbear, 6:deltav, 7:prediction, 8:predictionbull, 9:predictionbear, 10:dash, 11:mom2

visualMode = input('Pro', 'Mode',options=['Beginner', 'Pro'] ,group='Visuals ───────────────────')

dashOn = input(true, "Dashboard", group='Dashboard ─────────────────', inline='dash', tooltip='A dashboard with some usefual stats')
  
dashColor = color.new(#171a27, 100)

showPivots = input(true, title='Signal Pivots', group='Pivots ────────────────────',inline='pivots')
showPredictionPivots = input(false, title='Prediction Pivots', group='Pivots ────────────────────',inline='pivots')


// Functions -------------------------------------------------------------------

f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src,barmerge.gaps_on, lookahead = barmerge.lookahead_on) 

f_slope(x) =>
    slopePeriod = 1
    (x - x[slopePeriod]) / slopePeriod

f_superSmooth(inputVal,smoothType) =>
    smoothType==1? (hma(inputVal,superSmoothStrength)) :
      smoothType==2? (ema((ema((ema(inputVal,3)),3)),superSmoothStrength)):
      smoothType==3? linreg(inputVal,superSmoothStrength,0) : 
      smoothType==4? (hma(inputVal,superSmoothStrength * momentumWaveLength)) : na

f_bias(bias, min, max) =>
    (bias * (max - min) ) + min

f_resInMinutes() =>
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60. :
      timeframe.isminutes ? 1.       :
      timeframe.isdaily   ? 1440.    :
      timeframe.isweekly  ? 10080.   :
      timeframe.ismonthly ? 43800.   : na)

f_resFromMinutes(_minutes) =>
    _minutes     <= 0.0167       ? "1S"  :
      _minutes   <= 0.0834       ? "5S"  :
      _minutes   <= 0.2500       ? "15S" :
      _minutes   <= 0.5000       ? "30S" :
      _minutes   <= 1            ? "1":
      _minutes   <= 1440         ? tostring(round(_minutes)) :
      _minutes   <= 43800        ? tostring(round(min(_minutes / 1440, 365))) + "D" :
      tostring(round(min(_minutes / 43800, 12))) + "M"
      
f_output_signal()=>    
    a = ((ema(close, 12) - ema(close, 26)) - ema((ema(close, 12) - ema(close, 26)), 8))/10
    b = wpr(8)
    c = (100 * ( close + 2*stdev( close, 21) - sma( close, 21 ) ) / ( 4 * stdev( close, 21 ) ))
    d = (rsi(close - sma(close, 21)[11],8)*2)-100
    e = (rsi(fixnan(100 * rma(change(high) > change(low) and change(high) > 0 ? change(high) : 0, 1) / rma(tr, 1)) - fixnan(100 * rma(change(low) > change(high) and change(low) > 0 ? change(low) : 0, 1) / rma(tr, 1)),8)*2)-100 //causes slow down
    f = rsi((((close-( (sum(volume, 20) - volume)/sum(volume, 20)) + (volume*close/sum(volume, 20)))/((close+( (sum(volume, 20) - volume)/sum(volume, 20)) + (volume*close/sum(volume, 20)))/2)) * 100),8)-100
    g = (rsi(sma(highest(high,14)-lowest(low,14)==0.0?0.0:(close-lowest(low,14))/highest(high,14)-lowest(low,14)-0.5,max(1,int(2))),8)*2)-100 //causes slow down
    avg(a,b,c,d,e,f,g)*2
 
output_signal = f_output_signal()
output_signal := f_superSmooth(output_signal,1)

// output_signal2 = plot(f_superSmoothSlow(f_output_signal()), color=color.blue, linewidth=2)

//Orion Signal Higher Timeframe / Momentum Wave --------------------------------
f_momentumWave(wavelength,smooth) =>
    currentMinutes = f_resInMinutes()
    m = currentMinutes * wavelength //multiply current resolution by momentumWaveLength to get higher resolution
    momentumWaveRes = f_resFromMinutes(m)
    f_secureSecurity(syminfo.tickerid, momentumWaveRes,f_superSmooth(f_output_signal(),1))



// Plot ------------------------------------------------------------------------
f_color(x) =>
    if userAgreement
        white      = useDarkMode ? #e5e4f4 : #505050ff
        lightgray  = useDarkMode ? #808080 : #909090ff
        gray       = useDarkMode ? #808080 : #505050ff
        //blue       = useDarkMode ? #007EA7 : #007EA7ff
        blue       = useDarkMode ? #2862FFFF : #2862FFFF
        
        // 0:backgroundlines, 1:signal, 2:bullish, 3:bearish, 4:hiddenbull, 5:hiddenbear, 6:deltav, 7:prediction, 8:predictionbull, 9:predictionbear, 10:trendbull, 11:trendbear, 12:dash, 13:mom1, 14:mom2
        x==0? lightgray : x==1? gray : x==2? white : x==3? blue : x==4? white : x==5? blue : x==6? blue : x==7? blue : x==8? white : x==9? blue : x==10? blue : x==11? blue : na

// Lines -----------------------------------------------------------------------

h1 = plot(0, "Mid Band", color=f_color(0),editable=0, transp=80)

// Signal ----------------------------------------------------------------------

orionSignal = plot(output_signal, title="Orion Signal Curve", style=plot.style_line,linewidth=1, transp=0, color= f_color(1), offset=0,editable=0)


// Momentum Wave ---------------------------------------------------------------
momWave = f_momentumWave(momentumWaveLength,1)


p_momWave = plot(showMomentumWave? momentumOutside? (momWave/2) -150 : momWave : na, color=f_color(11), linewidth=showMomentumWave and momentumOutside ? 1 : 2, editable =0, transp=50, style=momentumOutside? plot.style_area : plot.style_line, histbase=-200) //two tone color doesnt want to work with this for some reason.

// Divergence ------------------------------------------------------------------

osc = output_signal

plFound = osc > osc [1] and osc[1] < osc[2]
phFound = osc < osc [1] and osc[1] > osc[2]

// bullish

plot(
     plFound and visualMode=='Pro'?  osc[1] - 10 : na,
     offset=0,
     title="Regular Bullish",
     linewidth=3,
     color=showPivots ? f_color(2) :na,
     transp=0,
     style=plot.style_circles,
     editable=0
     )
plotshape(
     plFound and visualMode=='Beginner'?  osc[1] - 10 : na,
     offset=0,
     title="Regular Bullish",
     size=size.tiny,
     color=showPivots ? f_color(2) :na,
     transp=0,
     style=shape.labelup,
     text = 'Buy',
     textcolor= color.black,
     location=location.absolute,
     editable=0
     )


// bearish
plot(
     phFound and visualMode=='Pro'? osc[1] + 10: na,
     offset=0,
     title="Regular Bearish",
     linewidth=3,
     color=showPivots ? f_color(3):na,
     transp=0,
     style=plot.style_circles,
     editable=0
     )
plotshape(
     phFound and visualMode=='Beginner'? osc[1] + 10: na,
     offset=0,
     title="Regular Bearish",
     size=size.tiny,
     color=showPivots ? f_color(3):na,
     transp=0,
     style=shape.labeldown,
     text = 'Sell',
     textcolor= color.white,
     location=location.absolute,
     editable=0
     )



// Delta v ---------------------------------------------------------------------

slope    = f_slope(output_signal)*1.5

// Prediction from Delta v -----------------------------------------------------
output_prediction = f_bias(predictionBias, slope, output_signal)

prediction_bullish = output_prediction>output_prediction[1] and output_prediction[1]<output_prediction[2] ?true:false
prediction_bearish = output_prediction<output_prediction[1] and output_prediction[1]>output_prediction[2] ?true:false

plot(showPrediction and showPredictionCurve?output_prediction:na,title='Prediction Curve', color=f_color(7), editable=0)
//prediction bull
plot(showPrediction?showPredictionPivots?output_prediction>output_prediction[1] and output_prediction[1]<output_prediction[2]?showPredictionCurve?output_prediction:output_signal:na:na:na,
  title='Prediction Bullish',color=f_color(8), style=plot.style_circles, linewidth=2, editable=0)
//prediction bear
plot(showPrediction?showPredictionPivots?output_prediction<output_prediction[1] and output_prediction[1]>output_prediction[2]?showPredictionCurve?output_prediction:output_signal:na:na:na,
  title='Prediction Bearish', color=f_color(9), style=plot.style_circles, linewidth=2, editable=0)

// User Aggreement -------------------------------------------------------------

plotshape(userAgreement==false?0:na,title='Welcome', text='Welcome to Orion Algo! Please double click me to enable signals',textcolor=color.black,color=color.white,offset=0,size=size.huge,style=shape.labeldown,location=location.absolute, transp=0, show_last=1, editable=0)
plotshape(userAgreement==false?0:na,title='Welcome', text='Welcome to Orion Algo! Please double click me to enable signals',textcolor=color.black,color=color.white,offset=-100,size=size.huge,style=shape.labeldown,location=location.absolute, transp=0, show_last=1, editable=0)

// Alerts ----------------------------------------------------------------------

alertcondition(plFound,title='1. Bullish (Big Dot)', message='Bullish Signal (Big Dot)')
alertcondition(phFound,title='2. Bearish (Big Dot)', message='Bearish Signal (Big Dot)')
alertcondition(prediction_bullish,title='3. Prediction Bullish (Small Dot)', message='Prediction Bullish Signal (Small Dot)')
alertcondition(prediction_bearish,title='4. Prediction Bearish (Small Dot)', message='Prediction Bearish Signal (Small Dot)')





// Strategy --------------------------------------------------------------------
i_strategy = input(defval='dca long', title='strategy', options=['simple','dca long'])
i_pyramid = input(10, 'pyramid orders')

// Simple Strat
if (i_strategy == 'simple')
    longCondition = crossover(output_signal, output_signal[1])
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = crossunder(output_signal, output_signal[1])
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)

// DCA Strat
i_percent_exit = input(2.0,'percent exit in profit')/100
i_percent_drop = input(2.0,'percent drop before each entry')/100

var entryPrice = 0.0
var exitPrice = 0.0


var inTrade = false
var tradeCount = 0
var moneyInTrade = 0.0

if(output_signal > output_signal[1] and output_signal[1]<=output_signal[2] and i_strategy=='dca long')
//if (true)    
    if (inTrade==false)
        strategy.entry('Long',long=true)
        entryPrice:=close
        moneyInTrade:=close
        exitPrice:=entryPrice + (entryPrice*(i_percent_exit))
        inTrade:=true
        tradeCount := 1
        
    if (inTrade==true and close <= (entryPrice-(entryPrice*(i_percent_drop) )))
        //calculate DCA //math is incorrect!!!
        if (tradeCount <= i_pyramid)
            tradeCount := tradeCount+1
            entryPrice:=close
            moneyInTrade := moneyInTrade+close
            exitPrice2 = moneyInTrade / tradeCount
            exitPrice := exitPrice2 + (exitPrice2 *(i_percent_exit)) 
           
            strategy.entry('Long',long=true)
            

if(close >= exitPrice and inTrade==true and output_signal <= output_signal[1] and output_signal[1]>=output_signal[2] and i_strategy=='dca long')
    inTrade:=false
   
    strategy.close('Long')
    
    


// Dashboard -------------------------------------------------------------------


//deltav
deltav = slope









Plus de