زبان MQL در معاملات فارکس ( پارت دوم ) | نوشتن یک indicator ساده

ورودی های سبک در زبان MQL

در این­جا من قصد دارم تحقیقات ساده ریاضی خود را به indicator ای که نقاط ورود به بازار را تشخیص می­دهد و به عنوان پایه­ای برای نوشتن EAها تبدیل می­شود، تبدیل کنم. من شاخص را در MQL5 توسعه خواهم داد. با این حال، کد برای انتقال به MQL4 تا بیش­ترین حد ممکن سازگار است. به طور کلی، من سعی می­کنم از ساده­ترین روش­های ممکن وابسته به OOP فقط درصورتی که کدی غیرضروری، دست و پا گیر و غیرقابل خواندن شود، استفاده کنم. با این حال، در 90٪ موارد می­توان از این امر جلوگیری کرد. پنل­های رنگی، دکمه­ها و انبوهی از داده­های غیر ضروری نمایش داده شده روی نمودار، فقط مانع درک بصری می­شوند. در عوض، من همیشه سعی می­کنم با کم­ترین ابزار بصری کار کنم.

بیایید از ورودی­های indicator شروع کنیم.

input uint BarsI=990;//Bars TO Analyse ( start calc. & drawing )
input uint StepsMemoryI=2000;//Steps In Memory
input uint StepsI=40;//Formula Steps
input uint StepPoints=30;//Step Value
input bool bDrawE=true;//Draw Steps

محاسبه indicator ها در زبان MQL (ام کیو ال)

هنگامی که indicator بارگیری می­شود، می­توانیم محاسبه اولیه تعداد مشخصی از مراحل را با استفاده از candleهای آخر به عنوان پایه انجام دهیم. برای ذخیره اطلاعات مربوط به آخرین مراحل خود به بافر نیز نیاز خواهیم داشت. داده­های جدید برای جایگزینی داده­های قدیمی است. اندازه آن محدود است. برای ترسیم مراحل روی نمودار باید از همان اندازه استفاده شود. باید تعداد مراحلی را تعیین کنیم که قرار است توزیع آن­ها را بسازیم و مقادیر لازم را محاسبه کنیم. سپس باید سیستم را از اندازه گام در نقاط و این­که آیا به تجسم مراحل نیاز داریم، آگاه کنیم. مراحل باید با ترسیم نمودار نمایش داده شود.

حتما ثبت نام کنید : دوره آموزش سریع MQL5

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

من همیشه می­توانم از ترفند کوچک زیر استفاده کنم تا بتوانم مانند MQL4 به نوار داده­ها دسترسی پیدا کنم:

//variable to be moved in MQL5
double Close[];
double Open[];
double High[];
double Low[];
long Volume[];
datetime Time[];
double Bid;
double Ask;
double Point=_Point;
int Bars=1000;
MqlTick TickAlphaPsi;

void DimensionAllMQL5Values()//set the necessary array size
   {
   ArrayResize(Close,BarsI,0);
   ArrayResize(Open,BarsI,0);   
   ArrayResize(Time,BarsI,0);
   ArrayResize(High,BarsI,0);
   ArrayResize(Low,BarsI,0);
   ArrayResize(Volume,BarsI,0);
   }

void CalcAllMQL5Values()//recalculate all arrays
   {
   ArraySetAsSeries(Close,false);                        
   ArraySetAsSeries(Open,false);                           
   ArraySetAsSeries(High,false);                        
   ArraySetAsSeries(Low,false);                              
   ArraySetAsSeries(Volume,false);
   ArraySetAsSeries(Time,false);                                                            
   if( Bars >= int(BarsI) ) 
      {
      CopyClose(_Symbol,_Period,0,BarsI,Close);
      CopyOpen(_Symbol,_Period,0,BarsI,Open);   
      CopyHigh(_Symbol,_Period,0,BarsI,High);
      CopyLow(_Symbol,_Period,0,BarsI,Low);
      CopyTickVolume(_Symbol,_Period,0,BarsI,Volume); 
      CopyTime(_Symbol,_Period,0,BarsI,Time);      
      }
   ArraySetAsSeries(Close,true);
   ArraySetAsSeries(Open,true);
   ArraySetAsSeries(High,true);                        
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Volume,true);                                                                                                
   ArraySetAsSeries(Time,true);
   SymbolInfoTick(Symbol(),TickAlphaPsi);
   Bid=TickAlphaPsi.bid;
   Ask=TickAlphaPsi.ask;
   }
