Chiến lược giao dịch Orion tích hợp nhiều chỉ số kỹ thuật cho giao dịch định lượng. Nó nhằm mục đích xác định các đỉnh và đáy thị trường sớm để các nhà giao dịch có thể đưa ra quyết định mua và bán kịp thời. Chiến lược sử dụng một cơ chế đường cong dự đoán độc đáo để cố gắng tạo ra các tín hiệu giao dịch trước khi sự đảo ngược giá thực sự xảy ra.
Cốt lõi của chiến lược là đường cong tín hiệu Orion độc quyền. Đường cong này tổng hợp nhiều chỉ số bao gồm MACD, WPR, Stoch, RSI v.v. để tạo ra một tín hiệu tổng hợp. Sau đó được xử lý bằng cách siêu mịn để tạo ra đường cong cuối cùng.
Quan trọng hơn, đường cong cũng kết hợp một mô hình dự đoán, phân tích những thay đổi độ dốc của đường cong để cố gắng dự đoán sự đảo ngược tiềm năng 1-2 thanh trước.
Ngoài ra, một chỉ số sóng động lực được sử dụng để xác định hướng xu hướng trong một khung thời gian lớn hơn.
Cuối cùng, chiến lược cung cấp các đề xuất mua và bán khi các tín hiệu được kích hoạt. Các nhà giao dịch có thể quyết định có nên theo dõi chúng hay không.
Nhiều chỉ số cải thiện độ chính xác Kết hợp các chỉ số giúp xác nhận xu hướng và đảo ngược tại chỗ, tránh những cạm bẫy chỉ số duy nhất.
Mô hình dự đoán cung cấp cảnh báo sớm về sự đảo ngược Đường cong dự đoán có thể chạy trước các tín hiệu thực tế, cho phép các quyết định giao dịch bắt đầu.
Động lực sóng đánh giá hướng xu hướng tổng thể Kết hợp sóng động lực khung thời gian cao hơn tránh giao dịch chống lại các xu hướng chính.
Các thông số tùy chỉnh phù hợp với các sản phẩm khác nhau Người dùng có thể điều chỉnh các tham số chỉ số để phù hợp với các đặc điểm của các sản phẩm giao dịch khác nhau.
Mô hình dự đoán có thể gây ra giao dịch quá mức Mô hình dự đoán có thể tạo ra các tín hiệu sai.
Tối ưu hóa khó với nhiều tham số Với nhiều thông số, việc tìm ra sự kết hợp tối ưu đòi hỏi các bộ dữ liệu rộng rãi và thử nghiệm kéo dài.
Hiệu quả của chỉ số cần đánh giá thận trọng Lợi ích gia tăng thực tế của mỗi chỉ số cần đánh giá cẩn thận để tránh dư thừa.
Chi phí giao dịch thực tế nên được xem xét Giao dịch thường xuyên sẽ gây ra chi phí cao hơn.
Đánh giá và điều chỉnh mô hình dự đoán
Đánh giá độ chính xác dự đoán và tối ưu hóa các thông số để cải thiện độ tin cậy.
Đơn giản hóa mô hình bằng cách giảm dư thừa Chấp nhận đánh giá hiệu quả của chỉ số và đơn giản hóa mô hình để loại bỏ sự phức tạp không cần thiết.
Kiểm tra độ bền trên các thị trường Thực hiện các thử nghiệm hậu quả trên nhiều thị trường để xác minh kết quả tối ưu hóa và độ bền.
Điều chỉnh chiến lược dựa trên chi phí thực tế Đưa chi phí thực tế vào backtest để điều chỉnh các tham số chiến lược cho tần suất giao dịch thấp hơn.
Chiến lược Orion tổng hợp nhiều chỉ số và một đường cong dự đoán độc đáo để cố gắng xác định các vòng quay sớm. Nó có những ưu điểm nhưng khả năng mở rộng cũng bị hạn chế.
/*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