از ATR برای از دست دادن استفاده کنید

ساخت وبلاگ

در این مقاله ، ما یک استراتژی تجارت ساده را با استفاده از نشانگر ATR پیاده سازی خواهیم کرد.

ایده تجارت:

از بحث در پست قبلی ، خود ATR نشانه ای از روند قیمت را ارائه نمی دهد. در عوض ، از آن برای اندازه گیری نوسانات بازار استفاده می شود. سهام با سطح بالایی از نوسانات معمولاً دارای ATR بالاتری است و به همین ترتیب ، سهام با نوسانات پایین تر دارای ATR پایین تر است.

یک تجارت قدیمی که می گوید "بازار پله ها را بالا می برد و آسانسور را پایین می آورد."این پدیده با ضریب ترس از تأمین مالی رفتاری توضیح داده شده است ، این همان نحوه عملکرد بازار سهام قرن هاست. همانطور که از نمودار زیر مشاهده می شود ، در حین رکود ، نشانگر ATR تمایل دارد نوسانات بالاتری را نسبت به روند UP ارسال کند.

ATR

بنابراین ، ما می توانیم از ATR به عنوان یک شاخص از دست دادن توقف برای خروج سفارش و برای محافظت از خطر نزولی (به اصطلاح خروج لوستر) استفاده کنیم. خروجی لوستر یک ایستگاه دنباله دار را در زیر بالاترین میزان سهام که از زمان ورود به تجارت به آن رسیده است ، قرار می دهد. فاصله بین بالاترین سطح و سطح توقف به عنوان برخی از چندین ATR تعریف شده است. مثلا،

  • اگر سهام را با قیمت 100 دلار خریداری کنید و مقدار ATR 3 باشد ، ممکن است ضرر توقف را در 2 x ATR زیر قیمت ورودی قرار دهید. یعنی 100-2*3 = 94 دلار ،
  • اگر سهام خود را با قیمت 100 دلار و ATR 3 فروخته اید ، ممکن است ضرر توقف را در 2 x ATR بالاتر از قیمت ورودی قرار دهید. یعنی 100+2*3 = 106 دلار
  • هنگامی که قیمت بازار همچنان در حال افزایش است (کاهش برای سفارش فروش) ، ما سطح ضرر توقف را به سمت بالا (رو به پایین) با ATR چندگانه محاسبه شده تجدید نظر خواهیم کرد

منطق تجارت:

فرض کنید ما برای ورود سفارش از RSI (14) استفاده می کنیم (به شاخص فنی - شاخص قدرت نسبی (RSI)) و ATR (14) برای خروج سفارش مراجعه کنید و این استراتژی را در قیمت بسته شدن روزانه Nikkei 225 CFD (یعنی JPXJPY) اعمال کنید. در طول سال 2020.

  • بر اساس یک رویکرد پنجره کشویی برای جمع آوری 14 قیمت بسته قبلی
  • آخرین مقادیر ATR و RSI را محاسبه کنید
  • سفارش شرایط باز:
    • اگر موقعیت برجسته ای نداریم ،
      • اگر ارزش RSI 70 باشد ، ما یک سفارش فروش را با سطح Stoploss تنظیم می کنیم که روی قیمت فعلی + 2*ATR تنظیم شده است
      • اگر موقعیت فوق العاده ای داشته باشیم ،
        • اگر قبلاً سفارش خرید را ارسال می کردیم ، سطح متوقف کردن-از دست دادن را به حداکثر از دست دادن متوقف شده قبلی و (قیمت فعلی-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: درست است

        result

        افکار نهایی

        برخی از نکات برجسته برای استفاده از ATR در استراتژی معاملاتی به شرح زیر است:

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

برچسب : نویسنده : آرش اصل زاد بازدید : <-PostHit-> تاريخ : دوشنبه 25 ارديبهشت 1402 ساعت: 16:23