
در این مقاله روشهای مختلفی برای افزایش ثبات عملکرد روبات های تجاری با از بین بردن محرکهای مکرر احتمالی (پچ پچ) توضیح داده شده است: هم با استفاده از الگوریتم های ورودی و خروج به طور جداگانه و همچنین اتصال آنها.
ماهیت مشکل
مشکل محرک های کاذب به ویژه در هنگام غرق شدن و افزایش شدید در بازار برجسته است که دامنه شمعدان فعلی زیاد باشد ، و هیچ اقدامات احتیاطی علیه پچ پچ ارائه شده در الگوریتم یک ربات بازرگانی وجود ندارد. این امر باعث باز شدن و بسته شدن موقعیت های متعدد در شمعدان فعلی می شود.
عواقب مالی مختلف است و به الگوریتم های خاص پارامترهای بازار بستگی دارد که توسط توسعه دهندگان روبات های تجاری تعیین شده است. در هر صورت ، هزینه های معامله گر به طور متناسب با تعداد محرک ها در حین پچ پچ افزایش می یابد.
در این مقاله ، من موضوع تجزیه و تحلیل ابزارهای مالی (از شخصیت فنی و اساسی) را در نظر نمی گیرم که می تواند بر ثبات عملکرد مشاوران متخصص تجارت تأثیر بگذارد و به جلوگیری از پراکندگی کمک کند (این یک موضوع جداگانه است - من نویسنده کتاب هستمتئوری و سیستم های تعادل Impulse که مبتنی بر آن است). در اینجا ، ما به اقدامات نرم افزاری که مستقیماً به روش های تجزیه و تحلیل بازارهای مالی بستگی ندارند ، خواهیم پرداخت.
بنابراین ، بیایید به حل مشکل بپردازیم. به عنوان نمونه ، من از مشاور خبره "MACD Sample" از مجموعه استاندارد موجود در ترمینال مشتری ETATRADER 4 استفاده خواهم کرد.
این تفسیر بصری از مشکل پراکندگی است که با نمونه ای نشان داده شده است که در آن قیمت یوروسی در 2 اکتبر امسال (м15 "،" نمونه MACD "EA با تنظیمات پیش فرض):

تصویر به وضوح 8 محرک بعدی (خرید ورودی) را بر روی یک شمعدان واحد نشان می دهد. فقط 1 مورد از آنها صحیح است (از نظر منطق عادی بازار) ، 7 باقی مانده پراکنده هستند.
دلایل محرک های دروغین در این مورد خاص عبارتند از:
- این یک مقدار اندک TakeProfit در تنظیمات پیش فرض (الگوریتم خروج) است ، بنابراین هر موقعیت به سرعت بسته می شود.
- و همچنین الگوریتم ورودی "نمونه MACD" EA که پس از بسته شدن موقعیت قبلی با اجازه ورود به مضاعف ، با وجود تعداد ورودی های این شمعدان ، ایجاد می شود.
ما قبلاً توافق کرده ایم که مسائل مربوط به نوسانات بازار فیلتر به صورت هدف مورد توجه قرار نمی گیرد (از آنجا که هر معامله گر الگوریتم ورود و خروج خود را دارد) ، بنابراین برای حل مسئله ، ما عوامل زیر را با ماهیت عمومی تر در نظر خواهیم گرفت:
- زمان (طول شمعدان) ،
- تعداد محرک ها (پیشخوان) ،
- دامنه حرکت (دامنه شمعدان).
راه حل در الگوریتم ورودی
ساده ترین و در عین حال قابل اطمینان ترین روش برای رفع نقطه ورود از طریق ضریب زمانی است ، دلایل آن موارد زیر است:
- پیشخوان مقدار محرک ها به معنای ایجاد یک حلقه در برنامه است که نه تنها الگوریتم را پیچیده می کند ، بلکه سرعت یک مشاور متخصص تجارت را نیز کند می کند.
- دامنه و سطح کنترل مرتبط با قیمت می تواند تکرار شود زیرا قیمت ها در معیارهای معکوس شمعدان بازده با معیارهای سطح قیمت نابرابر باز می گردند.
- زمان برگشت ناپذیر است ، فقط در یک جهت حرکت می کند (افزایش) ، بنابراین ، دقیق ترین و حتی معیارهای حل مسئله با ارائه یک ماشه یک بار یا حذف پراکندگی است.
به این ترتیب ، عامل اصلی لحظه تحریک الگوریتم ورود ، به طور خاص تر ، لحظه تحریک سفارش برای باز کردن موقعیت (سفارش) است ، زیرا ممکن است این دو لحظه مطابقت نداشته باشد ، اگر برخی از تأخیرهای ویژه از سفارش باز باشدموجود در الگوریتم.
بنابراین ، می توانیم لحظه (زمان فعلی) را هنگام باز کردن موقعیت به خاطر بسپاریم. اما چگونه می توان از این پارامتر در الگوریتم ورودی استفاده کرد تا ورودی های دوم و متعاقب آن را در شمعدان مشخص شده ممنوع کند؟ما این لحظه را از قبل (مقدار مطلق آن) نمی دانیم ، بنابراین نمی توانیم از قبل در الگوریتم ورود وارد شویم. این الگوریتم باید شرایط مشترک خاصی را در نظر بگیرد که اولین ورودی را روی شمعدان حل کند ، اما تمام ورودی های متعاقب آن را بدون محاسبه محرک ها ممنوع می کند (گزینه ای با پیشخوان که قبلاً کاهش یافته ایم).
راه حل نسبتاً ساده است. ابتدا یک کد با برخی از نظرات می نویسم ، و سپس در جزئیات بیشتر توضیح می دهم. این یک کد کمکی است (که به رنگ زرد برجسته شده است) ، که باید در الگوریتم مشاور متخصص تجارت قرار گیرد (به MACD_SAMPLE_PLUS1. MQ4 مراجعه کنید):
//+------------------------------------------------------------------+ // |macd sample. mq4 | // |کپی رایت 2005-2014 ، Corp. نرم افزار Metaquotes | // |https://www. mql4. com | //+------------------------------------------------------------------+ #ویژگی کپی رایت "2005-2014 ، Metaquotes Software Corp." #ویژگی ارتباط دادن "https://www. mql4. com" ورودی دو برابرTakeProfit =50; ورودی دو برابرتعداد زیادی =0.1; ورودی دو برابرtrailingStop =30; ورودی دو برابرmacDopenlevel =3; ورودی دو برابرmacDcloselevel =2; ورودی در نظر گرفتنmatrendperiod =26; // --- متغیر جدید را وارد کنید (مقدار در ثانیه برای 1 بار از این TF ، برای м15 برابر است با 60 с х 15 = 900 с) زمان قرارtime_open =900; // --- متغیر جدید را وارد کنید (زمان باز کردن نوار با 1 ورودی) زمان قرارtime_bar =0; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ خالی مکتب(خالی) <دو برابرMacDcurrent ، MacDprevious ؛دو برابرسیگنال جریان ، سیگنال ؛دو برابرMACURRENT ، MapRevious ؛در نظر گرفتنCNT ، بلیط ، کل ؛//--- // بررسی داده های اولیه // مهم است که اطمینان حاصل کنیم که متخصص با یک عادی کار می کند // نمودار و کاربر هیچ اشتباهی در تنظیم خارجی انجام نداد // متغیرها (تعداد زیادی ، Stoploss ، TakeProfit ، // trailingstop) در مورد ما ، ما TakeProfit را بررسی می کنیم // در نمودار کمتر از 100 میله //--- if(میله100) <چاپ("میله های کمتر از 100"); برگشت;> if(TakeProfit10) <چاپ("استفاده کمتر از 10"); برگشت;> // --- برای ساده کردن برنامه نویسی و سرعت بخشیدن به داده های دسترسی در متغیرهای داخلی قرار می گیردmacDcurrent =imacd(خالی,0,12,26,9,close قیمت، mode_main ،0) ؛macDprevious =imacd(خالی,0,12,26,9,close قیمت، mode_main ،1) ؛سیگنالimacd(خالی,0,12,26,9,close قیمت، mode_signal ،0) ؛سیگنالimacd(خالی,0,12,26,9,close قیمت، mode_signal ،1) ؛mAcurrent =IMA(خالی,0، matrendperiod ،0,حالت_ما,close قیمت,0) ؛mapRevious =IMA(خالی,0، matrendperiod ،0,حالت_ما,close قیمت,1) ؛کل =حاد(); if(کل 1) <// --- بدون سفارش باز شده مشخص نشده است if(AccountFreeMargin ()<(1000*مقدار زیادی))<چاپ("We have no money. Free Margin keyword">برگشت;> // --- امکان موقعیت طولانی (خرید) را بررسی کنید // --- رشته جدید را وارد کنید (در صورت باز شدن نوار جدید ، ممنوعیت ورود مکرر را حذف می کند) if( (تایما() - Time_bar)> 900) time_open =900; if(MacDcurrent0 && MacdCurrent>سیگنال(MacdCurrent)>(MacDopenlevel*نقطه) && MaCurrent>MapRevious &&(تایما()-زمان[0]) // رشته جدید را وارد الگوریتم ورودی کنید (فقط یک بار انجام می شود ، شرایط این شمعدان پس از آن تکمیل نمی شود) سفارش دادن(سمبل() ، op_buy ، تعداد زیادی ، سؤال کردن ،3,0، بپرسید+TakeProfit*نقطه,"نمونه MACD",16384,0،سبز)؛if(ticket>0) <if(انتخاب کردن(بلیط ، select_by_ticket ، mode_trades))<چاپ("خرید سفارش باز شد:"، OrderOpenPrice ()) ؛time_open =تایما()-زمان[0]; // رشته جدید را وارد کنید (فاصله زمانی را از زمان باز شدن نوار با ورود تا لحظه خروج وارد کنید) time_bar = زمان [0]; // رشته جدید را وارد کنید (به یاد داشته باشید زمان باز شدن نوار که 1 ورودی داشت)>> دیگر چاپ("خطای باز کردن سفارش خرید:",گلیستور()); برگشت;>به جای زمان مطلق (لحظه ورود) از زمان نسبی - فاصله زمانی از لحظه باز کردن شمعدان فعلی تا لحظه ورود استفاده می کنیم. این مقدار سپس با یک مقدار زمان نسبتاً بزرگ و نسبتاً بزرگ (طول کل شمعدان) مقایسه می شود ، که اجازه می دهد تا اولین ورودی شروع شود. در لحظه باز کردن موقعیت ، ما با نوشتن مقدار شکاف زمان از ابتدای شمعدان تا نقطه واقعی بسته شدن ، مقدار متغیر time_open را تغییر می دهیم (کاهش می دهیم). و از آنجا که در هر لحظه متعاقب زمان ، ارزش (timeCurrent () - زمان [0]) از مقدار که در نقطه ورود نوشتیم ، پس از آن (TimeCurrent () - Time [0]) فراتر خواهد رفت
به این ترتیب ، بدون هیچ گونه پیشخوان از میزان ورودی ها و تجزیه و تحلیل دامنه حرکت قیمت ، مشکل محرک های کاذب را حل کرده ایم.
در زیر نتیجه چنین بهبود ساده الگوریتم اولیه ورود EA ("MACD sample_plus1") آمده است:

می بینیم که فقط یک ورودی در شمعدان وجود دارد ، هیچ محرک دروغین وجود ندارد و پراکندگی کاملاً از بین می رود. تنظیمات به طور پیش فرض کاملاً ذخیره شده است ، بنابراین واضح است که مشکل بدون کمک تغییر تنظیمات EA حل می شود.
اکنون که مشکل پراکندگی در ورودی حل شده است ، ما الگوریتم ورود را بهبود می بخشیم تا یک پراکندگی احتمالی را که با بسته شدن سریع موقعیت ظاهر می شود ، حذف کنیم ، که در این مورد خاص سود را افزایش می دهد (ضربه خوب است و خروج بودسریع ، زودرس).
راه حل در الگوریتم خروج
از آنجا که مشکل اولیه شامل حذف پراکندگی احتمالی ربات تجارت به جای افزایش سود است ، من مسائل مربوط به تجزیه و تحلیل پویایی ابزارهای مالی را در رابطه با این موضوع در نظر نمی گیرم و خودم را با رفع پارامتر انتخاب شده بدون در نظر گرفتن چنین پویایی محدود می کنم.
پیش از این ما از یک پارامتر ایمن و فاکتور زمانی استفاده کرده ایم و دوباره از آن استفاده خواهیم کرد که لحظه بستن موقعیت را به زمان ، خاص ، در نقطه باز کردن شمعدان زیر (بعد از ورود) تنظیم می کنیم. این لحظه در الگوریتم خروج به عنوان:
if(!انتخاب کردن(cnt ، select_by_pos ، mode_trades))ادامه هید; if(OrderType () // برای موقعیت باز شده بررسی کنیدordersymbol () ==سمبل()) // نماد را بررسی کنید <// --- موقعیت طولانی باز می شود if(OrderType () == op_buy)<// --- آیا باید بسته شود؟ if(/* MacdCurrent>0 && MacdCurrentSignalPrevious && // remove code of triggering exit on MACD, not to disturb a new condition of closing (see further) MacdCurrent>(macDcloselevel *نقطه) && */ Bid>OrderOpenPrice () && // رشته جدید را وارد کنید - اختیاری (قیمت در یک منطقه مثبت در رابطه با سطح ورود) تایما() == زمان [0] ) // رشته جدید را وارد کنید (بهبود ساده الگوریتم خروج: خروج به شدت در لحظه باز کردن شمعدان فعلی است) <// --- سفارش نزدیک و خروج if(! OrderClose (OrderTicket () ، سفارش () ، پیشنهاد ،3، بنفش))چاپ("خطای سفارش",گلیستور()); برگشت;>چنین اصلاح جزئی به الگوریتم ورود اجازه می دهد (موقعیت باز شده ، هیچ شرایطی برای بسته شدن) ، موقعیت تا زمان timeCurrent () == زمان [0] طول می کشد و همزمان در ابتدای یک شمعدان جدید بعد از ضربه بسته می شود. سرانجام ، علاوه بر محافظت از پراکندگی ، ما نیز سود خوبی کسب کردیم (به عکس "macd sample_plus2" مراجعه کنید):

برای این منظور ما مجبور شدیم ماشه توسط MACD را از الگوریتم خروجی حذف کنیم ، در غیر این صورت شرط لازم برای خروج قادر به وقوع نخواهد بود.
بنابراین ، به نظر می رسد که مشکل پراکندگی را می توان به طور جداگانه در الگوریتم های ورودی و خروجی حل کرد. حال ، بیایید با اتصال این الگوریتم های موقعیت های باز و بسته شدن ، چگونگی حل یک مشکل را مورد بحث قرار دهیم.
اتصال الگوریتم های ورودی و خروج
اتصال به معنای مدل سازی مقدماتی خاصی از کل فرآیند است: موقعیت باز - مدیریت - موقعیت بسته شدن. این همچنین در انتخاب تغییر در شاخص ها و توابع مورد استفاده در الگوریتم های ورودی و خروج منعکس شده است.
به عنوان مثال ، اگر از شرایط TimeCurrent () = زمان [0] در الگوریتم خروجی استفاده می کنید ، و نقطه خروج با ابتدای شمعدان فعلی تنظیم می شود ، پس الگوریتم ورود باید روی میله های کامل قبلی آزمایش شود ، بنابراین از آن خارج شوید. شرایط را می توان برآورده کرد. بنابراین ، برای بستن موقعیت تحت شرایط timeCurrent () = زمان [0] بدون هیچ شرایط اضافی ، لازم است که کل الگوریتم مقایسه (در خروجی) در نوار قبلی انجام شود. باید یک جبران وجود داشته باشد که برابر با 1 در تنظیمات شاخص هایی باشد که در مقایسه مقادیر شرکت می کنند. در این حالت مقایسه مقادیر صحیح خواهد بود و آغاز شمعدان فعلی یک پایان منطقی به الگوریتم خروج خواهد بود.
به این ترتیب ، اتصال الگوریتم های خروج و ورود نیز به ضریب زمان مرتبط است.
نتیجه
مشکل تحریک کاذب مشاوران خبره با استفاده از ضریب زمانی در الگوریتم ورود به طور مؤثر حل می شود. پایداری اضافی کار برای EA را می توان با رفع نقطه خروج (به عنوان مثال ، با گذشت زمان) و اتصال الگوریتم های ورود و خروج از طریق مدل سازی اولیه منطق اصلی تحریک و جبران (نوار که در آن شاخص یا عملکرد محاسبه می شود) حاصل شود. بشر
در زیر کدهای EA: مورد اولیه (macd_sample. mq4) ، با ورود بهبود یافته (macd_sample_plus1. mq4) و با خروج بهبود یافته (macd_sample_plus2. mq4). فقط کانال های خرید بهبود می یابند ، در حالی که کانال های فروش بدون تغییر عمدا برای مقایسه الگوریتم های اولیه و بهبود یافته باقی می مانند.
و مطمئناً ، تمام EAS نشان داده شده برای اهداف تظاهرات هستند و برای تجارت واقعی در بازارهای مالی در نظر گرفته نشده اند.
کتاب آموزش بورس...
ما را در سایت کتاب آموزش بورس دنبال می کنید
برچسب : نویسنده : محمود استادمحمد بازدید : 24 تاريخ : پنجشنبه 19 مرداد 1402 ساعت: 23:31