مدل‌سازی ریکوت‌ها در تستر و تحلیل ثبات اکسپرت

مدل‌سازی ریکوت‌ها در تستر و تحلیل

مدل‌سازی ریکوت‌ها در تستر و تحلیل ثبات اکسپرت

استراتژی‌تسترِ نرم‌افزار متاتریدر ۴، ابزاری فوق‌العاده برای ارزیابی کیفیت، یا بازبینی و تایید یک استراتژی محقق‌شده در اکسپرت، به‌حساب می‌آید. اما اکنون، به‌نظر من دو ویژگی کاملاً حیاتی دارد [که به آنها نیاز داریم]. اول، از تیک واقعی تاریخچه برای یک اَرز استفاده نمی‌کند و تیک‌ها را بر اساس کندل‌های یک دقیقه‌ای، مدل‌سازی می‌کند. دوم، پدیده‌ی ریکوت که اغلب، بروکر‌ها دارند را لحاظ نمی‌کند – به‌خصوص روی تریدهایی با حجم پایین یا بسیار بالا، و نیز در شرایطی که بازار اصطلاحاً “لاغر” است و نقدینگی کمی دارد. در شرایطی که ریکوت محتمل است، هیچ فرصتی برای بررسی کلی اکسپرت منجر به رسیدن به “هدف نهایی”، ترید روی “میله‌ها”، پرش‌ها و [اعلام] قیمت‌های غیربازاری، نخواهد شد. بارها توضیح داده و اثبات شده‌است که این مدل استراتژی‌ روی حساب‌های واقعی کارآمد نخواهد بود، اما متاسفانه، اغلب اوقات فهمیدن اینکه آیا اکسپرت شما بر اساس “میله‌ها” کار می‌کند یا نه، بسیار سخت است. تاریخچه‌ی نمودار همراه با ترید‌های روی آن را اگر نگاه کنید می‌بینید که بعضی مواقع تستر، معاملاتی را روی پرش‌های نمودار باز می‌‌کند، اما همیشه هم اینطور نیست. همچنین پیش‌بینی اینکه استراتژی ریکوت در این هنگام، کم‌کم از بین می‌رود، یا اینکه فقط سوددهی کم می‌شود، کار سختی است. در این مقاله قصد دارم روش خودم را برای حل این مشکل ارائه کنم.

فرضیات و تعریف‌‌ها

ریکوت، پاسخ برورکر به معامله‌ایست که شما به سرور ترید ارسال می‌کنید. این پاسخ بروکر ما را آگاه می‌کند که قیمت (قیمتی که در آن می‌خواستید معامله باز کنید)، به‌نوعی، دیگر وجود ندارد. این اتفاق اغلب به‌خاطر نقدینگی کم و نوسانات بالا در بازار اتفاق می‌اُفتد و قیمت پس از درخواست، تغییر زیاد و ناگهانی دارد. همچنین ریکوت‌ هنگام خوانش‌های غیربازاری و یا پَرش حساب، بسیار رایج است.

بیایید فرض کنیم اکسپرت فقط معاملاتی را مانند  OP_SELLو OP_BUY باز و بسته می‌کند. ماهیت تغییر نمی‌کند بلکه برخی از توابع ساده‌تر می‌شوند.

مدل‌سازی ریکوت‌ها در استراتژی‌تستر

بیاییم هدف خود را شبیه‌سازی ریکوت‌‌ها با احتمال از پیش ‌تعیین‌شده در بازشدن و بسته‌شدن معاملات قرار دهیم. ابتدا بیایید یک متغیر اکسترنال خاص را وارد کنیم که احتمال وقوع ریکوت ساختگی ما را تعیین می‌کند. بنابر تحقیقات و رصدهای من، احتمال ریکوت روی جفت‌اَرزهایی که نقدینگی کمی دارند، نزدیک به ۹۰ درصد است – بنابراین این مقدار را در تحلیل اکسپرت به‌کار ‌می‌گیریم.

extern int RQF_TEST = 90;

