در اینجا من قصد دارم تحقیقات ساده ریاضی خود را به 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
من استراتژیهای زیادی را توسعه داده و دیدهام. در تجربه فروتنانه من، هنگام استفاده از 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 آن را نام گذاری نمیکنم.
این مقاله ترجمه شده توسط تیم آکادمی ایران ام کیو ال می باشد.
پاسخها
input float Lot=0.01;
استاد من یه متغیر Lot تعریف کردم از نوع float ولی با این اخطار مواجه شدم
truncation of constant value
البته میدونم که double بذارم دیگه خطا نمیده ولی برام سوال شده چرا float رو قبول نمیکنه، 0.01 مگه بیشتر از 4 بایته؟!
در ورودی تابع اوردر سند باید دبل باشه
درسته. مرسی استاد
استاد یه فایل Library داخل ویدیو ها معرفی کردید،
من هرچی میگردم نیست، میشه لینک بدید دانلود کنم؟
سلام،در بخش پیشرفته ام کیو ال 4 درس اخر وجود داره میتونید دانلود بفرمایید
یه سوالی دارم که ربطی به این پست نداره
من قبلا با ویژوال استدیو و زبان سی شارپ کار کردم، اونجا موقع اجرا با زدن F6 اگه اشتباه نکنم، خط به خط دستورات اجرا میشدن و ما میتونستیم مقدار یه متغیر رو ببینیم که در هنگام اجرا چه مقداری گرفته. آیا این امکان تو MQL ادیتور وجود داره؟
اگه آره و اگه ممکن هست لینک آموزشش رو بذارید ممنون میشم
سلام
یک سری امکانات وجود داری برای دیباگ کردن ،(دکمه پلی بالای متاادیتور)ولی نه به اون شکلی که شما مد نظرتون هست ،ویزوال استادیو برنامه بسیار قوی هست
سلام .میشه rates_total و prev_calculated رو به طور شفاف برام توضیح بدید؟
منظورم کارش توی این کد نیست.
سلام
rates_tota تعداد کل کندل ها است
prev_calculated هم کندل های که تا الان دیده شده توسط تابع OnCalculate
خیلی ممنون