موضوعات وبسایت : سیگنال

دانلود قالب متاتریدر

دانلود قالب متاتریدر

نویسنده : نوید | زمان انتشار : 23 دی 1399 ساعت 20:53

بسیاری از تریدرها با این مشکل مواجه هستند که مجبورند اکسپرت خودشان را بنویسند.  چه اتفاقی می‌اُفتد؟ حد سود را در کد اکسپرت چگونه تعیین کنیم؟ حد ضرر و تریلینگ اِستاپ را چطور؟ چگونه مفید بودنِ یک استراتژی را بررسی کنیم؟ در این مقاله به بررسی توابع اصلی جهت ساخت یک اکسپرت می‌پردازیم. شاید مثلاً کد تریلینگ به‌درد کسی بخورد…

متغیرهای اکسپرت

چه متغیرهایی در هر اکسپرت نیاز هستند؟ چه باید بکنیم که تستر پارامترها را نیز بررسی کند؟ – پارامترهایی که توسط متغیرهای منطقی (bool) تعیین شده‌اند. اول، می‌خواهم یک کد اکسپرتکلی را معرفی کنم که با تمام اَرزها کار می‌کند، برای سرعت‌های بالاتر، پیشنهاد می‌شود متغیرها را متناسب با نوع اَرز خود تنظیم کنید. دوم، ۰ برای غیرفعال، و ۱ برای فعال (زیرا می‌خواهیم تمام پارامترها را در یک بهینه‌ساز بررسی کنیم. اگر کد نهایی خیلی کم بهینه‌سازی شد، پیشنهاد می‌کنیم که این پارامتر را تغییر دهید). سوم اینکه، متغیرهای خطوط (اِستاپ‌)، توسط اعداد صحیح، مقداردهی اولیه می‌شوند، و در کد، جاییکه نیاز باشد، به اعداد کسری تغییر می‌کنند. در حالت واقعی روی اَرزهای مختلف ترید می‌کنیم و در اینجا هم یک قالب داریم [که این کار را انجام می‌دهد]! چهارم، اگر پارامترهای اِستاپ برابر با صفر باشند، اِستاپ‌ها کار نخواهند کرد!

تعریف متغیرها

اکنون بیایید تعریف متغیرها را شروع کنیم. با آن‌هایی شروع می‌کنیم که متمایل به بهینه‌سازی و قابل اطمینان هستند – یعنی متغیرهای اکسترنال.

externdoubleMaxLot;

externdoubleTakeProfit;

externdoubleTrailingStop;

externdoubleStopLoss;

externdoubleMinProfit;

externdoubleProfitPoints;

externint    Slippage=۰;

externintCondition1=۱;

externdoubleLotSpliter=۱.۰;

externintCloseByOtherSideCondition;

وقتی می‌خواهیم محدودیتی برای حداکثر لاتیج مورد استفاده بگذاریم، متغیر MaxLot حداکثر مقدار لات را تعیین خواهد کرد (آنگاه سِرور لاتیج را محدوود می‌کند، اما در این‌باره بعداً صحبت می‌کنیم). وقتی حد سود، حد ضرر و تریلینگ اِستاپ [مقداری] بیشتر از صفر داشته باشند، در کد ما فعال خواهند بود و عمل خواهند کرد.

وقتی ProfitPoints مقداری بیش از صفر داشته باشد، MinProfit و ProfitPoints هم عمل خواهند کرد؛ و همه‌ی این‌ها طبق این اصل است: قیمت به ProfitPoints می‌رسد و تا MinProfit برمی‌گردد.

ConditionX شرایط ورود را فعال می‌کند.

LotSpliter تقسیم‌کننده‌ی لات‌ها است، و فقط از بخشی از لات‌های موجود، استفاده می‌کند، برای مثال ۰.۱، که فقط آنقدری را شامل می‌شود که ۱۰ مرتبه کوچک‌تر است از مقدار دردسترس برای کل سرمایه.

CloseByOtherSideCondition، هنگامیکه شرایط، خلاف جهت مورد نظر پیش برود، معامله را می‌بندد.