از آنجایی که ما از تابع MathRand برای بازگشت یک مقدار دلخواه استفاده می‌کنیم، بهتر است که دنباله‌ی اعداد شبه‌تصادفی را مقداردهی اولیه کنیم. برای این منظور تابع MathSrand در آغاز کارِ اکسپرت، اجرا خواهد شد. برای جزئیات بیشتر در رابطه با تولید مقادیر تصادفی، و همینطور هدف این تابع، می‌توانید به کتاب مرجع زبان MQL مراجعه کنید. ناگفته نماند که اگر از تابع MathSrand استفاده نکنیم، علی‌رغم تعداد “تصادفی‌بودن‌ها”، با هر بار تست استراتژی، نتایج یکسانی بدست خواهیم آورد. و به‌طور کلی، به‌درد ما نمی‌خورد:

int start()
  {
    //----
    MathSrand(TimeCurrent());

بعد از این باید توابع خودمان یعنیOrderSend  و OrderClose را بنویسیم. اسم آنها را می‌گذاریم MyOrderSend و MyOrderClose:

int MyOrderSend(int req_prob, string symbol, int cmd, double volume, double price, 
                int slippage, double stoploss, double takeprofit, 

                string comment="", int magic=0, datetime expiration=0, 
                color arrow_color=CLR_NONE)
  {
    if(IsTesting() && (MathRand() % 100) < req_prob && (cmd == OP_SELL || cmd == OP_BUY))
        return (-1); //modelling requote
    return(OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, 
           comment, magic, expiration, arrow_color));
  }
 
bool MyOrderClose(int req_prob, int ticket, double lots, double price, int slippage,
                  color Color=CLR_NONE)
  {
    if(IsTesting() && (MathRand() % 100) < req_prob)
        return (false); //modelling requote
    return (OrderClose(ticket, lots, price, slippage, Color));
  }

اکنون باید تمام توابعOrderSend  و OrderClose را در اکسپرت با MyOrderSend و MyOrderClose و با مشخص کردن متغیر اکسترنال از پیش‌ وارد‌شده‌ی RQF_TEST، به‌عنوان اولین استدلال، جایگزین کنیم. مثالی از اکسپرت خود من را ملاحظه می‌کنید:

: OrderClose -> MyOrderClose

if(MyOrderClose(RQF_TEST, ticket, amount, Bid, 0, Blue)) 
// PREV: if(OrderClose(ticket, amount, Bid, 0, Blue))
  {
    Print("Skalpel: Order #" + ticket + " closed! (BUY, " + Bid + ")");
            //... Something
  }
else
  {
    // Requote or something like this
    Print("Skalpel: Error while closing order #" + ticket + " (BUY)!");
    // ... Something
  }

: OrderSend -> MyOrderSend

ticket = MyOrderSend(RQF_TEST, Symbol(), OP_BUY, amount, Ask, 0, 
                     Bid-StopLoss*Point, Bid+TakeProfit*Point, 
                     NULL, EXPERT_MAGIC, 0, Blue);
// PREV: OrderSend(Symbol(), OP_BUY, amount, Ask, 0, Bid - StopLoss*Point, 
// Bid+TakeProfit*Point, NULL, EXPERT_MAGIC, 0, Blue);
 
if(ticket > 0)
    Print("Skalpel: Order #" + ticket + " opened! (BUY)");
else
    Print("Skalpel: Error while placing order."); 
    // ... Requote or something like this

 نتیجه‌گیری و تحلیل نتایج

اول از همه مقدار متغیر  RQF_TESTرا باید توضیح داد. این متغیر کمیت ریکوت‌ها را برای ۱۰۰ ترید تعیین می‌کند و بر این اساس، می‌تواند مقداری از صفر (ریکوتی اصلاً وجود ندارد) تا ۱۰۰ (بازکردن یا بستن معامله کاملاً غیرممکن است) داشته باشد. برای مثال، اگر RQF_TEST برابر با ۹۰ باشد، این بدان معناست که تقریباً ۹۰ تلاش از ۱۰۰ تلاش، برای بازکردن یا بستن معامله با موفقیت انجام نخواهد شد؛ و به همین شکل ریکوت‌ها شبیه‌سازی خواهند شد.

