اگر موقعیت فوق العاده ای داشته باشیم ، - اگر قبلاً سفارش خرید را ارسال می کردیم ، سطح متوقف کردن-از دست دادن را به حداکثر از دست دادن متوقف شده قبلی و (قیمت فعلی-2*ATR) به روز کنید
- اگر قبلاً سفارش فروش را ارسال کردیم ، سطح توقف-از دست دادن را به حداقل از دست دادن توقف قبلی و (قیمت فعلی + 2*ATR) به روز کنید
حال ، بیایید الگوریتم معاملاتی خود را گام به گام بنویسیم.
مرحله 1. مقدار RSI و ATR را محاسبه کنید
اول از همه، "RSI_period"، "ATR_period" و "instrument" را در زمان اولیه تعریف می کنیم.
1 2 3 4 5 6 7 8 9 10 11
از جانب AlgoAPI وارد كردنAlgoAPIUtil، AlgoAPI_Backtestاز جانب زمان قرار وارد كردنتاریخ، زمان دلتااز جانب طالب وارد كردنRSI، ATRوارد كردن بی حسی as np کلاس AlgoEvent: دف __ابتدا__(خود): خود.تایمر=زمان قرار(1970,1,1) خود.RSI_period= 14 خود.ATR_period= 14 خود.ابزار= "JPXJPY"
ما از تابع API getHistoricalBar برای جمع آوری مشاهدات تاریخی استفاده می کنیم. سپس، یک کتابخانه پایتون 'talib. RSI'، 'talib. ATR' را برای محاسبه آخرین مقدار RSI و ATR اعمال می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
دف on_marketdatafeed(خود, md, ab):# استراتژی را هر 24 ساعت اجرا کنید ifmd.مهر زمانی>= خود.تایمر+زمان دلتا (ساعت=24): # قیمت پایانی 14 را دریافت کنیدپاسخ= خود.EVT.getHistoricalBar("ابزار":خود.instrument>, خود.RSI_period+1, "د") arrClose=np.آرایه([res[t]['ج'] برایتیinres]) arrHigh=np.آرایه([res[t]['h'] برایتیinres]) arrLow=np.آرایه([res[t]["من"] برایتیinRes])# مقدار RSI فعلی را محاسبه کنیدRSI_cur=RSI(arrClose,خود.RSI_period)[-1] # مقدار ATR فعلی را محاسبه کنیدATR_cur=ATR(arrHigh، arrLow، arrClose,خود.ATR_period)[-1] # مقدار RSI و ATR را در کنسول چاپ کنید خود.EVT.consoleLog("RSI_cur، ATR_cur ="، RSI_cur، ATR_cur)# تایمر به روز رسانی خود.تایمر=md.مهر زمانی مرحله 2. شرایط ورود سفارش
ما بیشتر «rsi_overbought»، «rsi_oversold» و «ATR_multiple» را در زمان اولیه تعریف می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
از جانب AlgoAPI وارد كردنAlgoAPIUtil، AlgoAPI_Backtestاز جانب زمان قرار وارد كردنتاریخ، زمان دلتااز جانب طالب وارد كردنRSI، ATRوارد كردن بی حسی as np کلاس AlgoEvent: دف __ابتدا__(خود): خود.تایمر=زمان قرار(1970,1,1) خود.تایمر=زمان قرار(1970,1,1) خود.RSI_period= 14 خود.ATR_period= 14 خود.ابزار= "JPXJPY" خود.rsi_بیش از حد خرید= 70 خود.rsi_oversold= 30 خود.ATR_multiple= 2
ما همچنین یک تابع 'open_order' برای رسیدگی به ارسال سفارش ایجاد می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
دف open_order(خود, buysell, current_price, ATR):# سطح توقف ضرر را 2*ATR زیر قیمت فعلی برای سفارش خرید تنظیم کنید ifخرید فروش==1: sl=قیمت فعلی- خود.ATR_multiple*ATR# سطح توقف ضرر را برای سفارش خرید 2*ATR بالاتر از قیمت فعلی تنظیم کنید دیگر: sl=قیمت فعلی+ خود.ATR_multiple*ATR# ایجاد شی سفارشسفارش=AlgoAPIUtil.OrderObject(ابزار= خود.ساز، بسته باز= 'باز کن'، خرید فروش=خرید فروش،#1=خرید، -1=فروشنوع سفارش= 0, #0=بازار، 1=حدجلد= 0. 01، stopLossLevel=sl)# ارسال سفارش به سرور خود.EVT.ارسال سفارش (سفارش)
اکنون ، ما عملکرد سیستم 'on_marketdatafeed' را برای سفارش منطق باز به روز می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 28 29 30 31 32 33 34 35 36 37 37
دف on_marketdatafeed(خود, md, ab):# استراتژی را هر 24 ساعت اجرا کنید ifmd.مهر زمانی>= خود.تایمر+زمان دلتا (ساعت=24): # قیمت پایانی 14 را دریافت کنیدپاسخ= خود.EVT.getHistoricalBar("ابزار":خود.instrument>, خود.RSI_period+1, "د") arrClose=np.آرایه([res[t]['ج'] برایتیinres]) arrHigh=np.آرایه([res[t]['h'] برایتیinres]) arrLow=np.آرایه([res[t]["من"] برایتیinRes])# مقدار RSI فعلی را محاسبه کنیدRSI_cur=RSI(arrClose,خود.RSI_period)[-1] # مقدار ATR فعلی را محاسبه کنیدATR_cur=ATR(arrHigh، arrLow، arrClose,خود.ATR_period)[-1] # مقدار RSI و ATR را در کنسول چاپ کنید خود.EVT.consoleLog("RSI_cur، ATR_cur ="، RSI_cur، ATR_cur)# موقعیت برجستهPOS ، Osorder ، Pendorder= خود.EVT.getSystemOrders ()# اگر موقعیتی برجسته نداریم ، سفارش را باز کنید ifPOS [خود.ابزار]["NetVolume"]==0: # در صورت بیش از حد سفارش فروش را باز کنید ifrsi_cur>خود.rsi_overbought:خود.Open_order (-1، دکتر.LastPrice ، ATR_CUR)# در صورت فراتر از آن ، سفارش خرید را باز کنید الیفrsi_curخود.RSI_OVERSOLD:خود.Open_order (1، دکتر.LastPrice ، ATR_CUR)# تایمر به روز رسانی خود.تایمر=md.مهر زمانی مرحله 3. شرایط نزدیک را سفارش دهید
برای منطق بسته شدن سفارش ، ما سطح از دست دادن توقف جدید را در عملکرد "on_marketdatafeed" دوباره محاسبه و به روز می کنیم.(به خط 36 - 49 مراجعه کنید)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 15 16 17 18 19 20 21 22 23 24 25 26 28 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 5051 52 53
دف on_marketdatafeed(خود, md, ab):# استراتژی را هر 24 ساعت اجرا کنید ifmd.مهر زمانی>= خود.تایمر+زمان دلتا (ساعت=24): # قیمت پایانی 14 را دریافت کنیدپاسخ= خود.EVT.getHistoricalBar("ابزار":خود.instrument>, خود.RSI_period+1, "د") arrClose=np.آرایه([res[t]['ج'] برایتیinres]) arrHigh=np.آرایه([res[t]['h'] برایتیinres]) arrLow=np.آرایه([res[t]["من"] برایتیinRes])# مقدار RSI فعلی را محاسبه کنیدRSI_cur=RSI(arrClose,خود.RSI_period)[-1] # مقدار ATR فعلی را محاسبه کنیدATR_cur=ATR(arrHigh، arrLow، arrClose,خود.ATR_period)[-1] # مقدار RSI و ATR را در کنسول چاپ کنید خود.EVT.consoleLog("RSI_cur، ATR_cur ="، RSI_cur، ATR_cur)# موقعیت برجستهPOS ، Osorder ، Pendorder= خود.EVT.getSystemOrders ()# اگر موقعیتی برجسته نداریم ، سفارش را باز کنید ifPOS [خود.ابزار]["NetVolume"]==0: # در صورت بیش از حد سفارش فروش را باز کنید ifrsi_cur>خود.rsi_overbought:خود.Open_order (-1، دکتر.LastPrice ، ATR_CUR)# در صورت فراتر از آن ، سفارش خرید را باز کنید الیفrsi_curخود.RSI_OVERSOLD:خود.Open_order (1، دکتر.LastPrice ، ATR_CUR)دیگر: # سطح توقف ضرر جدید ATR را محاسبه کنید برایشناسه تجاریin فهرست(osOrder): خرید فروش=osOrder[tradeID]["خرید فروش"] sl=osOrder[tradeID]["stopLossLevel"] ifخرید فروش==1: sl= حداکثر(sl, md.آخرین قیمت-خود.ATR_multiple*ATR_cur)الیفخرید فروش==-1: sl= دقیقه(sl, md.آخرین قیمت+خود.ATR_multiple*ATR_cur)# به روز رسانی به سطح توقف ضرر جدید خود.EVT.update_opened_order(tradeID=شناسه تجاری، sl=sl)# تایمر به روز رسانی خود.تایمر=md.مهر زمانی کد منبع کامل
با ترکیب همه موارد بالا، اسکریپت کامل در زیر ارائه شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 4 4 4 3 451 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 66 68 69 70 71 72 73 73 74 75 76 77 78 79 80 81 82 83 84 85 85 86 87 88 89 90 91 92 92 93 94 94 95 96 97 98 98 99 100101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
از جانب AlgoAPI وارد كردنAlgoAPIUtil، AlgoAPI_Backtestاز جانب زمان قرار وارد كردنتاریخ، زمان دلتااز جانب طالب وارد كردنRSI، ATRوارد كردن بی حسی as np کلاس AlgoEvent: دف __ابتدا__(خود): خود.تایمر=زمان قرار(1970,1,1) خود.تایمر=زمان قرار(1970,1,1) خود.RSI_period= 14 خود.ATR_period= 14 خود.ابزار= "JPXJPY" خود.rsi_بیش از حد خرید= 70 خود.rsi_oversold= 30 خود.ATR_multiple= 2 دف شروع کنید(خود، mEvt):خود.EVT=AlgoAPI_Backtest.AlgoEvtHandler(خود، mEvt)خود.EVT.شروع ()دف on_marketdatafeed(خود, md, ab):# استراتژی را هر 24 ساعت اجرا کنید ifmd.مهر زمانی>= خود.تایمر+زمان دلتا (ساعت=24): # قیمت پایانی 14 را دریافت کنیدپاسخ= خود.EVT.getHistoricalBar("ابزار":خود.instrument>, خود.RSI_period+1, "د") arrClose=np.آرایه([res[t]['ج'] برایتیinres]) arrHigh=np.آرایه([res[t]['h'] برایتیinres]) arrLow=np.آرایه([res[t]["من"] برایتیinRes])# مقدار RSI فعلی را محاسبه کنیدRSI_cur=RSI(arrClose,خود.RSI_period)[-1] # مقدار ATR فعلی را محاسبه کنیدATR_cur=ATR(arrHigh، arrLow، arrClose,خود.ATR_period)[-1] # مقدار RSI و ATR را در کنسول چاپ کنید خود.EVT.consoleLog("RSI_cur، ATR_cur ="، RSI_cur، ATR_cur)# موقعیت برجستهPOS ، Osorder ، Pendorder= خود.EVT.getSystemOrders ()# اگر موقعیتی برجسته نداریم ، سفارش را باز کنید ifPOS [خود.ابزار]["NetVolume"]==0: # در صورت بیش از حد سفارش فروش را باز کنید ifrsi_cur>خود.rsi_overbought:خود.Open_order (-1، دکتر.LastPrice ، ATR_CUR)# در صورت فراتر از آن ، سفارش خرید را باز کنید الیفrsi_curخود.RSI_OVERSOLD:خود.Open_order (1، دکتر.LastPrice ، ATR_CUR)دیگر: # سطح توقف ضرر جدید ATR را محاسبه کنید برایشناسه تجاریin فهرست(osOrder): خرید فروش=osOrder[tradeID]["خرید فروش"] sl=osOrder[tradeID]["stopLossLevel"] ifخرید فروش==1: sl= حداکثر(sl, md.آخرین قیمت-خود.ATR_multiple*ATR_cur)الیفخرید فروش==-1: sl= دقیقه(sl, md.آخرین قیمت+خود.ATR_multiple*ATR_cur)# به روز رسانی به سطح توقف ضرر جدید خود.EVT.update_opened_order(tradeID=شناسه تجاری، sl=sl)# تایمر به روز رسانی خود.تایمر=md.مهر زمانیدف open_order(خود, buysell, current_price, ATR):# سطح توقف ضرر را 2*ATR زیر قیمت فعلی برای سفارش خرید تنظیم کنید ifخرید فروش==1: sl=قیمت فعلی- خود.ATR_multiple*ATR# سطح توقف ضرر را برای سفارش خرید 2*ATR بالاتر از قیمت فعلی تنظیم کنید دیگر: sl=قیمت فعلی+ خود.ATR_multiple*ATR# ایجاد شی سفارشسفارش=AlgoAPIUtil.OrderObject(ابزار= خود.ساز، بسته باز= 'باز کن'، خرید فروش=خرید فروش،#1=خرید، -1=فروشنوع سفارش= 0, #0=بازار، 1=حدجلد= 0. 01، stopLossLevel=sl)# ارسال سفارش به سرور خود.EVT.ارسال سفارش (سفارش)دف on_bulkdatafeed(خود، isSync، bd، ab):عبور دف on_newsdatafeed(خود، nd):عبور دف on_weatherdatafeed(خود، wd):عبور دف on_econsdatafeed(خود، ویرایش):عبور دف on_orderfeed(خود، از):عبور دف on_dailyPLfeed(خود، pl):عبور دف on_openPositionfeed(خود, op, oo, uo):عبور نتایج
اکنون، ما آماده هستیم تا این استراتژی را آزمایش کنیم.
- ابزار: JPXJPY
- دوره: 2020. 01 - 2020. 12
- سرمایه اولیه: 10000 دلار آمریکا
- فاصله داده ها: نوار 1 روزه
- اهرم: 100
- Allow Shortsell: درست است

افکار نهایی
برخی از نکات برجسته برای استفاده از ATR در استراتژی معاملاتی به شرح زیر است:
- ATR عمدتا برای تعیین شرایط خروج سفارش استفاده می شود، اما برای ورود سفارش استفاده نمی شود
- ATR های چند دوره ای (مثلاً 5 و 14) می توانند برای مقایسه و داشتن حسی در مورد "نوسانات بازار" اخیر استفاده شوند.
- قانون کلی برای دوره ATR 14 است
- آیا انتخاب بهتری وجود دارد؟
- آیا این مقدار می تواند به صورت پویا تغییر کند؟
- آیا به طور کلی برای سایر ابزارهای مالی / طبقات دارایی قابل اجرا خواهد بود؟