‌حال برویم سراغ متغیرهای داخلی، که البته آن‌ها را همراه با توضیح اکسپرت، ارائه‌ می‌کنیم.

doubleLot;

doublePP=۰;

doubleslu,sld,a,b;

doubletp,sl;

کد مقداردهی اولیه

اکنون بیایید ببینیم، چه چیز را می‌توان فقط با شروع یک اکسپرت محاسبه، و بعداً درون یک کد از آن استفاده کرد.

intinit()

  {

   tp=TakeProfit;

   sl=StopLoss;

   return(۰);

  }

از مقادیر این متغیرها برای تغییرات خطوط اِستاپ (stop levels) استفاده می‌کنیم. اگر بخواهیم همیشه با لاتیج یکسان کار کنیم، می‌توانیم [مقدار] یک لات را هم محاسبه کنیم، و مقدار مازاد را نشان دهیم (بعداً در مقاله، محاسبه‌ی لاتیج را آنالیز می‌کنیم). همچنین می‌توانیم یک کامنت قابل نمایش ایجاد کنیم که حاوی توضیح اکسپرت یا کپی‌رایت باشد. این کار را اینگونه انجام می‌دهیم:

Comment("cloud trade \n v2.0.11");

“\n” – یعنی رفتن به خط نمایش بعدی، “carriage return”.

کد فریم‌ورک

وقتی هیچ‌ معامله‌ای نداریم، کد، بدین شکل خواهد بود:

if(OrdersTotal()==۰)

   {  

      preinit();

      if(U()==۱)

      {

         OrderBuy();

         return(۰);

      }

      if(U()==۲)

      {

         OrderSell();

         return(۰);

      }

      return(۰);

   }

بخشی از این توابع، بعداً تحلیل خواهند شد. قاعده‌ی کلی در اینجا این است: پارامترها را مقداردهی اولیه کنید، ببینید آیا شرایط ورود وجود دارد، با یک شرط وارد شوید.

اکنون، بیایید کد را در حالتی ببینیم که یک معامله داریم:

۱

۲

۳

۴

۵

۶

۷

۸

۹

۱۰

۱۱

۱۲

۱۳

۱۴

۱۵

۱۶

۱۷

۱۸

۱۹

۲۰

۲۱

۲۲

۲۳

۲۴

۲۵

۲۶

۲۷

۲۸

۲۹

۳۰

۳۱

۳۲

۳۳

۳۴

۳۵

۳۶

۳۷

۳۸

۳۹

۴۰

۴۱

۴۲

۴۳

۴۴

۴۵

۴۶

۴۷

۴۸

۴۹

۵۰

۵۱

۵۲

۵۳

۵۴

۵۵

۵۶

۵۷

if(OrderType()==OP_BUY)

        {

         if((slu)>PP)

           {

            PP=slu;

           }

         if(((slu)>۰.۰۰۱)&&(OrderStopLoss()<(b-TrailingStop))

          &&(OrderOpenPrice()<(b-TrailingStop))

           &&(OrderProfit()>MathAbs(OrderSwap())))

           {

            if(TrailingStop!=۰)

              {

               OrderModify(OrderTicket(),۰,b-TrailingStop,۰,۰,۰);

              }

           }

        }

      if(OrderType()==OP_SELL)

        {

         if((sld)>PP)

           {

            PP=sld;

           }

         if(((sld)>۰.۰۰۱)&&(OrderStopLoss()>(a+TrailingStop))

          &&(OrderOpenPrice()>(a+TrailingStop)))

           {

            if(TrailingStop!=۰)

              {

               OrderModify(OrderTicket(),۰,a+TrailingStop,۰,۰,۰);

              }

           }

        }

      if(ProfitPoints!=۰)

        {

         if(OrderType()==OP_BUY&&PP>=ProfitPoints&&(slu)<=MinProfit)

           {

            CloseOnlyOrder(OrderTicket());

            return(۰);

           }

         if(OrderType()==OP_SELL&&PP>=ProfitPoints&&(sld)<=MinProfit)

           {

            CloseOnlyOrder(OrderTicket());

            return(۰);

           }

        }

      if(CloseByOtherSideCondition==۱)

        {

         if(OrderType()==OP_BUY&&U()==۲)

           {

            CloseOnlyOrder(OrderTicket());

            return(۰);

           }

         if(OrderType()==OP_SELL&&U()==۱)

           {

            CloseOnlyOrder(OrderTicket());

            return(۰);

           }

        }

