Orion Trading Strategy es una estrategia de comercio cuantitativa que integra varios indicadores técnicos. La estrategia tiene como objetivo identificar los altos y bajos del mercado con anticipación para que los comerciantes puedan tomar decisiones de compra y venta a tiempo.
El núcleo de esta estrategia es la original Orion Signal Curve. Esta curva integra varios indicadores técnicos, incluyendo MACD, WPR, Stoch, RSI, etc., para calcular una señal integral. Luego, se genera la curva final mediante el tratamiento súper suave.
La clave es que la curva también está equipada con un modelo de predicción, que analiza los cambios en la inclinación de la curva y trata de predecir el potencial giro después de 1-2 líneas K. Cuando la curva prevista se desvía de la curva real, se emite una señal de negociación anticipada.
Además, la estrategia también utiliza un indicador de ondas de dinámica para determinar la dirección de la tendencia en un nivel más grande. Cuando las ondas de dinámica cambian de dirección, se sugiere que puede haber un cambio de dirección en un nivel más grande.
Finalmente, la estrategia es dar una recomendación de compra y venta correspondiente cuando se genera la señal. El usuario puede decidir por sí mismo si entrará o no.
La combinación de varios indicadores ayuda a identificar tendencias y puntos de inflexión, evitando el riesgo de error de un solo indicador.
La curva de predicción puede revertir las señales reales con anticipación, proporcionando información previa para la toma de decisiones comerciales.
Combinando el indicador de ondas dinámicas con un marco de tiempo más alto, se evita la operación de contraste.
El usuario puede ajustar los parámetros del indicador para adaptarse a las características de las diferentes variedades.
Los modelos de predicción son propensos a emitir falsas señales que, si se siguen a ciegas, pueden conducir a un exceso de comercio.
El número de parámetros es tan grande que la búsqueda de la combinación óptima requiere grandes conjuntos de datos y largas pruebas.
El efecto real de cada indicador en la mejora de la señal debe evaluarse con cuidado y evitar el uso de indicadores redundantes.
La frecuencia de las transacciones genera más costos, lo que requiere que se considere la retroalimentación en condiciones reales.
Evaluar la precisión del modelo de predicción y optimizar los ajustes de los parámetros de predicción para mejorar la precisión.
Utiliza métodos de evaluación de la eficacia de los indicadores y simplificación de modelos para reducir la complejidad innecesaria.
Se realizan pruebas de repetición en más mercados para verificar la estabilidad y los resultados de la optimización de parámetros.
De acuerdo con la retroevaluación de los factores de costo de la introducción de la bolsa de valores, ajuste los parámetros de la estrategia para reducir la frecuencia de las transacciones.
La estrategia de Orión utiliza un conjunto de indicadores y una curva de predicción única para tratar de detectar los puntos de inflexión del mercado con anticipación. La estrategia tiene ciertas ventajas, pero la escalabilidad también tiene limitaciones. Se debe mantener una actitud cautelosa, optimizar constantemente los ajustes en aspectos como la eficacia de las señales de negociación y la eficacia de los costos, y buscar obtener ganancias estables a largo plazo en la automatización de la negociación.
/*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