////////////////////////////////////////////////////////////

اکنون کد، تا حد ممکن با MQL4 سازگار شده است و ما می­توانیم آن را به سرعت و به راحتی به یک آنالوگ MQL4 تبدیل کنیم.

برای توصیف مراحل، ابتدا باید نودها را توصیف کنیم.

struct Target//structure for storing node data
   {
   double Price0;//node price
   datetime Time0;//node price
   bool Direction;//direction of a step ending at the current node
   bool bActive;//whether the node is active
   };
   
double StartTick;//initial tick price
Target Targets[];//destination point ticks (points located from the previous one by StepPoints)

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

اندیکاتور ها در محاسبه bar ها در زبان MQL (ام کیو ال)

به علاوه، ما باید توانایی به روزرسانی وضعیت مراحل در هر تیک و انجام محاسبه تقریبی توسط barها را در هنگام تنظیم اولیه indicator داشته باشیم.

bool UpdatePoints(double Price00,datetime Time00)//update the node array and return 'true' in case of a new node
   {
   if ( MathAbs(Price00-StartTick)/Point >= StepPoints )//if the step size reaches the required one, write it and 
shift the array back
      {
      for(int i=ArraySize(Targets)-1;i>0;i--)//first move everything back
         {
         Targets[i]=Targets[i-1];
         }
      //after that, generate a new node  
      Targets[0].bActive=true;
      Targets[0].Time0=Time00;
      Targets[0].Price0=Price00;
      Targets[0].Direction= Price00 > StartTick ? true : false;
      //finally, redefine the initial tick to track the next node
      StartTick=Price00;
      return true;
      }
   else return false;
   }

void StartCalculations()//approximate initial calculations (by bar closing prices)
   {
   for(int j=int(BarsI)-2;j>0;j--) 
      {
      UpdatePoints(Close[j],Time[j]);
      }  
   }

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

int S[];//array of final upward steps
int U[];//array of upward steps
int D[];//array of downward steps
double P[];//array of particular outcome probabilities

double KBettaMid;//neutral Betta ratio value
double KBettaMax;//maximum Betta ratio value
//minimum Betta = 0, there is no point in setting it
double KAlphaMax;//maximum Alpha ratio value
double KAlphaMin;//minimum Alpha ratio value
//average Alpha = 0, there is no point in setting it

int CalcNumSteps(int Steps0)//calculate the number of steps
   {
   if ( Steps0/2.0-MathFloor(Steps0/2.0) == 0 ) return int(Steps0/2.0);
   else return int((Steps0-1)/2.0);
   }

void ReadyArrays(int Size0,int Steps0)//prepare the arrays
   {
   int Size=CalcNumSteps(Steps0);
   ArrayResize(S,Size);
   ArrayResize(U,Size);
   ArrayResize(D,Size);
   ArrayResize(P,Size);
   ArrayFill(S,0,ArraySize(S),0);//clear
   ArrayFill(U,0,ArraySize(U),0);
   ArrayFill(D,0,ArraySize(D),0);
   ArrayFill(P,0,ArraySize(P),0.0);
   }

void CalculateAllArrays(int Size0,int Steps0)//calculate all arrays
   {
   ReadyArrays(Size0,Steps0);
   double CT=CombTotal(Steps0);//number of combinations
   for(int i=0;i<ArraySize(S);i++)
      {
      S[i]=Steps0/2.0-MathFloor(Steps0/2.0) == 0 ? i*2 : i*2+1 ;
      U[i]=int((S[i]+Steps0)/2.0);
      D[i]=Steps0-U[i];
      P[i]=C(Steps0,U[i])/CT;
      }
   }

void CalculateBettaNeutral()//calculate all Alpha and Betta ratios
   {
   KBettaMid=0.0;
   if ( S[0]==0 )
      {
      for(int i=0;i<ArraySize(S);i++)
         {
         KBettaMid+=MathAbs(S[i])*P[i];
         }
      for(int i=1;i<ArraySize(S);i++)
         {
         KBettaMid+=MathAbs(-S[i])*P[i];
         }
      }
   else
      {
      for(int i=0;i<ArraySize(S);i++)
         {
         KBettaMid+=MathAbs(S[i])*P[i];
         }
      for(int i=0;i<ArraySize(S);i++)
         {
         KBettaMid+=MathAbs(-S[i])*P[i];
         }
      }
   KBettaMax=S[ArraySize(S)-1];
   KAlphaMax=S[ArraySize(S)-1];
   KAlphaMin=-KAlphaMax;
   }
   
double Factorial(int n)//factorial of n value
   {
   double Rez=1.0;
   for(int i=1;i<=n;i++)
      {
      Rez*=double(i);
      }
   return Rez;
   }
   
double C(int n,int k)//combinations from n by k
   {
   return Factorial(n)/(Factorial(k)*Factorial(n-k));
   }
   
double CombTotal(int n)//number of combinations in total
   {
   return MathPow(2.0,n);
   }

توابع فراخوانی شده برای محاسبه مقادیر آرایه در زبان MQL

در زبان MQL همه این تابع­ها باید در جای مناسب فراخوانی شوند. همه توابع در این­جا، به جز دو مورد اول، یا برای محاسبه مقادیر آرایه­‌ها در نظر گرفته شده­اند، یا برخی از توابع ریاضی کمکی را اجرا می­کنند. آن­ها در هنگام مقداردهی اولیه همراه با محاسبه توزیع neutral فراخوانی می­شوند و برای تنظیم اندازه آرایه ها استفاده می­شوند.

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

double AlphaPercent;//alpha trend percentage
double BettaPercent;//betta trend percentage
int ActionsTotal;//total number of unique cases in the Array of steps considering the number of steps for checking the option
int Np[];//number of actual profitable outcomes of a specific case
int Nm[];//number of actual losing outcomes of a specific case
double Pp[];//probability of a specific profitable step
double Pm[];//probability of a specific losing step
int Sm[];//number of losing steps

void ReadyMainArrays()//prepare the main arrays
   {
   if ( S[0]==0 )
      {
      ArrayResize(Np,ArraySize(S));
      ArrayResize(Nm,ArraySize(S)-1);
      ArrayResize(Pp,ArraySize(S));
      ArrayResize(Pm,ArraySize(S)-1);      
      ArrayResize(Sm,ArraySize(S)-1);
      for(int i=0;i<ArraySize(Sm);i++)
         {
         Sm[i]=-S[i+1];
         }
      ArrayFill(Np,0,ArraySize(Np),0);//clear
      ArrayFill(Nm,0,ArraySize(Nm),0);
      ArrayFill(Pp,0,ArraySize(Pp),0);
      ArrayFill(Pm,0,ArraySize(Pm),0);      
      }
   else
      {
      ArrayResize(Np,ArraySize(S));
      ArrayResize(Nm,ArraySize(S));
      ArrayResize(Pp,ArraySize(S));
      ArrayResize(Pm,ArraySize(S));      
      ArrayResize(Sm,ArraySize(S));
      for(int i=0;i<ArraySize(Sm);i++)
         {
         Sm[i]=-S[i];
         }
      ArrayFill(Np,0,ArraySize(Np),0);//clear
      ArrayFill(Nm,0,ArraySize(Nm),0);
      ArrayFill(Pp,0,ArraySize(Pp),0);
      ArrayFill(Pm,0,ArraySize(Pm),0);            
      }   
   }

void CalculateActionsTotal(int Size0,int Steps0)//total number of possible outcomes made up of the array of steps
   {
   ActionsTotal=(Size0-1)-(Steps0-1);
   }