در ابتدا فقط، تنها معامله‌ی موجود را برای انجام کارهای بیشتر روی آن، انتخاب می‌کنیم (این کد در یکی از بخش‌های مقاله، جداگانه آنالیز خواهد شد). آنگاه متغیرها را به قیمت‌ها اختصاص می‌دهیم، تا معامله، برای مثال، در یک تریلینگ اِستاپ در جهت اشتباه، یا در قیمت‌های جدید که سودده نیستند، تغییر نکند. ابتدا باید معامله را از نظر احتمال تریلینگ اِستاپ بررسی کنیم، و در همین زمان برای تابع بعدی، یعنی minimal profit که کاربرد آن را قبل‌تر توضیح دادیم، داده جمع‌آوری کنیم. سپس تابعِ بستن یک معامله هنگامی که شرایط برعکس انتظار است، و بازشدن یک معامله‌ی جدید مطابق با روند جدید (بازشدن معامله‌ی جدید در جهت عکسِ معامله‌ی قبلی) را داریم.

وابعی که در مقاله تحلیل شدند

اکنون بیایید توابعی را با هم ببینیم که برای کوتاه کردن کد، درنظر گرفته شده‌اند؛ همچنین این توابع فرمان‌هایی (Commands) که بیشترین استفاده‌ها از آن‌ها می‌شود را درون بلوک‌ها جای می‌دهند، بطوریکه بعداً می‌توان آن‌ها را بلوک‌های کامل نامید. بیایید چنین شرایطی را تعریف کرده و آن‌ها را بررسی کنیم:

۱

۲

۳

۴

۵

۶

۷

۸

۹

۱۰

۱۱

۱۲

۱۳

۱۴

۱۵

۱۶

۱۷

۱۸

۱۹

۲۰

۲۱

۲۲

۲۳

۲۴

۲۵

۲۶

۲۷

۲۸

۲۹

۳۰

۳۱

۳۲

۳۳

۳۴

۳۵

۳۶

۳۷

۳۸

۳۹

۴۰

۴۱

۴۲

۴۳

۴۴

۴۵

۴۶

۴۷

۴۸

۴۹

۵۰

۵۱

۵۲

۵۳

۵۴

۵۵

۵۶

۵۷

۵۸

۵۹

۶۰

۶۱

۶۲

۶۳

۶۴

۶۵

۶۶

۶۷

۶۸

//+------------------------------------------------------------------+

//|  returns a signal to buy or to sell                              |

//+------------------------------------------------------------------+

intU()

  {

      if((U1()==۲&&Condition1==۱)

       ||(U2()==۲&&Condition2==۱)){return(۲);}

      if((U1()==۱&&Condition1==۱)

       ||(U2()==۱&&Condition2==۱)){return(۱);}

   return(۰);

  }

//+------------------------------------------------------------------+

//|  returns a signal based on stochastic values                     |

//+------------------------------------------------------------------+

intU1()

  {

   if(iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_SIGNAL,۱)>=۸۰)

     {

      if(iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_SIGNAL,۲)

           <=iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_MAIN,۲))

        {

         if(iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_SIGNAL,۱)

           >=iStochastic(Symbol(),Period(),

              Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_MAIN,۱))

           {

            return(۲);

           }

        }

     }

   if(iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_SIGNAL,۱)<=۲۰)

     {

      if(iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_SIGNAL,۲)

           >=iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_MAIN,۲))

        {

         if(iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_SIGNAL,۱)

              <=iStochastic(Symbol(),Period(),Kperiod,Dperiod,Slowing,Method,PriceUsing,MODE_MAIN,۱))

           {

            return(۱);

           }

        }

     }

   return(۰);

  }

