جستجوی الگوهای بازار | METATRADER 5 – تستر ( پارت اول )

metatreader5

رویکرد 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

سومین ربات:

 

نمودار الگو های بازار

 

الگو های بازار

این بار وضعیت بهتر به نظر می­رسد. نمودار مسطح است و بسیار نزدیک به یک خط مستقیم است. این نشان می­دهد که الگو های بازار پایدار است و احتمالاً مدتی ادامه دارد. و ادامه پیدا کرد. حرکت در آینده نیز شبیه خط است، به این معنی که بسیاری از پارامترهای الگو در آینده به کار خود ادامه میدهند.

در این­جا چهارمین ربات وجود دارد:

تستر

metareader5

این یک حرکت رو به بالای کاملاً خوب است و به جز افزایش شدید در ابتدای نمودار، همه چیز روان و پایدار به نظر می­رسد. اما این افزایش را نباید نادیده گرفت: این عدم تقارن نشان می­دهد که این فقط یک تصادف یا یک نتیجه تصادفی است. به طور طبیعی، در آینده شاهد تغییر کل الگو های بازار در جهت مخالف هستیم.

حالا به سومین بازه تست بروید. 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 را امتحان کنم. با چند جمله ­ای که دارای بالاترین توان کلی بالاتری از عوامل در عبارات است، بهتر می­توان قاعده ­ها را توصیف کرد.

ادامه در پارت دوم….

این مقاله ترجمه شده توسط تیم آکادمی ایران ام کیو ال می باشد. 

صفحه اصلی مقاله

سایر مقالات مرتبط

متا تریدر چیست؟
متاتریدر

متا تریدر چیست؟

متا تریدر چیست؟ اولین سوالی که هر فرد وقتی می خواهد آموزش های متاتریدر مانند آموزش صفر تا صد mql5،

کامل ترین و بهترین آموزش متاتریدر 4
mql4

کامل ترین آموزش متاتریدر 4

بهترین آموزش متاتریدر 4 متاتریدر4 یک پلتفرم معاملاتی محسوب می‌ شود که دارای رابط کاربری ساده است و همین یادگیری

پاسخ‌ها

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *