شکارِ رَوَند

شکارِ رَوَند

شکارِ رَوَند

هشدار

اطلاعات موجود در این مقاله، صرفاً نظرات من هستند. به‌عنوان نویسنده‌ی این مقاله شما را ملزم به عمل کردن مطابق با الگوریتم توصیف‌شده در این مقاله نمی‌دانم. علاوه بر این، به شما هشدار می‌دهم که اطلاعات موجود در این مقاله شاید باعث ضرر و زیان شما بشوند، پس مسئولیت استفاده از این مقاله کاملاً برعهده‌ی خود شما است.

مقدمه

این مقاله به صحبت درباره‌ی یک روش برای معامله کردن می‌پردازد – [یعنی] جمع‌آوری و به‌نوعی انباشت حجم معاملات سود. فرض من بر این است که فقط معاملات سود را می‌توان انباشته کرد. این مقاله روش مطلوب برای انجام این کار را توضیح می‌دهد و کد اکسپرتی که به شما کمک می‌کند چنین معاملاتی را صحیح اجرا کنید را در اختیار شما قرار می‌دهد.

مفهوم الگوریتم

جمع‌آوری حجم یک معامله‌ی سودده اجازه می‌دهد حداکثر سود از حرکت بازاری که با آن مواجه هستیم را کسب کنیم. اما حجم باید طوری جمع‌آوری شود که نتیجه‌اَش افزایش ریسک نباشد. یکی از الگوریتم‌های مناسب برای این کار، در این مقاله توضیح داده شده‌است.

ابتدا، به یک نقطه مرجع نیاز داریم – یعنی اولین ترید اصلی. ترید اصلی باید حجمی بیشتر از حجم هر یک از تریدهای کمکی داشته باشد. فرض کنید حجم ترید اصلی ۰.۲ (دو دَهم) لات است، آنگاه حجم تریدهای کمکی ۰.۱ لات خواهد بود. برای تمام معاملات از Trailing Stop Loss استفاده می‌شود، برای مثال پنجاه پوینت (points). وقتی سود ترید اصلی به +۱۰۰ points می‌رسد، Stop Loss، +۵۰ خواهد بود. در این لحظه، معامله‌ای با ۰.۱ لات در همان جهت با حد ضررِ -۵۰ points باز می‌شود. اگر قیمت به عقب برگردد، هر دو معامله با دستور Stop Loss بسته می‌شوند. سود بدست‌آمده برابر با ۵۰ پوینت (points) از ۰.۲ لات خواهد بود، و ضرر -۵۰ پوینت (points) از ۰.۱ لات. روی‌هم‌رفته، سود برابر است با ۵۰ پوینت (points) از ۰.۱ لات. بنابراین حفاظت در برابر ضرر در اینجا انجام شده‌، درحالیکه حجم معامله افزایش یافته است.

اگر یک معامله حرکت در جهت لازم را ادامه‌ دهد، وقتی سود معامله‌ی کمکی به +۵۰ points می‌رسد، Trailing Stop Loss فعال می‌شود. و وقتی در ترید اصلی به سود ۲۰۰ points می‌رسیم، و معامله‌ی کمکی نیز به سود ۱۰۰ points می‌رسد، آنگاه یک معامله‌ی کمکی دیگر باز می‌شود. مجدد SL برابر با -۵۰ است و اِلی آخر.

این روش کاملاً ساده به ما اجازه می‌دهد از جمع‌آوری لاتیج سود خوبی بدست آوریم. و همزمان ریسک هم به حداقل می‌رسد. در حقیقت ریسک اینجا فقط آن قسمت از ترید اصلی است که از دست می‌رود؛ به‌عبارت دیگر، ریسک این است که اولین معامله‌ی کمکی ضرر شود. اما این، ریسکِ ضرر کردن نیست، بلکه ریسکِ بدست‌نیاوردنِ سود کامل است.

Trailing Stop Loss استاندارد به ما اجازه‌ی تریلینگ معاملات را فقط در صورتی می‌دهد که سود وجود داشته باشد. اما اگر این [کار] روی معاملات کمکی قبل از کسب سود مورد نیاز انجام شود، سوددهیِ چنین رویکردی برای جمع‌آوری لاتیج را می‌توان افزایش داد. می‌توانید این کار را انجام دهید و همچنین بازشدن معاملات کمکی را با استفاده از MQL4، بهینه‌سازی کنید.