//+------------------------------------------------------------------+

//| find trend direction using fractals                              |

//+------------------------------------------------------------------+

intU2()

  {

   doublefu=۰,fd=۰;

   intf=۰,shift=۲;

   while(f<۲)

     {

      if(iFractals(Symbol(),Period(),MODE_UPPER,shift)>۰)

        {

         fu=fu+۱;

         f=f+۱;

        }

      if(iFractals(Symbol(),Period(),MODE_LOWER,shift)>۰)

        {

         fd=fd+۱;

         f=f+۱;

        }

      shift=shift+۱;

     }

   if(fu==۲){return(۲);}

   if(fd==۲){return(۱);}

   return(۰);

  }

اولین تابع، شرایط را بررسی می‌کند، و دو تابع بعدی شرایط را تعیین می‌کنند.

اکنون بیایید تابعی را با هم ببینیم، که stop level‌ها را، اگر اشتباه تعیین شده‌ باشند، محاسبه، و مقدار یک لات را نیز تعیین می‌کند:

۱

۲

۳

۴

۵

۶

۷

۸

۹

۱۰

۱۱

۱۲

۱۳

۱۴

۱۵

۱۶

۱۷

۱۸

۱۹

۲۰

۲۱

۲۲

//+------------------------------------------------------------------+

//| preliminary initialization of variables                          |

//+------------------------------------------------------------------+

intpreinit()

  {

   Lot=NormalizeDouble(MathFloor(LotSpliter*AccountBalance()*AccountLeverage()

      /Ask/MathPow(۱۰,Digits+۱)*۱۰)/۱۰,۱);

   if(MaxLot>۰&&Lot>MaxLot){Lot=MaxLot;}

   if(Lot>MarketInfo(Symbol(),MODE_MAXLOT)){Lot=MarketInfo(Symbol(),MODE_MAXLOT);}

   PP=۰;

   StopLoss=sl;

   TakeProfit=tp;

   if(TakeProfit!=۰&&TakeProfit<(MarketInfo(Symbol(),MODE_STOPLEVEL)))

     {

      TakeProfit=MarketInfo(Symbol(),MODE_STOPLEVEL);

     }

   if(StopLoss!=۰&&StopLoss<(MarketInfo(Symbol(),MODE_STOPLEVEL)))

     {

      StopLoss=MarketInfo(Symbol(),MODE_STOPLEVEL);

     }

   return(۰);

  }

اکنون توابع را تعیین می‌کنیم، تا معاملات بر اساس stop levelهای از پیش تعیین‌شده، باز شوند:

۱

۲

۳

۴

۵

۶

۷

۸

۹

۱۰

۱۱

۱۲

۱۳

۱۴

۱۵

۱۶

۱۷

۱۸

۱۹

۲۰

۲۱

۲۲

۲۳

۲۴

۲۵

۲۶

۲۷

۲۸

۲۹

۳۰

۳۱

۳۲

۳۳

۳۴

۳۵

۳۶

۳۷

۳۸

۳۹

۴۰

۴۱

۴۲

۴۳

۴۴

۴۵

۴۶

۴۷

۴۸

۴۹

۵۰

۵۱

۵۲

۵۳

۵۴

۵۵

۵۶

۵۷

۵۸

۵۹

۶۰

۶۱

۶۲

۶۳

۶۴

۶۵

۶۶

۶۷

۶۸

۶۹

//+------------------------------------------------------------------+

//| returns true in case of a successful opening of Buy              |

//+------------------------------------------------------------------+