درواقع، نتایجی که در مقادیر مختلف RQF_TEST بدست آمده، ثبات استراتژی شما به ریکوت‌ها و اختلاف بین روند تیک [دریافتی از] تستر و بروکر را، نشان می‌دهد.

اگر نتایج هنگام افزایش RQF_TEST بدتر شوند، ضروری است که سودآوری آن استراتژی بررسی شود، چراکه حساسیت به ریکوت یعنی شما دارید روی لبه‌ی تیز و موقت پرش‌های پیپ (pip) قدم برمی‌دارید. در مورد عواقب استفاده از چنین مشاوره‌هایی، بارها مطالبی گفته شده‌ است.

برای مثال بیایید نموداری متعادل از نحوه‌ی کار یک اکسپرت کلاسیک را روی پَرش‌های نمودار (بازار پُرنوسان) همراه با مقادیر مختلف RQF_TEST، درنظر بگیریم. این اکسپرت از مقاله‌ی “My first Grail” گرفته شده‌است. و برای مشاهده در اینجا، اندکی آن را تغییر داده‌ایم. تمام معاملاتِ نوعِ limit با معاملات معمولی بازار تحقق یافته‌اند. و همچنین پارامترها نیز انتخاب شده‌اند تا نمودار ضعیف شدن پارامترها را در بدترین و آشکارترین ریکوت‌ها، نشان دهد.

بدون ریکوت (RQF_TEST = 0):

مدل‌سازی ریکوت‌ها در تستر و تحلیل
مدل‌سازی ریکوت‌ها در تستر و تحلیل ثبات اکسپرت

۹۰ درخواست از ۱۰۰تا، ریکوت خواهد شد (RQF_TEST = 90):

مدل‌سازی ریکوت‌ها در تستر و تحلیل
مدل‌سازی ریکوت‌ها در تستر و تحلیل ثبات اکسپرت

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

نکات و افزودنیها

در واقع، اکنون می‌دانیم که پیدا کردن اکسپرتی که از سودده به غیرسودده به‌خاطر ریکوت‌ها تبدیل شود، کار سختی است. من به دنبال چنین اکسپرتی بوده‌ام، که کم‌شدن کیفیت آن را بتوان به‌وضوح روی بالانس نمودار، برای مدت زمانی طولانی، نشان داد. معمولاً ریکوت (حتی با احتمال ۵۰ درصد) کمیت معاملات و سود شما را، آن‌هم وقتی که نمودار ثابت است، به‌شدت تحت‌ تاثیر قرار می‌دهد. توضیح ساده‌ای برای این موضوع وجود دارد: اگر بروکر به شما اجازه ندهد که در ۹۰ درصد از ۱۰۰ درصد مواقع، معامله‌ای روی “سهام” باز کنید، در باقی‌مانده‌ی ۱۰ درصد مواقع، تنها می‌توانید چند پیپ سود کرده، آن‌هم تا زمانی که ممنوعیتی در استفاده از اکسپرت‌ها نداشته باشید. چنین شرایطی در مقاله‌ی”My first Grail”  توضیح داده شده‌است. اما اگر فرض کنیم که بروکر ریکوت ندهد (که بسیار بعید است)، آنگاه سود ده برابر کاهش‌یافته (که دقیقاً همینطور است و اکسپرت ۹۰ “سهم” از ۱۰۰ سهم را به‌راحتی از دست می‌دهد) تمام ویژگی‌های مثبت “هدف نهایی ما” را از بین می‌برد – و حتی کار ما از سود بانکی هم کمتر به ما سود خواهد داد.

این مقاله دارای فایل پیوست است.

فایل پیوست این مقاله را میتوانید از اینجا دانلود کنید .

 

مقالات پیشنهادی :

M23admin

→ خواندن مطلب قبلی

چگونه در MQL4 یک ربات ترید سالم و قابل اطمینان را توسعه دهیم

خواندن مطلب بعدی ←

استراتژی‌های ترید

۳۳ مورد نظر

نوشتن نظر شما

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