پیادهسازی

اکسپرتی که برای این منظور نوشته شده‌است، بر اساس اکسپرتی است که در مقاله‌ی(اِسکلپینگ راحت) توصیف شده‌است. در این مقاله، این اکسپرت توابع ترکیبی دارد: نقش یک جور کد تقلب در بازی و ابزاری برای باز کردن معاملات را دارد. برای این معامله، عملکرد بازی‌ از آن حذف شده‌است. بنابراین، اکسپرت دو فِلِش روی نمودار می‌کِشد – بالا و پایین. حذف یکی از آن‌ها سیگنالی است برای باز کردن معاملات در جهت لازم. برای مثال، با حذف فِلِش رو به پایین، فِلِش رو به بالا روی نمودار باقی می‌‌ماند. و برای اکسپرت این سیگنالی است که می‌گوید یک معامله‌ی Buy انجام بده و چند معامله‌ی انتظاری Buy Stop هم درج کن.

معامله‌ی بازار در اینجا معامله‌ی اصلی است. و معاملات انتظاری عملکرد معاملات کمکی را دارند که نسبت به معامله‌ی اصلی دارای لاتیج کمتری می‌باشند. برای محاسبه‌ی “تناوب”بازشدنِ معاملات کمکی و کمیت آن‌ها، از دو مفهوم در اینجا استفاده شده‌است. اولین آن‌ها، هدف نهایی، یعنی Take Profit است. که برای تمام معاملات (اصلی و کمکی) برابر است. مفهوم دوم، گامی برای باز کردن معاملات انتظاری است. بسته به هدف نهایی، اکسپرت محاسبه می‌کند که در فاصلۀ‌ بین قیمت فعلی تا خط Take Profit، چه تعداد معامله می‌تواند درج کند.

برای مثال، اگر از Take Profit برابر با ۴۰۰ points استفاده کنیم، و گام ما برای باز کردن معامله ۱۰۰ points (به‌طور پیش‌فرض) باشد، ۴ معامله‌ی Buy باز خواهد شد. اولین معامله، Buy در قیمت پیشنهادی فروش (Ask price) است، که یعنی معامله‌ی اصلی. معامله‌ی دوم، یک معامله‌ی کمکی Buy Stop در قیمت پیشنهادی فروش +۱۰۰ points است. معامله‌ی سوم، باز هم یک معامله‌ی کمکی Buy Stop در قیمت پیشنهادی فروش +۲۰۰ points است. و معامله‌ی چهارم نیز معامله‌ی کمکی Buy Stop در قیمت پیشنهادی فروش +۳۰۰ points خواهد بود. حد سود برای همه‌ی معاملات، برابر با Ask +400 points خواهد بود؛ به‌عبارت دیگر، برای اولین معامله، حد سودی برابر با ۴۰۰ points را خواهیم داشت، برای معامله‌ی دوم ۳۰۰، برای معامله‌ی سوم ۲۰۰، و۱۰۰ points  برای معامله‌ی چهارم.

Trailing Stop Loss برای ترید اصلی تنها در صورتی کار می‌کند که سود مورد نیاز کسب شده‌ باشد (به‌طور پیش‌فرض ۵۰ points). و برای معامله‌های کمکی Trailing Stop Loss از لحظه‌ی بازشدن عمل خواهد کرد (به‌عبارت دیگر، Stop Loss در محدوده‌ی ضرر هم قابلیت Trail دارد). خطTrailing Stop Loss  برای تمام معاملات یکی است. علاوه بر این، Trailing Stop Loss برای معامله‌های کمکی یک خط Stop Loss به‌حساب می‌آید.

اگر معامله‌ی اصلی بسته شود، معاملات انتظاری باقی‌مانده حذف می‌شوند. بعد از آن مجدد دو فِلِش روی نمودار رسم می‌شود. و این یعنی اکسپرت مجدد برای باز کردن معاملات آماده است.

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