boolOrderBuy()

  {

   boolres=false;

   if(StopLoss!=۰&&TakeProfit!=۰)

     {

      res=OrderSend(Symbol(),۰,NormalizeDouble(Lot,۱),Ask,Slippage,

       NormalizeDouble(Ask-StopLoss,۴),

        NormalizeDouble(Ask+TakeProfit,۴),۰,۰,۰,۰);

      return(res);

     }

   if(StopLoss==۰&&TakeProfit!=۰)

     {

      res=OrderSend(Symbol(),۰,NormalizeDouble(Lot,۱),Ask,Slippage,۰,

       NormalizeDouble(Ask+TakeProfit,۴),۰,۰,۰,۰);

      return(res);

     }

   if(StopLoss==۰&&TakeProfit==۰)

     {

      res=OrderSend(Symbol(),۰,NormalizeDouble(Lot,۱),Ask,

       Slippage,۰,۰,۰,۰,۰,۰);

      return(res);

     }

   if(StopLoss!=۰&&TakeProfit==۰)

     {

      res=OrderSend(Symbol(),۰,NormalizeDouble(Lot,۱),Ask,Slippage,

       NormalizeDouble(Ask-StopLoss,۴),۰,۰,۰,۰,۰);

      return(res);

     }

   return(res);

  }

//+------------------------------------------------------------------+

//|   returns true in case of a successful opening of Sell           |

//+------------------------------------------------------------------+

boolOrderSell()

  {

   boolres=false;

   if(StopLoss!=۰&&TakeProfit!=۰)

     {

      res=OrderSend(Symbol(),OP_SELL,NormalizeDouble(Lot,۱),Bid,Slippage,

       NormalizeDouble(Bid+StopLoss,۴),

        NormalizeDouble(Bid-TakeProfit,۴),۰,۰,۰,۰);

      return(res);

     }

   if(StopLoss==۰&&TakeProfit!=۰)

     {

      res=OrderSend(Symbol(),OP_SELL,NormalizeDouble(Lot,۱),Bid,Slippage,

       NormalizeDouble(Bid+StopLoss,۴),

        NormalizeDouble(Bid-TakeProfit,۴),۰,۰,۰,۰);

      return(res);

     }

   if(StopLoss==۰&&TakeProfit==۰)

     {

      res=OrderSend(Symbol(),OP_SELL,NormalizeDouble(Lot,۱),Bid,Slippage,

       NormalizeDouble(Bid+StopLoss,۴),

        NormalizeDouble(Bid-TakeProfit,۴),۰,۰,۰,۰);

      return(res);

     }

   if(StopLoss!=۰&&TakeProfit==۰)

     {

      res=OrderSend(Symbol(),OP_SELL,NormalizeDouble(Lot,۱),Bid,Slippage,

       NormalizeDouble(Bid+StopLoss,۴),

        NormalizeDouble(Bid-TakeProfit,۴),۰,۰,۰,۰);

      return(res);

     }

   return(res);

  }

تابع بعدی یک معامله را با یک تیکت مشخص‌شده، حجم و قیمت مشخص‌شده، می‌بندد:

//+-------------------------------------------------------------------------+

//|  returns true in case of a successful closing of an order with Ticket   |

//+-------------------------------------------------------------------------+

boolCloseOnlyOrder(intTicket,doubleLots,doublepriceClose)

  {

   boolres=false;

   res=OrderClose(Ticket,Lots,priceClose,Slippage,۰);

   return(res);

اکنون بیایید تابع انتخاب یک معامله با شماره‌ی پوزیشن، جهت عملیات بیشتر روی آن‌ را، با هم ببینیم:

//+--------------------------------------------------------------------------------+

//| returns true in case of a successful choosing of an order in the position pos  |

//+--------------------------------------------------------------------------------+

boolSelectOnlyOrder(intpos)

  {

   boolres=false;

   res=OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);

   return(res);

  }

//+------------------------------------------------------------------+

چند توصیه برای کدنویسی

اول از همه، به‌جای true و false، آپشن‌های ۰ و ۱ پیش روی خود بگذارید. این کار به شما کمک می‌کند اکسپرت خود را بهتر بهینه‌سازی کنید. دوم، وقتی بازار در جهت مخالفِ شرایط حرکت می‌کند، از Stop Loss جهت محدود کردن ضررهای ممکن، صرف‌نظر نکنید. سوم، اکسپرت‌ها را بدون Stop Loss تست نکنید، این کار ممکن است سریعاً سرمایه‌ی شما را از بین ببرد. چهارم، از توابع و بلوک‌هایی استفاده کنید که به شما کمک می‌کنند فهمیدن کد را آسان‌تر کنید.