bool CalculateMainArrays(int Steps0)//count the main arrays
   {
   int U0;//upward steps
   int D0;//downward steps
   int S0;//total number of upward steps
   if ( Targets[ArraySize(Targets)-1].bActive )
      {
      ArrayFill(Np,0,ArraySize(Np),0);//clear
      ArrayFill(Nm,0,ArraySize(Nm),0);
      ArrayFill(Pp,0,ArraySize(Pp),0);
      ArrayFill(Pm,0,ArraySize(Pm),0);      
      for(int i=1;i<=ActionsTotal;i++)
         {
         U0=0;
         D0=0;
         S0=0;
         for(int j=0;j<Steps0;j++)
            {
            if ( Targets[ArraySize(Targets)-1-i-j].Direction ) U0++;
            else D0++;
            }
         S0=U0-D0;
         
         for(int k=0;k<ArraySize(S);k++)
            {
            if ( S[k] == S0 )
               {
               Np[k]++;
               break;
               }
            }
         for(int k=0;k<ArraySize(Sm);k++)
            {
            if ( Sm[k] == S0 )
               {
               Nm[k]++;
               break;
               }
            }
         }
         
      for(int k=0;k<ArraySize(S);k++)
         {
         Pp[k]=Np[k]/double(ActionsTotal);
         }
      for(int k=0;k<ArraySize(Sm);k++)
         {
         Pm[k]=Nm[k]/double(ActionsTotal);
         }         
         
      AlphaPercent=0.0;
      BettaPercent=0.0;
      for(int k=0;k<ArraySize(S);k++)
         {
         AlphaPercent+=S[k]*Pp[k];
         BettaPercent+=MathAbs(S[k])*Pp[k];
         }
      for(int k=0;k<ArraySize(Sm);k++)
         {
         AlphaPercent+=Sm[k]*Pm[k];
         BettaPercent+=MathAbs(Sm[k])*Pm[k];
         }
      AlphaPercent= (AlphaPercent/KAlphaMax)*100;
      BettaPercent= (BettaPercent-KBettaMid) >= 0.0 ? ((BettaPercent-KBettaMid)/(KBettaMax-KBettaMid))*100 : ((BettaPercent-KBettaMid)/KBettaMid)*100;
      
      Comment(StringFormat("Alpha = %.f %%\nBetta = %.f %%",AlphaPercent,BettaPercent));//display these numbers on the screen
      return true;
      }
   else return false;
   }

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

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

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

تعیین این­که چه چیزی تعریف شود و کجا فراخوانی شود باقی مانده است.

int OnInit()
  {
   //--- indicator buffers mapping
   SetIndexBuffer(0,NeutralBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,CurrentBuffer,INDICATOR_DATA);
   CleanAll();
   DimensionAllMQL5Values();
   CalcAllMQL5Values();
   StartTick=Close[BarsI-1];
   ArrayResize(Targets,StepsMemoryI);//maximum number of nodes
   CalculateAllArrays(StepsMemoryI,StepsI);
   CalculateBettaNeutral();
   StartCalculations();
   ReadyMainArrays();
   CalculateActionsTotal(StepsMemoryI,StepsI);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
  CalcAllMQL5Values();
  
  if ( UpdatePoints(Close[0],TimeCurrent()) )
     {
     if ( CalculateMainArrays(StepsI) )
        {
        if ( bDrawE ) RedrawAll();
        }
     }
      
  int iterator=rates_total-(ArraySize(Sm)+ArraySize(S))-1;
  for(int i=0;i<ArraySize(Sm);i++)
     {
     iterator++;
     NeutralBuffer[iterator]=P[ArraySize(S)-1-i];
     CurrentBuffer[iterator]=Pm[ArraySize(Sm)-1-i];
     }
  for(int i=0;i<ArraySize(S);i++)
     {
     iterator++;
     NeutralBuffer[iterator]=P[i];
     CurrentBuffer[iterator]=Pp[i];
     }

   return(rates_total);
  }

 از CurrentBuffer و NeutralBuffer در این­جا به عنوان بافر استفاده می­شود. برای شفافیت بیش­تر، نمایش روی نزدیک­ترین candleها را به بازار معرفی کرده­ام. هر احتمال در یک bar جداگانه است. این به ما امکان می­دهد از شر عوارض غیر ضروری خلاص شویم. به سادگی نمودار را بزرگ و کوچک کنید تا همه چیز را ببینید. توابع () CleanAll و ()RedrawAll  در این­جا نشان داده نمی­شوند. می­توان درباره آن­ها توضیح داد و همه چیز بدون render، خوب کار خواهد کرد. هم­چنین، من بلوک طراحی را در این­جا قرار نداده­ ام. می­توانید آن را در پیوست پیدا کنید. هیچ چیز قابل توجهی در آن­جا وجود ندارد. این indicator در دو نسخه – برای MetaTrader 4 و MetaTrader 5- نیز در زیر پیوست شده است.

متا تدر | زبان MQL

در زیر گزینه ­ای با ورودی­ های دیگر و سبک پنجره وجود دارد.

ورودی های سبک در زبان MQL

مرور جالب ­ترین استراتژی­ ها در زبان MQL

