A estratégia de negociação Orion integra múltiplos indicadores técnicos para negociação quantitativa. O objetivo é identificar os tops e fundos do mercado cedo para que os comerciantes possam tomar decisões de compra e venda oportunas. A estratégia usa um mecanismo de curva de previsão exclusivo para tentar gerar sinais de negociação antes que ocorram inversões reais de preços.
O núcleo da estratégia é a curva proprietária de sinal Orion. Esta curva sintetiza múltiplos indicadores, incluindo MACD, WPR, Stoch, RSI etc. para gerar um sinal composto.
Criticamente, a curva também incorpora um modelo de previsão, que analisa as mudanças de inclinação da curva para tentar prever reversões potenciais 1-2 bares à frente.
Além disso, um indicador de onda de momento é usado para determinar a direção da tendência em um período de tempo maior.
Finalmente, a estratégia fornece sugestões de compra e venda quando os sinais são acionados.
Indicadores múltiplos melhoram a precisão A combinação de indicadores ajuda a confirmar as tendências e as inversões spot, evitando armadilhas de um único indicador.
O modelo de previsão fornece alertas precoces de reversão A curva de previsão pode antecipar os sinais reais, concedendo uma vantagem nas decisões de negociação.
A onda de impulso julga a direção geral da tendência Incorporar uma onda de impulso de maior prazo evita a negociação contra as principais tendências.
Parâmetros personalizáveis adequados a diferentes produtos Os utilizadores podem ajustar os parâmetros do indicador às características de diferentes produtos de negociação.
Modelo de previsão pode causar excesso de negociação O modelo de previsão pode gerar sinais falsos.
Optimização difícil com vários parâmetros Com numerosos parâmetros, encontrar a combinação ideal requer conjuntos de dados extensos e testes prolongados.
A eficácia dos indicadores necessita de uma avaliação prudente O benefício incremental real de cada indicador necessita de uma avaliação cuidadosa para evitar a redundância.
Os custos reais de negociação devem ser considerados Os custos do mundo real precisam ser incorporados nos backtests.
Avaliação e ajuste do modelo de previsão
Avaliar a precisão da previsão e otimizar os parâmetros para melhorar a confiabilidade.
Simplificar o modelo reduzindo a redundância Adotar a avaliação da eficácia dos indicadores e a simplificação do modelo para eliminar a complexidade desnecessária.
Teste de robustez nos mercados Realizar backtests em vários mercados para verificar os resultados e a robustez da otimização.
Ajustar a estratégia com base nos custos reais Introduzir custos do mundo real no backtest para ajustar os parâmetros da estratégia para uma menor frequência de comércio.
A estratégia Orion sintetiza múltiplos indicadores e uma curva de previsão única para tentar identificar curvas cedo. Ela tem méritos, mas a escalabilidade também é limitada. Uma atitude cautelosa é necessária. As otimizações contínuas de aspectos como a eficácia do sinal e a rentabilidade são necessárias para alcançar ganhos constantes a longo prazo na negociação automatizada.
/*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