نتیجه‌گیری

ساختن یک اکسپرت کار ساده‌ای است. و اگر بخواهیم این کار را حتی ساده‌تر از این کنیم، فایل پیوست‌شده حاوی اکسپرتی است که در این مقاله به تحلیل آن پرداختیم.

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

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

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

خرید کتاب مقدس معامله گری براساس کندل استیک با تخفیف ويژه

به مدت محدود فقط تا یکشنبه 16 اردیبهشت


🔶حجم کتاب: 7.1 مگابایت

🔶تعداد صفحات: 148 صفحه

🔶قابل مطالعه روی موبایل، لپ تاپ یا کامپیوتر

⭐ارزش کتاب معامله گری بر اساس کندل استیک این کتاب در سایت رسمی آن به قیمت ۴۷ دلار به فروش می رسد. و به جرات می‌توان گفت هر تریدر حرفه‌‌ای حداقل یک بار این کتاب را خوانده است. اگر میخواهید فقط یک کتاب در زمینه کندل استیکها در بازارهای مالی مطالعه کنید فقط همین کتاب را بخوانید.


بلافاصه بعد از پرداخت لینک دانلود برای شما نمایش داده خواهد شد و میتوانید فایل را دریافت کنید


وارد کردن نام و شماره موبایل اختیاری می‌باشد.
29 هزار تومان 65 هزارتومان

تعداد خرید موفق تا این لحظه 468 نفر

پرداخت با کلیه کارت های عضو شتاب


در صورت بروز هرگونه مشکل در هر مرحله‌ای از خرید، میتوانید با پشتیبانی آنلاین و یا شماره 09018816095 (واتس‌آپ) در تماس باشید.

نظرات

رضاخانی

کیفیت بسیار عالی و محتوا به شدت مفید هست
برای دوستانی میخوان کار ترید کنن توصیه میکنم

مدیر سایت

ممنون از دیدگاه ارزشمندتون، خوشحالیم که تونسته براتون مفید باشه


Zahra

سلام چطوری میتونم کتاب رابگیرم

مدیر سایت

سلام، روی دکمه سبز رنگ "خرید و دانلود فوری" که کلیک کنید بلافاصله بعد از پرداخت، میتونید کتاب رو دانلود کنید و روی گوشی یا لپتاپ مطالعه کنید


حسین میرزانیا

ببخشید من بعد از خرید اینترنتم قطع شد و نتونستم دانلود کنم باید چیکار کنم
لطفا راهنماییم کنید

مدیر سایت

سلام
جای نگرانی نیست
لطفا در واتس آپ یا SMS به پشتیبانی به شماره 09018816095 پیام بدید تا براتون لینک دانلود رو ارسال کنیم


هاشمی

سلام ضمن تشکر از دست اندرکاران باید بگم که مطالب کاملا گویا و قابل درک توضیح داده شده و نقطه قوت این سایت تیم پشتیبانی صبور و خوش برخوردش هست که خیلی مفید و کاربردی جوابگوی سوالات هستند.

مدیر سایت

سلام
خوشحالیم که این کتاب تونسته برای شما مفید باشه


حامد

امکانش هست مجدد تخفیف ویژه رو تمدید کنید تا بتونیم کتاب رو تهیه کنیم
ممنون

مدیر سایت

سلام
فردا شب مجدد تخفیف ویژه قرار داده میشه


Mehdi

ممنون از این کتاب خوب
مطالب بسیار مفید هستن هیچ گونه حاشیه و اضافه گویی ندارن

مدیر سایت

سلام مهدی عزیز
باعث افتخاره که تونستیم نظر شما رو جلب کنیم





ارسال نظر

نام


ایمیل


نظر