من استراتژی­های زیادی را توسعه داده و دیده­ام. در تجربه فروتنانه من، هنگام استفاده از grid یا martingale یا هر دو، مهم­ترین اتفاقات رخ می­دهد. به طور دقیق، انتظار می­رود بازدهی هر دو martingale و grid، 0 باشد. فریب نمودارهای رو به بالا را نخورید زیرا یک روز ضرر زیادی خواهید دید. gridهای کاری وجود دارد و می­توان آن­ها را در بازار یافت. آن­ها نسبتاً خوب کار می­کنند و حتی ضریب سود 3-6 را نشان می­دهند. این کاملاً ارزش بالایی است. علاوه بر این، آن­ها در هر جفت ارز، ثابت باقی می­مانند. اما تهیه فیلترهایی که به شما امکان برنده شدن را بدهند کار آسانی نیست. روشی که در بالا توضیح داده شد به شما امکان مرتب­سازی این سیگنال­ها را می­دهد. grid به trend نیاز دارد، در حالی که جهت مهم نیست.

بیشتر بخوانید : اتصال توییتر با زبان ام کیو ال

Martingale و grid نمونه­ای از ساده­ ترین و محبوب­ترین استراتژی­ها هستند. با این حال، همه قادر به استفاده از آن­ها به روش مناسب نیستند. Expert Advisorهای خود سازگار کمی پیچیده­تر هستند. آن­ها می­توانند با هر چیزی flat، trend یا هر الگوی دیگر سازگار شوند. آن­ها معمولاً شامل برداشتن قطعه خاصی از بازار برای جستجوی الگوها و معامله در مدت زمان کوتاهی هستند به این امید که این الگو برای مدتی باقی بماند.

سیستم های عجیب و غریب با ماهیت chaotic

یک گروه جداگانه توسط سیستم ­های عجیب و غریب با الگوریتم­های مرموز و غیر متعارف که سعی در سود بردن از ماهیت chaotic بازار دارند، تشکیل شده است. چنین سیستم­هایی مبتنی بر ریاضیات محض هستند و قادر به سودآوری در هر ابزار و دوره زمانی هستند.

سود زیاد نیست اما پایدار است. من اخیراً با چنین سیستم­هایی سر و کار دارم. این گروه هم­چنین شامل ربات­های مبتنی بر btute force است. btute force را می­توان با استفاده از نرم افزار اضافی انجام داد. در مقاله بعدی، نسخه خود از چنین برنامه­ای را نشان خواهم داد.

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

در مورد نتیجه، به نظر من، اکنون احتمالات آن تقریباً برابر با صفر است. من EA مناسب دارم که هیچ نتیجه­ای ندارد.

آیا ارزش دردسر را دارد؟

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

افرادی که در تلاشند سریع ثروتمند شوند به احتمال زیاد با نتیجه معکوس روبه­رو خواهند شد. به هر حال، بازار برای برنده شدن یک معامله گر عادی ایجاد نشده است. این هدف، کاملاً برعکس است.

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

من بسیاری از شبه معامله گرانی را دیده­ام که پس از معاملات 20-30 معامله، در مورد برخی نتایج لاف می­زنند. در مورد من، بعد از ایجاد EA مناسب، ممکن است یک یا دو سال کار کند اما پس از آن ناگزیر شکست می­خورد … در بسیاری از موارد، از ابتدا کار نمی­کند.

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

آیا Grail وجود دارد و کجا می­توان آن را جستجو کرد؟

من معتقدم Grail بیش از حد ممکن است. من EAهای ساده­ای را اثبات می­کنم. متاسفانه، بازده مورد انتظار آن­ها به سختی گسترش می­یابد. من فکر می کنم تقریباً هر توسعه دهنده­ای این استراتژی ­ها را تایید می­کند.

این بازار تعداد زیادی ربات دارد که از همه لحاظ می­توان Grails نامید. اما کسب درآمد با چنین سیستم­هایی بسیار دشوار است زیرا شما باید برای هر pip مبارزه کنید و هم­چنین برنامه­های spread بازگشتی و شراکت را گسترش دهید. Grailهایی که سود قابل توجهی و بار سپرده کمی دارند نیز به ندرت اتفاق می­افتد.