//+------------------------------------------------------------------+
//|                                                   take_trend.mq4 |
//|                                       Copyright © ۲۰۰۸, FXRaider |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © ۲۰۰۸, FXRaider"
extern int gap=20;            //level at which arrows are placed 
extern int TP=400;            //Take Profit level
extern int SL=0;              //Stop Loss level
extern double Lots1=0.2;      //lot of a main trade
extern double Lots2=0.1;      //lot of auxiliary trades 
extern int slippage=2;        //level of acceptable requote
extern int MagicNumber1=5345; //magic number of the main trade
extern int MagicNumber2=4365; //magic number of auxiliary trades
extern int Open_Step=100;     //step for opening auxiliary trades
 
extern bool UseTrailing = true; //enabling/disabling T-SL
extern int TrailingStop = 50;   //Trailing Stop Loss level
extern int TrailingStep = 1;    //Trailing Stop Loss step
int start()
  {
//------------------------------       
//+----------------------------------------------------------------------------------------------+
//|                              searching open orders for a pair                                |
    int pos_sell=0;
  for (int i_op_sell=OrdersTotal()-1; i_op_sell>=0; i_op_sell--) 
  { 
   if (!OrderSelect(i_op_sell,SELECT_BY_POS,MODE_TRADES)) break; 
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1   
   &&(OrderType()==OP_SELL))
   {
    pos_sell=1; break;   
   } 
  }
    
    int pos_buy=0;
  for (int i_op_buy=OrdersTotal()-1; i_op_buy>=0; i_op_buy--) 
  { 
   if (!OrderSelect(i_op_buy,SELECT_BY_POS,MODE_TRADES)) break; 
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1
   &&(OrderType()==OP_BUY))
   {
    pos_buy=1; break;   
   } 
  }    
//|                              searching open orders for a pair                                |
//+----------------------------------------------------------------------------------------------+  
//+------------------------------------------------------------------------------------+
//|                                 working with objects                               |  
 
//+----------------------------------------------------------+
//|                    deleting objects                      | 
  if(iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))>0
     ||ObjectGet("down",OBJPROP_PRICE1)!=Open[0]-gap*Point) 
    {
     ObjectDelete("down"); 
    }  
  if(iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))>0
    ||ObjectGet("up",OBJPROP_PRICE1)!=Open[0]+gap*Point)            
    { 
     ObjectDelete("up"); 
    } 
//|                    deleting objects                      |   
//+----------------------------------------------------------+ 
 
//+----------------------------------------------------------+
//|                   drawing objects                        |   
   if((ObjectFind("down") != 0&&ObjectFind("up") != 0) //if no objects
   &&!pos_sell&&!pos_buy)                              //if no open orders
   {
     ObjectCreate("down", OBJ_ARROW, 0, Time[0], Open[0]-gap*Point); //draw a down arrow
     ObjectSet("down", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("down", OBJPROP_ARROWCODE, 234);
     ObjectSet("down", OBJPROP_COLOR, Red);
 
     ObjectCreate("up", OBJ_ARROW, 0, Time[0], Open[0]+gap*Point); //draw an up arrow
     ObjectSet("up", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("up", OBJPROP_ARROWCODE, 233);
     ObjectSet("up", OBJPROP_COLOR, Blue);
   }    
//|                   drawing objects                        |
//+----------------------------------------------------------+   
      
//|                                 working with objects                               |   
//+------------------------------------------------------------------------------------+
 
   
 
 
//+----------------------------------------------------------------------------------------------+ 
//|                                deleting unnecessary orders                                   | 
int cnt_del; 
if(pos_buy==0)
{               
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) 
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;     
    if(OrderSymbol()==Symbol())
    {
     if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); 
    }
  } 
 } 
 
if(pos_sell==0)
{               
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) 
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;     
    if(OrderSymbol()==Symbol())
    { 
    if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); 
    }
  } 
 }  
