رویکرد BRUTE FORCE برای جستجوی الگو های بازار
در این مقاله، ما به دنبال الگوهای بازار، ایجاد Expert Advisor ها بر اساس الگوهای شناسایی شده و بررسی اینکه این الگو های بازار چه مدت اعتبار خود را حفظ میکنند، و چه مدت معتبر باقی میمانند، هستیم. من فکر میکنم این مقاله برای کسانی که سیستم های معاملاتی خود سازگار ایجاد میکنند بسیار مفید خواهد بود. من میخواهم ابتدا با توضیحی در مورد منظورم از مفهوم Brute force در زمینه معامله فارکس شروع کنم. به طور کلی، در رویکرد الگو Brute force میخواهیم برخی از دنباله اعداد را برای یک کد یا هر هدف دیگر تعیین کنیم، که در نهایت امکان دستیابی به نتیجه مطلوب را با حداکثر احتمال یا با حداکثر احتمال موجود با استفاده از این دنباله فراهم میکند. نتیجه دلخواه میتواند دریافت ارز رمزگذاری شده یا هک حساب یا رمز عبور Wi-Fi باشد. حوزه اپلیکیشن بسیار گسترده است. در مورد فارکس، دنباله ما باید ماکزیمم سود را ارائه دهد، در حالی که تا آنجا که ممکن است کار میکند. دنباله میتواند از هر نوع و طولی باشد. تنها شرط مورد نیاز، کارایی آن است. نوع دنباله در نهایت به الگوریتم ما بستگی دارد.
چه ویژگی خاصی در این تکنیک وجود دارد که تصمیم گرفتم آن را در نظر بگیرم؟
من همیشه سعی میکنم افکارم را بیان کنم تا بیشترین کاربرد عملی را برای سایر معامله گران داشته باشند. چرا من این کار را میکنم؟ سوال خوبیست. من میخواهم تجربه خود را با سایر معامله گران در میان بگذارم. خوشحال میشوم اگر کسی بتواند از ایده های من استفاده کند و چیز جالب و سودآوری را پیاده سازی کند، مهم نیست که من از آن سودی میبرم یا نه. من مطمئناً می فهمم که ایده ها ممکن است به طور کامل ایده های من نباشد و من ممکن است دوباره کاری کنم. من معتقدم که ما باید تجربیات خود را به اشتراک بگذاریم و تا آنجا که ممکن است با هم همکاری کنیم. شاید این رمز موفقیت باشد. دستیابی به هر چیز قابل توجهی به تنهایی، و جدا از همه افراد، دشوار است. به نظر من، موضوع الگو های بازار برای درک فیزیک بازار از اهمیت اساسی برخوردار است. شغل شما به عنوان یک معامله گر میتواند به درک ایده های اساسی بستگی داشته باشد، حتی اگر جمله “شغل شما به عنوان یک معامله گر” خنده دار به نظر برسد. امیدوارم که بتوانم برای افرادی که درباره این سوالات تحقیق میکنند مفید باشم.
درباره الگو های بازار Brute Force و تفاوت های آن با شبکه های عصبی
یک شبکه عصبی اساساً نوعی از الگو های بازار Brute force است. اما الگوریتم های آن با الگوریتم های ساده Brute force بسیار متفاوت است. من جزئیات معماری خاص شبکه عصبی و عناصر آنها را ارائه نمیدهم، اما سعی میکنم یک توصیف کلی ارائه دهم. من فکر میکنم، اگر به معماری خاصی پایبند باشیم، در سطح پیشرفته قابلیت های الگوریتم خود را محدود میکنیم. معماری ثابت، محدودیت جبران ناپذیری است. شبکه عصبی نوعی معماری از یک استراتژی احتمالی در رابطه با مورد ما است. در نتیجه، پیکربندی شبکه عصبی همیشه با یک فایل خاص با نگاشت شبکه مطابقت دارد. این همیشه به مجموعه ای از واحدهای خاص اشاره دارد. مانند پرینتر سه بعدی است: پارامترهای آیتم را تنظیم کنید و پرینتر، آن را تولید میکند. بنابراین، شبکه عصبی یک کد عمومی است که بدون نگاشت معنی ندارد. این مانند استفاده از هر زبان برنامه نویسی پیشرفته و به سادگی ایجاد یک پروژه خالی بدون استفاده از تمام قابلیت های آن است. در نتیجه، الگوی خالی هیچ کاری نمیکند. شبکه عصبی نیز همین طور است. برخلاف Brute force، یک شبکه عصبی میتواند تنوع تقریباً نامحدودی را در استراتژیها، تعداد معیارها و کارایی بالاتر فراهم کند. تنها عیب این روش این است که کارایی، بسیار به کیفیت کد بستگی دارد. افزایش پیچیدگی سیستم ممکن است منجر به افزایش هزینه در برنامه شود. در نتیجه، استراتژی ما به یک نگاشت شبکه تبدیل میشود، که معادل آن است. همین کار در رویکرد Brute force انجام میشود، اما در اینجا ما با یک دنباله ساده از برخی اعداد کار میکنیم. این دنباله بسیار ساده تر از نگاشت شبکه است، محاسبه آن آسانتر است، اما از نظر کارایی نیز محدودیت دارد. طرح زیر توضیحات بالا را نشان میدهد.
به عبارت دیگر، با یک رویکرد Brute force، دنبال های از اعداد را انتخاب میکنیم که با کد ما تعامل داشته و نتایج متفاوتی را ایجاد میکند. اما از آنجا که الگوریتم ثابت است، کل انعطاف پذیری آن در آرایه اعداد موجود است. طول آن ثابت است و ساختار آن بسیار ساده است. هنگام کار با یک شبکه عصبی، ما یک نگاشت شبکه را جستجو میکنیم که بهترین نتیجه را خواهد داشت. در هر صورت، ما دنباله خاصی از بایتها یا داده هایی را جستجو میکنیم که در نهایت به الگوریتم حاصل تبدیل میشوند. تنها تفاوت در قابلیت ها و پیچیدگی آنهاست.
Y = Cs[0]+Cs[1]*(x-x0)^1 + Cs[2]*(x-x0) ^2 + … + Cs[i]*(x-x0)^n
که در آن ضرایب قبل از توانها به عنوان مشتقات به ترتیب از 0 تا n عمل میکنند. با گسترش براکتها میتوان این حالت را به فرم سادهتری تبدیل کرد:
Y = C[0]+C[1]*x^1 + C[2]*x^2 + … + C[i]*x^n + …= Sum(0,+infinity)(C[i]x^i)
در این حالت، ما فقط یک متغیر داریم. این مجموعه میتواند از هر تابع پیوسته و قابل تغییر در نزدیکی هر نقطه x0 انتخاب شده تقلید کند. هرچه فرمول، عبارات بیشتری داشته باشد، تابع ما را با دقت بیشتری توصیف میکند. اگر تعداد آنها برابر با بی نهایت باشد، این معادل مطلق تابع ما است. من در اینجا نشان نخواهم داد که چگونه میتوان هر تابعی را در یک سری تیلور در هر نقطهای گسترش داد. این اطلاعات در هر کتاب ریاضی موجود است. اما نوع یک بعدی برای ما کافی نیست، زیرا ما میخواهیم از داده های چندین bar استفاده کنیم تا تنوع فرمول عمومی را افزایش دهیم. به همین دلیل است که باید از نوع چند بعدی استفاده شود:
Y = Sum(0,+Infinity)( C[i]*Product variant(x1^p1*x2^p2…*xN^pN) )
انواع دیگر فرمول بسیار دشوار است. همان منطق نسخه تک بعدی را دارد. ما باید تمام مشتقات جزئی احتمالی را ارائه دهیم. اگر بالاترین قدرت عبارات را محدود کنیم، در این صورت میتوان تعداد کل این عبارات را با استفاده از ترکیب و جمع محاسبه کرد. الگوریتم ما از محدودیت بالاترین درجه برای محدود کردن مصرف منابع محاسباتی استفاده خواهد کرد.
اما این هنوز برای راحت تر کردن تابع Brute force ما کافی نیست. بهتر است اولین عبارت C[0] را حذف کرده و اجازه دهید حداکثر تقارن تابع با توجه به مقادیر منفی یا مثبت باشد که ما آن را تامین خواهیم کرد. همچنین، یک راه حل مناسب تفسیر مقدار مثبت تابع به عنوان سیگنال خرید و مقدار منفی به عنوان سیگنال فروش خواهد بود. افزایش در حد پایین ماژول این سیگنال باید به طور ایده آل منجر به افزایش بازده انتظار و فاکتور سود شود، اما به طور حتم منجر به کاهش تعداد سیگنال ها خواهد شد. هرچه تابع به این نیازها نزدیکتر باشد، بهتر است. ما مقادیر توابع (Close[i]-Open[i]) یک candlestick خاص را به عنوان متغیر وارد خواهیم کرد.
آنچه اکنون باید انجام دهیم این است که به طور تصادفی متغیرهایی از این ضرایب را تولید کرده و نحوه رفتار آن را در تستر بررسی کنیم. البته، هیچ کس به طور دستی این ضرایب را تکرار نمیکند. بنابراین، ما به یک Expert Advisor نیاز داریم که بتواند چنین نسخه هایی را با حفظ هزاران نسخه از این دست، یا یک third-party solution که برخی از توابع استراتژی تستر را اجرا میکند، تولید کند. در ابتدا، مجبور شدم چنین Expert Advisor ای را در MQL4 بنویسم – این EA به همراه دستورالعمل ها به مقاله پیوست شده است، بنابراین میتواند برای همه استفاده شود. اما من از برنامه دیگری که در #C توسعه دادهام استفاده خواهم کرد. متأسفانه، به دلایل واضح نمیتوانم این برنامه را برای دسترسی رایگان ارائه دهم. قابلیت های آن فراتر از حوزه تحقیق است. اما من تمام قابلیت های آن را توصیف و نشان میدهم، بنابراین همه کسانی که میدانند چگونه برنامه نویسی کنند میتوانند این برنامه را تولید کنند. اسکرین شاتهای صفحه بعداً جایی که ما نتایج عملیات را تجزیه و تحلیل میکنیم، در مقاله ارائه میشود.
در اینجا ویژگی های اصلی برنامه وجود دارد. جستجوی آرایه ای از ضریبها در 2 مرحله انجام میشود. مرحله اول، به سادگی، یک quote بارگذاری شده را برای آرایه هایی جستجو میکند که ماکزیمم بازده مورد انتظار یا ماکزیمم عامل سود را در candlestick بعدی تولید میکنند. پاسها مشابه استراتژی تستر اجرا میشود. در حقیقت، این به سادگی در تلاش است فرمولی را پیدا کند که جهت bar بعدی را با حداکثر دقت پیش بینی کند. تعداد معینی از بهترین نتایج به عنوان انواع آرایه در حافظه و دیسک ذخیره میشوند. فقط بخشی از quote، قابل آزمایش است – درصد مربوط به فایل quote بارگذاری شده باید در اینجا مشخص شود. این مورد برای حذف مقادیر تصادفی در مرحله دوم استفاده میشود. مرحله دوم سفارشات بازار و منحنی تعادل را شبیه سازی میکند – این برای کل منطقه بارگیری شده انجام میشود. در همان زمان، همراه با جستجوی گزینه های با کیفیت بهتر، یک هموارسازی بیشتری در میزان سیگنال انجام میشود. این مرحله همچنین دارای فیلترهای مختلفی است که با استفاده از آنها میتوان نمودارهای هموارتری به دست آورد. نمودار هموارتر، فرمول موجود بهتری است. پس از اتمام مرحله جستجوی دوم، تعداد مشخصی از بهترین گزینه ها وجود دارد که میتوانند به صورت بصری در لیست مشاهده شوند. با انتخاب گزینه مورد نظر، تولید ربات معاملاتی MetaTrader 4 و MetaTrader 5 در تب سوم امکان پذیر خواهد بود. EA مطابق با الگویی از پیش تدوین شده تولید میشود که در آن شماره های دریافتی در مکانهای مشخصی، مشخص میشوند.
ساخت یک الگوی بازار ساده برای کار
این الگو در ابتدا در MQL4 ایجاد شده و سپس به MQL5 تبدیل شده است. این کد برای هر دو سیستم عامل (به طور مشابه با کد در مقاله قبلی) اقتباس شده است. من سعی میکنم این سازگاری را فراهم کنم تا زمان کمتری را برای سازگاری با راهحل صرف کنم. برای استفاده از آرایه های از پیش تعریف شده همانند MQL4، برخی از کدهای اضافی باید به Expert Advisor اضافه شوند، که در مقاله قبلی من، توضیح داده شد. بنابراین لطفاً آن مقاله را با جزئیات بررسی کنید. این دانش برای این مقاله لازم است. در واقع، این کار دشواری نیست و هر توسعه دهندهای میتواند چنین سازگاری را پیاده سازی کند. بیایید با توصیف متغیرها و آرایه هایی که به طور خودکار در زمان تولید ربات پر میشوند، شروع کنیم.
double C1[] = { %%%CVALUES%%% };//array of coefficients int CNum=%%%CNUMVALUE%%%;//number of candlesticks in the formula int DeepBruteX=%%%DEEPVALUE%%%;//formula depth int DatetimeStart=%%%DATETIMESTART%%%;//start point in time input bool bInvert=%%%INVERT%%%;//inverted trading input double DaysToTrade=%%%DAYS%%%;//number of days into the future to trade
در اینجا C1 آرایه ای از ضرایب جلوی درجات است که ما انتخاب کردیم. CNum تعدادی candle های اخیر در نمودار قیمت است که برای محاسبه مقدار چند جملهای استفاده خواهد شد. بعد عمق فرمول میآید، که حداکثر درجه چند جملهای چند بعدی است. من معمولاً از 1 استفاده میکنم، زیرا، برخلاف سری تیلور یک بعدی، یک چند بعدی دارای پیچیدگی محاسبه بسیار بیشتری با افزایش درجه است، زیرا تعداد کل ضرایب با افزایش درجه، به طور قابل توجهی افزایش مییابد. به منظور محدود کردن زمان عملیات EA، به نقطه شروع زمان نیاز است، زیرا چنین محدودیتی از اطلاعات مربوط به محل شروع عملیات استفاده میکند. از تابع وارونگی برای اطمینان از عملکرد چند جمله ای در جهت درست استفاده میشود. اگر همه علائم را در مقابل ضرایب درجه معکوس کنیم، آنگاه خود چند جملهای تغییر نخواهد کرد، در حالی که فقط اعدادی که خروجی چند جمله ای هستند، علامت دیگری دارند. مهمترین قسمت در اینجا نسبت ضرایب است. اگر مقدار منفی چند جمله ای نشان دهنده فروش باشد و مقدار مثبت به معنای خرید باشد، inverse false= است. اگر نه، پس true است. بنابراین، ما به الگوریتم “استفاده از مقادیر چند جملهای با علامت معکوس” را آموزش میدهیم. همچنین، بهتر است که این متغیر را یک مقدار ورودی قرار دهیم، زیرا ممکن است نیاز به معکوس کردن معامله و همچنین تعداد روزهای معامله در آینده داشته باشیم.
اگر لازم است اندازه یک آرایه را با ضرایب محاسبه کنید، این کار را میتوان به صورت زیر انجام داد:
int NumCAll=0;//size of the array of coefficients void DeepN(int Nums,int deepC=1)//intermediate fractal { for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { DeepN(Nums,deepC-1); } else { NumCAll++; } } } void CalcDeepN(int Nums,int deepC=1)//to launch calculations { NumCAll=0; for ( int i=0; i<deepC; i++ ) { DeepN(Nums,i+1); } }
تابع فراکتال میانی تعداد عباراتی را که درجه کلی یکسانی از همه عوامل دارند، میشمارد. این کار برای سادگی انجام میشود، زیرا برای ما ترتیب جمع عبارات چندان مهم نیست. تابع دوم هر بار که انواع عبارات وجود داشته باشد، اولین تابع را به صورت حلقه ای فراخوانی میکند. به عنوان مثال، اگر گسترش سری چند بعدی محدود به مثلاً 4 باشد، ما اولین تابع را با تمام اعداد طبیعی از 1 تا 4 فراخوانی میکنیم.
تابعی که مقدار چند جمله ای را محاسبه میکند تقریباً یکسان است. اما در این حالت آرایه به خودی خود تولید میشود و نیازی به تنظیم اندازه آن نیست. در اینجا آنچه را که به نظر میرسد، وجود دارد:
double ValW;//the number where everything is multiplied (and then added to ValStart) uint NumC;//the current number for the coefficient double ValStart;//the number where to add everything void Deep(double &Ci0[],int Nums,int deepC=1,double Val0=1.0)//calculate the sum of one degree { for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { ValW=(Close[i+1]-Open[i+1])*Val0; Deep(Ci0,Nums,deepC-1,ValW); } else { ValStart+=Ci0[NumC]*(Close[i+1]-Open[i+1])*Val0/Point; NumC++; } } } void CalcDeep(double &Ci0[],int Nums,int deepC=1)//calculate the entire polynomial { NumC=0; ValStart=0.0; for ( int i=0; i<deepC; i++ ) { Deep(Ci0,Nums,i+1); } }
هر آنچه محاسبه میشود به ValStart اضافه میشود، یعنی نتیجه به یک متغیر سراسری اضافه میشود. یک متغیر سراسری دیگر ValW مورد نیاز است. برای ضرب محصول موجود در برخی مقادیر استفاده میشود. در مورد ما، این حرکت bar مربوطه در نقاط است. حرکت میتواند هم به سمت بالا و هم به پایین باشد که توسط علامت نشان داده میشود. بنابراین، این توابع ساختار بسیار جالبی دارند. آنها خود را در داخل فراخوانی میکنند و تعداد و ساختار این فراخوانها همیشه متفاوت است. این نوعی فراخوانی درخت است. من واقعاً دوست دارم از این توابع استفاده کنم زیرا بسیار متغیر هستند. این بار ما مجموعه تیلور چند بعدی را به روشی ساده و ظریف پیاده سازی کردهایم.
همچنین وقتی فقط از نسخه یک بعدی چند جمله ای استفاده میشود، میتوان یک تابع اضافی را برای این مورد پیاده سازی کرد. در این حالت، کل مجموعه بسیار ساده شده است. آن به مجموع ضرایب ضرب شده در حرکت یکی از barها در درجه اول تبدیل میشود. تعداد آنها با تعداد barهای استفاده شده یکسان میشود. این همه محاسبات را ساده میکند. اگر درجه یک باشد، از یک نسخه ساده استفاده میشود. در غیر این صورت از روش فراگیرتری برای هر درجه استفاده میشود.
double Val; double PolinomTrade()//optimized polynomial { Val=0; if ( DeepBruteX <= 1 ) { for ( int i=0; i<ArraySize(C1); i++ ) { Val+=C1[i]*(Close[i+1]-Open[i+1])/Point; } return Val; } else { CalcDeep(C1,CNum,DeepBruteX); return ValStart; } }
وقتی از یک نوع ساده استفاده میشود، نتایج به متغیر Val اضافه میشوند.
حال بیایید روش اصلی را بنویسیم که با نمایش یک bar جدید فراخوانی میشود:
void Trade() { double Value; Value=PolinomTrade(); if ( Value > ValueCloseE) { if ( !bInvert ) { CloseBuyF(); } else { CloseSellF(); } } if ( Value < -ValueCloseE) { if ( !bInvert ) { CloseSellF(); } else { CloseBuyF(); } } if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToTrade && Value > ValueOpenE && Value <= ValueOpenEMax ) { if ( !bInvert ) SellF(); else BuyF(); } if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToTrade && Value < -ValueOpenE && Value >= -ValueOpenEMax ) { if ( !bInvert ) BuyF(); else SellF(); } }
این تابع بسیار ساده است. تمام آنچه شما باید انجام دهید این است که تابع های باز و بسته شدن موقعیت دلخواه ما را پیاده سازی کنید.
ظهور bar را میتوان به شرح زیر تشخیص داد:
void CalcTimer() { if ( Time[1] > PrevTimeAlpha ) { if ( PrevTimeAlpha > 0 ) { Trade(); } PrevTimeAlpha=Time[1]; } }
من فکر می کنم کد بسیار ساده و واضح است.
ضرایب تولید شده توسط کد من با استفاده از چهار مدل توضیح داده شده در بالا ایجاد میشوند. برای راحتی، همه این ضرایب در محدوده [1،1-] قرار دارند، زیرا نسبت مقادیر از خود مقادیر مهم ترند. تابعی که از نمونه اولیه برنامه MQL5 من، این اعداد را تولید میکند به شرح زیر است:
void GenerateC() { double RX; if ( DeepBrute > 1 ) CalcDeepN(CandlesE,DeepBrute); else NumCAll=CandlesE; for ( int j=0; j<VariantsE; j++ ) { ArrayResize(Variants[j].Ci,NumCAll,0); Variants[j].CNum=CandlesE; Variants[j].ANum=NumCAll; Variants[j].DeepBruteX=DeepBrute; RX=MathRand()/32767.0; for ( int i=0; i<Variants[j].ANum; i++ ) { if ( RE == RANDOM_TYPE_1 ) Variants[j].Ci[i]=double(MathRand())/32767.0; if ( RE == RANDOM_TYPE_2 ) { if ( MathRand()/32767.0 >= 0.5 ) { Variants[j].Ci[i]=double(MathRand())/32767.0; } else { Variants[j].Ci[i]=double(-MathRand())/32767.0; } } if ( RE == RANDOM_TYPE_3 ) { if ( MathRand()/32767.0 >= RX ) { if ( MathRand()/32767.0 >= RX+(1.0-RX)/2.0 ) { Variants[j].Ci[i]=double(MathRand())/32767.0; ///Print(Variants[j].Ci[i]); } else { Variants[j].Ci[i]=double(-MathRand())/32767.0; } } else { Variants[j].Ci[i]=0.0; } } if ( RE == RANDOM_TYPE_4 ) { if ( MathRand()/32767.0 >= RX ) { Variants[j].Ci[i]=double(MathRand())/32767.0; } else { Variants[j].Ci[i]=0.0; } } } } }
نمونه اولیه brute force در MQL4 و MQL5 در پیوست مقاله موجود است. من در اینجا پیاده سازی تابع معاملاتی خود را ارائه نمیدهم، زیرا هدف، فقط نشان دادن چگونگی پیاده سازی رویکرد در چارچوب یک الگو است. اگر شما علاقه مند به مشاهده کل اجرا هستید، لطفاً پیوست را بررسی کنید. کلیه Expert Advisor ها و سایر مطالب مورد نیاز در پیوست این مقاله موجود است. به طور کلی الگوی من موارد زیادی دارد، از جمله توابع یا متغیرهای غیرضروری و میتواند به نوعی بهینه شود. من شخصاً با این کار اذیت نمیشوم اگر هر چیزی در عمل اختلال ایجاد کند، من آن را برطرف میکنم. آنچه برای من مهم تر است این است که اکنون همه چیز به خوبی کار میکند. من دائماً در حال توسعه چیزی هستم، بنابراین وقت ندارم همه جزئیات را به کمال برسانم. من همچنین دلیلی در ذخیره کردن تمام رویه ها و متغیرها در کلاسها نمیبینم، در حالی که این میتواند ترتیب کد و خوانایی آن را بهبود بخشد. الگو بسیار ساده است. فایل های دارای نقل قول، که توسط برنامه مورد استفاده قرار میگیرد، توسط یک Expert Advisor ها متخصص ایجاد میشود، که با history اجرا میشود و داده های bar را در یک فایل متنی با ساختار مینویسد که توسط برنامه به راحتی قابل خواندن است. من این کد EA را در اینجا ارائه نمیکنم، زیرا به راحتی قابل توسعه است.
استفاده از برنامه برای یافتن و تحلیل الگو های بازار
من سه حوزه بازار را برای تجزیه و تحلیل انتخاب کردم، آنها هر کدام یک ماه طول میکشند و یکدیگر را دنبال میکنند. EURUSD ، M5.
- بازه اول: 01.13 – 2020. 02.16
- بازه دوم: 02.13 – 2020.03.15
- بازه سوم: 03.13 – 2020.04.18
بازه ها طوری انتخاب شدهاند که آخرین روز همیشه جمعه باشد. و جمعه، همانطور که میدانید، آخرین روز معاملات هفته است. انتخاب بازه ها به این روش باعث میشود که دو روز کامل بتوانید الگوها را جستجو کنید، تا اینکه بورس مجدداً معاملات را آغاز کند. این یک نوع هک زندگی کوچک است. در مورد ما این مهم نیست، زیرا ما EA را در یک تستر آزمایش میکنیم. من تصمیم گرفتم در اینجا 12 نوع از الگوهای پیدا شده را توصیف کنم. شش مورد از آنها چند جمله ای با حداکثر درجه 1 خواهد بود. شش مورد دیگر حداکثر درجه 2 را دارند. من فکر میکنم این کافی است.
در اینجا چگونگی به نظر رسیدن اولین تب برنامه من به شرح زیر است:
این، امکان را برای تغییر نوع تولید عدد فراهم میکند، به عنوان مثال فقط مثبت، مثبت و منفی، مثبت و صفر، مثبت و منفی و صفر. معیار جستجو در ComboBox دوم پیکربندی شده است. دو گزینه ممکن وجود دارد: مقدار مورد انتظار در امتیازات و فرمول عامل سود من. در فرمول من، این مقدار از 1- تا 1+ است. همچنین، نمیتواند فاکتورهایی داشته باشد که ضریب سود به دلیل خطای تقسیم صفر قابل محاسبه نباشد.
P_Factor=(Profit-Loss)/(Profit+Loss).
سپس حداکثر درجه چند جمله ای و تعداد هسته های پردازنده برای محاسبات استفاده میشود. در بلوکهای متنی، تعداد bar های چند جملهای یا تعداد محاسبات و ضریب عدم تقارن معامله من را که بسیار شبیه فرمول قبلی است، مشخص کنید.
D_Asymmetry=|(BuyTrades-SellTrades)|/(BuyTrades+SellTrades).
مقادیر آن در محدوده 0 تا 1 است. این فیلتر زمانی لازم است که به برنامه آموزش دهیم تعداد مشابهی سیگنال خرید و فروش داشته باشد تا از شرایطی که در معاملات جهانی در یک جهت انجام میشوند، جلوگیری کند. بعد تعداد بهترین گزینه ها از همه موارد یافت شده است که باید در حافظه ذخیره شوند و همچنین چند درصد از qout بارگذاری شده برای تکرار brute force استفاده میشود. این بخش از آخرین bar با زمان شروع به کار اندازه گیری میشود و قسمت پشت آن برای بهینهسازی استفاده میشود. بقیه شاخصها و لیست را با انواع توضیح نمیدهم، زیرا آنها به اندازه کافی ساده هستند.
تب دوم به این شکل است:
تب مربوط به اولین گزینه برای بخش اول رباتها است. شما میتوانید نمودار موجود در برنامه من را با نمودار تستر مقایسه کنید. این در زیر ارائه خواهد شد سفارشات در بخشی از quote که brute force انجام شده است با زرد نشان داده میشوند، برخی دیگر با قرمز نشان داده میشوند. من تصاویر مربوط به صفحه را از تمام انواع در اینجا ارائه نمیکنم – همه آنها در پیوست موجود هستند.
بگذارید ببینیم چه چیزهایی در تب وجود دارد. Interval Points – تقسیم بازه مقادیر چند جمله ای ما. هنگامی که بر تب اول brute force را وارد میکنیم، پارامترهای اصلی نوع و همچنین حداکثر مقدار ماژول این چند جملهای را محاسبه میکند. بنابراین، ما پنجره مقادیر چند جمله ای را میدانیم و میتوانیم این پنجره را به قسمت های مساوی تقسیم کنیم، به تدریج مقدار را افزایش دهیم، و تلاش کنیم سیگنال های قویتری را شناسایی کنیم. این کار در تب دوم انجام میشود. این تب همچنین دارای نوع جستجو و تعداد بهترین گزینه هایی است که در حافظه بهینه سازی ذخیره میشود. فیلترهای بعدی به ما امکان میدهند انواع غیرضروری را که در تعریف ما از یک الگو گنجانده نمیشوند، فیلتر کنیم. Line Control یک اجرای اضافی را برای هر نوع امکانپذیر میکند، که در آن انحراف نسبی خط نمودار را از خط مستقیم متصل به ابتدا و انتهای نمودار محاسبه میکند.
Deviation = Max(|Profit[i]-LineProfit[i]|)/EndProfit.
در اینجا [i]Profit مقدار منحنی تعادل در i امین ترتیب است، LineProfit [i] همان مقدار در خط مستقیم است، EndProfit مقداری در انتهای نمودار است.
تمام مقادیر در نقاط اندازه گیری میشوند. Use Percent Control درصدی از قسمت قرمز رنگ نمودار است (من در این حالت از این فیلتر استفاده نکردم). همچنین یک فیلتر برای حداقل تعداد سفارشات وجود دارد.
شکل زیر تب تولید ربات را نشان میدهد:
نحوه عملکرد: نوع دلخواه را در تب بهینه سازی انتخاب کنید، به این برگه بروید و یک Expert Advisor ایجاد کنید.
حال، اجازه دهید ما رباتهای تولید شده را در استراتژی تستر MetaTrader 4 آزمایش کنیم. من آن را انتخاب کرده ام، زیرا اجازه میدهد تا بازه قیمت برابر با 1 تنظیم شود و بنابراین عملاً تأثیر آن را بر روی نمایش نمودار از بین میبرد. در واقع، بازده پیش بینی شده برای اکثر ربات هایی که از این طریق پیدا میشوند، اندکی بیشتر از میانگین بازه قیمت روی یک جفت خواهد بود، بنابراین ما نمیتوانیم با بازده انتظار کمی، الگوها را تجزیه و تحلیل کنیم. هر نوع، brute force شد و در طی دو ساعت بهینه سازی شد، که برای یافتن الگوی با کیفیت بالا کافی نیست. بهتر است یک یا دو روز را سپری کنید. اما این برای این مقاله که هدف آن تجزیه و تحلیل الگو های بازار یافت شده است تا یافتن بهترین آنها، کافی است. اگر میخواهید ربات های من را در دستگاه تستر آزمایش کنید، لطفاً به متغیر DaysToTrade توجه کنید. مقدار آن به طور پیش فرض روی 3 روز تنظیم شده است. بنابراین، تقریباً هیچ معامله ای بعد از بخش brute force انجام نمیشود.
ابتدا رباتهای تولید شده بر اساس چند جمله ای درجه یک را در نظر بگیرید.
بخش اول: 2020.01.13 – 2020. 02.16
ربات 1:
نمودار اول یک گونه جدید را از تصویر تب دوم برنامه من نشان میدهد. نمودار دوم در حال آزمایش همان ربات در آینده به مدت 10 روز است. من فکر میکنم 10 روز برای دیدن نحوه کار کافی است. همانطور که مشاهده میکنید، الگو مدتی ادامه دارد و سپس ناگهان چرخیده و در جهت مخالف میرود. ممکن است به نظر برسد که این الگو برای ایجاد سود برای دو یا سه روز کافی است. اجازه دهید ربات دوم را در همان قسمت منطقه بازار مشاهده کنیم:
در اینجا نتیجه خیلی صاف نیست. چرا؟ انتظار میرفت که این الگو برای یک یا دو روز کار کند، اما از همان ثانیه اول شروع به کاهش میکند، اگرچه چرخش کاملاً نرم است. احتمالاً این نتیجه ای نیست که انتظار داشتید. اما قابل توضیح است. بعداً به آن خواهیم پرداخت.
اکنون، به بازه آزمایش دوم بروید. 2020.02.13 – 2020.03.15
سومین ربات:
این بار وضعیت بهتر به نظر میرسد. نمودار مسطح است و بسیار نزدیک به یک خط مستقیم است. این نشان میدهد که الگو های بازار پایدار است و احتمالاً مدتی ادامه دارد. و ادامه پیدا کرد. حرکت در آینده نیز شبیه خط است، به این معنی که بسیاری از پارامترهای الگو در آینده به کار خود ادامه میدهند.
در اینجا چهارمین ربات وجود دارد:
این یک حرکت رو به بالای کاملاً خوب است و به جز افزایش شدید در ابتدای نمودار، همه چیز روان و پایدار به نظر میرسد. اما این افزایش را نباید نادیده گرفت: این عدم تقارن نشان میدهد که این فقط یک تصادف یا یک نتیجه تصادفی است. به طور طبیعی، در آینده شاهد تغییر کل الگو های بازار در جهت مخالف هستیم.
حالا به سومین بازه تست بروید. 2020.03.13 – 2020.04.18
ربات پنجم:
اوضاع به همین منوال است. این عدم تقارن قابل مشاهده، امواج در آغاز و میرایی در انتها را نشان میدهد. این یکی از الگو های بازار قابل اعتماد به نظر نمیرسد. من ادامه الگوی تجارت را ندارم. باز هم، در آینده شاهد تغییر فوری نمودار و وارونگی کل فرمول هستیم. من ربات ششم را در اینجا نشان نمیدهم – نمودار آن در بایگانی موجود است. شباهت زیادی به نمودارهای فوق دارد.
حال، اجازه دهید ما رباتها را بر اساس چند جمله ای درجه دو آزمایش کنیم.
بخش اول. 2020.01.13 – 2020. 02.16
هفتمین ربات به شرح زیر است:
hg’, ihd
ویژگی خاص این رباتها عملکرد بهتر آنها در فاصله Brute Force است. نتایج در فاصله قبل از Brute Force چندان خوب نیستند. فاصله Brute Force همیشه یک نیمه موج مثبت را نشان میدهد. اما فاصله باقیمانده بهم ریخته است. این نتایج یک فرمول خاص است، رفتار مشابه است. در ابتدا کمی تصادفی و به دنبال آن حرکتی در جهت مخالف وجود دارد.
نوع هشت:
خیلی بدتر است. هیچ یک از الگو های بازاری جهانی وجود ندارد، اما همچنان یک حرکت رو به بالا در فاصله Brute Force را نشان میدهد. این یکی از الگو های بازار نیست، بنابراین نمودار پایین مییابد.
اکنون بازه آزمایش دوم را بررسی کنید. 2020.02.13 – 2020.03.15
نهمین ربات:
من شروع یک موج را در نمودار اول و پایان آن را در آینده میبینم. هیچ یک از الگو های بازار جهانی وجود ندارد، اما وارونه سازی آن به آرامی انجام میشود که سعی کنید از آن سود ببرید.
دهمین ربات به شرح زیر است:
نمودار این بار بهتر است. این بار شبیه یکی از الگو های بازار است. این الگو که به عنوان یکی ازالگو های بازار شناخته می شود حداکثر برای یک یا دو روز ادامه دارد. با این حال، من خطر معامله چنین نمودار را ندارم. انحراف قابل توجهی از خط مستقیم دارد.
حالا به سومین بازه تست بروید. 2020.03.13 – 2020.04.18
یازدهمین ربات:
نمودار خیلی زیبا نیست، اما شباهت زیادی به خط مستقیم دارد. این الگو در آینده نیز ادامه دارد، اما من فکر میکنم این شانس است تا نتایج منظم، زیرا نویز تصادفی زیادی دارد. یا این میتواند کاملاً نویز نباشد بلکه امواج کوچکی است.
دوازدهمین ربات:
یک نمودار کاملاً زشت، اما این یک انتهای مشخص از یک موج است که یک موج بزرگ دیگر در دنبال آن است. در آینده، این موج عظیم به آرامی معکوس میشود و سرانجام در برهه ای معکوس میشود. به نظر میرسید که تغییر روند روبات هایی با چند جمله ای بالاتر از درجه 2 به آهستگی رخ داده است، بنابراین شگفتی کمتری را نشان میدهند. من فکر میکنم منطقی است که مقداری وقت بگذارم و درجه 3 را امتحان کنم. با چند جمله ای که دارای بالاترین توان کلی بالاتری از عوامل در عبارات است، بهتر میتوان قاعده ها را توصیف کرد.
این مقاله ترجمه شده توسط تیم آکادمی ایران ام کیو ال می باشد.
پاسخها