اگر می­خواهید Grail را به تنهایی توسعه دهید، بهتر است به دنبال شبکه­های عصبی باشید. آن­ها پتانسیل زیادی از نظر سود دارند. البته، می­توانید سعی کنید رویکردهای عجیب و غریب و brute force را با هم ترکیب کنید، البته توصیه می­کنم فوراً وارد شبکه­ های عصبی شوید.

پاسخ به این سوالات که آیا Grail وجود دارد و کجا می­توان آن را جستجو کرد به اندازه کافی عجیب و غریب است اما بعد از این­که تعداد زیادی از EAها را ایجاد کردم برای من کاملاً ساده و واضح شد.

نکاتی برای معامله گران عادی

همه معامله گران سه چیز می­خواهند:

  • بازده مورد انتظار مثبت را به دست آورید
  • در صورت داشتن موقعیت سودآور، سود را افزایش دهید
  • در صورت از دست دادن موقعیت، ضرر را کاهش دهید

اولین نکته در این­جا مهم­ترین نکته است. اگر استراتژی سودآوری داشته باشید (صرف نظر از دستی یا الگوریتمی بودن آن)، همیشه می­خواهید مداخله کنید. این مجاز نیست شرایطی که معاملات سودآور نسبت به ضرر و زیان کم­تر است، تاثیر روانی قابل توجهی در خرابی سیستم معاملاتی دارد.

مهم­ تر از همه، هنگامی که قرمز هستید، برای جبران ضررهای خود عجله نکنید. در غیر این صورت، ممکن است حتی با ضررهای بیش­تری روبه­ رو شوید.

بازده مورد انتظار را به یاد داشته باشید. مهم نیست که ضرر سهام در موقعیت فعلی چیست. آن­چه واقعاً مهم است تعداد کل موقعیت­ها و نسبت سود / ضرر است.

اندازه گیری LOT در زبان MQL

نکته مهم بعدی اندازه lot است که شما در معاملات خود اعمال می­کنید. اگر در حال حاضر سود دارید، مطمئن شوید که به تدریج مقدار lot را کاهش می­دهید. در غیر این صورت، آن را افزایش دهید. با این حال، باید فقط تا یک مقدار آستانه خاص افزایش یابد. این martingale چند هدفه است.

اگر خوب فکر کنید، می توانید EA خود را صرفاً بر اساس تغییرات lot ایجاد کنید. این دیگر یک grid یا martingale نخواهد بود، بلکه چیزی پیچیده­تر و ایمن­تر است. علاوه بر این، چنین EAای ممکن است در تمام جفت ارزها در طول تاریخچه ذکر قیمت سهام کار کند.

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

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

نتیجه­ گیری

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

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

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


for_MathCad_15.zip

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

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

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

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

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

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

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

پاسخ‌ها

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

  1. input float Lot=0.01;
    استاد من یه متغیر Lot تعریف کردم از نوع float ولی با این اخطار مواجه شدم
    truncation of constant value

    البته میدونم که double بذارم دیگه خطا نمیده ولی برام سوال شده چرا float رو قبول نمیکنه، 0.01 مگه بیشتر از 4 بایته؟!

  2. استاد یه فایل Library داخل ویدیو ها معرفی کردید،
    من هرچی میگردم نیست، میشه لینک بدید دانلود کنم؟

    1. سلام،در بخش پیشرفته ام کیو ال 4 درس اخر وجود داره میتونید دانلود بفرمایید

  3. یه سوالی دارم که ربطی به این پست نداره
    من قبلا با ویژوال استدیو و زبان سی شارپ کار کردم، اونجا موقع اجرا با زدن F6 اگه اشتباه نکنم، خط به خط دستورات اجرا میشدن و ما میتونستیم مقدار یه متغیر رو ببینیم که در هنگام اجرا چه مقداری گرفته. آیا این امکان تو MQL ادیتور وجود داره؟
    اگه آره و اگه ممکن هست لینک آموزشش رو بذارید ممنون میشم

    1. سلام
      یک سری امکانات وجود داری برای دیباگ کردن ،(دکمه پلی بالای متاادیتور)ولی نه به اون شکلی که شما مد نظرتون هست ،ویزوال استادیو برنامه بسیار قوی هست

  4. سلام .میشه rates_total و prev_calculated رو به طور شفاف برام توضیح بدید؟
    منظورم کارش توی این کد نیست.

    1. سلام
      rates_tota تعداد کل کندل ها است
      prev_calculated هم کندل های که تا الان دیده شده توسط تابع OnCalculate