//|                                deleting unnecessary orders                                   |
//+----------------------------------------------------------------------------------------------+  
 
  
//+------------------------------------------------------------------------------------+ 
//|                                   opening trades                                   |
double sl_buy, sl_sell;
 if(!SL)
 { 
  sl_buy=0;
  sl_sell=0;
 }
 else
 {
  sl_buy=Ask-SL*Point;
  sl_sell=Bid+SL*Point;
 }
 int stop_positions=MathFloor(TP/Open_Step-1);
 int i, open_step_2;
  if(
     ObjectGet("up", OBJPROP_PRICE1)==Open[0]+gap*Point
     &&iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))==0
     &&ObjectFind("down") != 0
     &&ObjectFind("up") == 0
     &&!pos_buy  
     )
     {
      OrderSend(Symbol(),OP_BUY, Lots1,Ask,slippage,sl_buy,Ask+TP*Point,"take_trend",MagicNumber1,0,Blue); 
      for(i=stop_positions;i>=0; i--) 
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_BUYSTOP, Lots2,
       Ask+open_step_2*Point,slippage,
       ۰,Ask+TP*Point,"take_trend",MagicNumber2,0,Blue);
      }          
     }
  if(
     ObjectGet("down", OBJPROP_PRICE1)==Open[0]-gap*Point
     &&iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))==0
     &&ObjectFind("up") != 0
     &&ObjectFind("down") == 0
     &&!pos_sell
     )
     {
      OrderSend(Symbol(),OP_SELL, Lots1,Bid,slippage,sl_sell,Bid-TP*Point,"take_trend",MagicNumber1,0,Red);
      for(i=stop_positions;i>=0; i--) 
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_SELLSTOP, Lots2,
       Bid-open_step_2*Point,slippage,
       ۰,Bid-TP*Point,"take_trend",MagicNumber2,0,Red);
      }        
     }
//|                                   opening trades                                   |  
//+------------------------------------------------------------------------------------+   
 
 
//+-------------------------------------------------------------------------------------------------+ 
//|                                      trail of open orders                                       |
if (UseTrailing)
{ 
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;       
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
//|                                      trail of open orders                                       |
//+-------------------------------------------------------------------------------------------------+
     
   return(0);
  }
//+------------------------------------------------------------------+

این کد تمام کامنت‌های مورد نیاز را در خود دارد.

متغیرها:

gap – level, on which arrows are placed
TP – Take Profit level
SL – Stop Loss level
Lots1 – lot of a main trade
Lots2 – lot of auxiliary trades
slippage – level of acceptable requote
MagicNumber1 – magic number of the main trade
MagicNumber2 – magic number of auxiliary trades
Open_Step – step for opening auxiliary trades

UseTrailing – enabling/disabling T-SL
TrailingStop – Trailing Stop Loss level
TrailingStep – Trailing Stop Loss step

وقتی اکسپرت را روی نمودار می‌آوریم، دو فِلِش برای ما رسم می‌کند:

شکارِ رَوَند
شکارِ رَوَند

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

شکارِ رَوَند
شکارِ رَوَند

بلافاصله بعد از اینکه یکی از فِلِش‌ها حذف شدند، اکسپرت معاملات را باز می‌کند:

شکارِ رَوَند
شکارِ رَوَند

می‌بینید که فِلِش باقی‌مانده در اِسکرین‌شات نشان داده نشده‌است – همانطور که قبل‌تر درج شده بود، روی کندل‌اِستیک بعدی حذف گردیده است و فِلِش‌ها دیگر ظاهر نمی‌شوند تا زمانی که تمام معاملات بسته شوند. به‌محض اینکه سود اولین معامله به حد مطلوب برسد، Trailing Stop Loss شروع به فعالیت می‌کند (و برای معاملات کمکی نیز همیشه فعال است). در این مثال فقط اولین معامله در بازگشت (Rollback)، بسته شده‌است. و همراه با این، تمام دیگر معاملات حذف شده‌اند:

شکارِ رَوَند
شکارِ رَوَند

نتیجهگیری

در نتیجه‌گیری می‌خواهم این را اضافه کنم که خط Trailing Stop Loss، Take Profit و خطی که برای باز کردن معاملات کمکی است، برای هر جفت‌اَرز باید به‌طور جداگانه انتخاب شوند. همچنین باید این را مطرح کنم که برای استفاده‌ی موثر، خط بازشدن معاملات کمکی باید بزرگتر از خط Trailing Stop Loss باشد. در معامله‌ی اصلی توصیه می‌شود اندازه‌ی لاتیج را بزرگتر از لاتیجِ معاملات کمکی درنظر بگیرید.

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

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

 

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

M23admin

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

اِسکَلپینگ راحت

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

ترید شبانه چقدر قابل اطمینان است؟

۲۴ مورد نظر

نوشتن نظر شما

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