Die Orion Trading Strategy ist eine quantitative Handelsstrategie, die mehrere technische Indikatoren integriert. Die Strategie zielt darauf ab, die Höhen und Tiefen des Marktes im Voraus zu identifizieren, damit Händler rechtzeitig Kauf- und Verkaufsentscheidungen treffen können.
Im Zentrum der Strategie steht die einzigartige Orion Signalkurve. Die Kurve kombiniert mehrere technische Indikatoren, darunter MACD, WPR, Stoch, RSI und andere, um ein synthetisches Signal zu berechnen.
Der Schlüssel ist, dass die Kurve auch mit einem Prognose-Modell ausgestattet ist, das die Veränderungen der Steigung der Kurve analysiert und versucht, die potenzielle Umkehrung nach 1-2 K-Linien vorherzusagen. Wenn die prognostizierte Kurve von der tatsächlichen Kurve abweicht, kann ein Handelssignal im Voraus ausgegeben werden.
Darüber hinaus wird die Strategie auch mit einer Dynamikwellen-Anzeige verwendet, um die Richtung eines Trends auf einer größeren Ebene zu bestimmen. Wenn die Dynamikwellen ihre Richtung ändern, werden Hinweise gegeben, dass eine Umkehrung auf einer größeren Ebene möglich ist.
Schließlich gibt die Strategie eine entsprechende Kauf- und Verkaufsempfehlung, wenn ein Signal erzeugt wird. Der Benutzer kann selbst entscheiden, ob er damit eintritt.
Die Integration mehrerer Indikatoren hilft, Trends zu erkennen und Wendepunkte zu entdecken, um das Risiko einer Fehleinschätzung eines einzelnen Indikators zu vermeiden.
Die Vorhersage-Kurve kann die tatsächlichen Signale im Voraus umkehren und bietet Vorlauf für Handelsentscheidungen.
Durch die Kombination von Dynamikwellen mit einem höheren Zeitrahmen können Rückwärtsoperationen vermieden werden.
Der Benutzer kann die Parameter des Indikators an die Eigenschaften der verschiedenen Sorten anpassen.
Die Vorhersage-Modelle sind leicht zu falschen Signalen und können zu Übertriebenen führen, wenn sie blind gefolgt werden.
Die Parameter sind so zahlreich, dass eine optimale Kombination aus einer großen Anzahl von Datensätzen und langen Tests erforderlich ist.
Die tatsächliche Wirkung der einzelnen Indikatoren auf die Signalsteigerung muss sorgfältig bewertet werden, um die Verwendung von redundanten Indikatoren zu vermeiden.
Häufige Transaktionen führen zu höheren Kosten, die in die Rückmessung unter realen Bedingungen einbezogen werden müssen.
Beurteilung der Genauigkeit des Prognose-Modells und Optimierung der Anpassung der Prognose-Parameter zur Verbesserung der Genauigkeit.
Mit Hilfe von Kennzahlen und Modellvereinfachungen reduziert sich unnötige Komplexität.
Die Ergebnisse der Parameteroptimierung und ihre Stabilität werden in weiteren Märkten getestet.
Die Strategieparameter werden angepasst, um die Häufigkeit der Transaktionen zu verringern.
Die Orion-Strategie nutzt verschiedene Indikatoren und einzigartige Prognose-Kurven, um zu versuchen, die Wendepunkte des Marktes frühzeitig zu erkennen. Die Strategie hat einige Vorteile, aber die Skalierbarkeit hat auch Grenzen.
/*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