النتائج 1 إلى 12 من 12
- 13-02-2022, 02:38 PM #1
مشكلة في صنع loop في mql5 سهلة (للخبراء)
السلام عليكم
بصنع مؤشر بلغة mql5 حاليا وواجهتني مشكلة في صنع Loop
الفكرة باختصار اني عايز احط 40 شرط في المؤشر وهم:
1- مستوى الديماركر في شمعة رقم 0 اكبر من 20
2- مستوى الديماركر في شمعة رقم 1 اكبر من 20
3- مستوى الديماركر في شمعة رقم 2 اكبر من 20
.... وهكذا لحد شمعة رقم 40
فبدلا من كتابة 40 سطر؛ اريد اختزال هذه الشروط كلها في شرط واحد فقط عن طريق الLoop
الكود المرفق صحيح لكن لما بشغله بيحققلي الشرط الاول فقط بدون باقي الشروط
حد عنده فكرة الكود ده يتصحح ازاي؟
كود PHP://Indicator Buffer 1
bool conditionMet = false;
for (int j = 0; j <= 40; j++) {
if(DEM[j+i] > 20
)
{
conditionMet = true;
// Break out of the loop.
break;
}
}
if (conditionMet) {
Buffer1[i] = Low[i]; //Set indicator value at Candlestick Low
if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy"); //Alert on next bar open
time_alert = Time[1];
}
else
{
Buffer1[i] = EMPTY_VALUE;
}
- 14-02-2022, 09:56 AM #2
أين خبراء المنتدى للمساعدة؟
- 14-02-2022, 10:02 AM #3
المؤشر المرفق به شروط عديدة هل بالامكان تعديله واختصار هذه الشروط في شرط واحد من خلال Loop؟
- 15-02-2022, 04:05 AM #4
- 15-02-2022, 07:01 AM #5
The DeMax(i) is calculated:
If high(i) > high(i-1) , then DeMax(i) = high(i)-high(i-1), otherwise DeMax(i) = 0
The DeMin(i) is calculated:
If low(i) < low(i-1), then DeMin(i) = low(i-1)-low(i), otherwise DeMin(i) = 0
The value of the DeMarker is calculated as:
DMark(i) = SMA(DeMax, N)/(SMA(DeMax, N)+SMA(DeMin, N))
Where:
SMA - Simple Moving Average;
N - the number of periods used in the calculation.
==
مراجعة معادلات هذا المؤشر
يشبه ال rsi في رسمته
- 15-02-2022, 07:18 PM #6
- 16-02-2022, 03:49 PM #7
الكود ده قبل اللوب والتعديل:
كود:#include <stdlib.mqh> #include <stderror.mqh> //--- indicator settings #property indicator_chart_window #property indicator_buffers 2 #property indicator_type1 DRAW_ARROW #property indicator_width1 3 #property indicator_color1 0xFFAA00 #property indicator_label1 "Buy" #property indicator_type2 DRAW_ARROW #property indicator_width2 3 #property indicator_color2 0xFB00FF #property indicator_label2 "Sell" //--- indicator buffers double Buffer1[]; double Buffer2[]; double myPoint; //initialized in OnInit void myAlert(string type, string message) { if(type == "print") Print(message); else if(type == "error") { Print(type+" | loop @ "+Symbol()+","+IntegerToString(Period())+" | "+message); } else if(type == "order") { } else if(type == "modify") { } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { IndicatorBuffers(2); SetIndexBuffer(0, Buffer1); SetIndexEmptyValue(0, EMPTY_VALUE); SetIndexArrow(0, 241); SetIndexBuffer(1, Buffer2); SetIndexEmptyValue(1, EMPTY_VALUE); SetIndexArrow(1, 242); //initialize myPoint myPoint = Point(); if(Digits() == 5 || Digits() == 3) { myPoint *= 10; } 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[]) { int limit = rates_total - prev_calculated; //--- counting from 0 to rates_total ArraySetAsSeries(Buffer1, true); ArraySetAsSeries(Buffer2, true); //--- initial zero if(prev_calculated < 1) { ArrayInitialize(Buffer1, EMPTY_VALUE); ArrayInitialize(Buffer2, EMPTY_VALUE); } else limit++; //--- main loop for(int i = limit-1; i >= 0; i--) { if (i >= MathMin(5000-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation //Indicator Buffer 1 if(iDeMarker(NULL, PERIOD_CURRENT, 14, i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 1+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 2+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 3+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 4+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 5+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 6+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 7+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 8+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 9+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 10+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 11+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 12+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 13+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 14+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 15+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 16+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 17+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 18+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 19+i) > 0.20 && iDeMarker(NULL, PERIOD_CURRENT, 14, 20+i) > 0.20 ) { Buffer1[i] = Low[i]; //Set indicator value at Candlestick Low } else { Buffer1[i] = EMPTY_VALUE; } //Indicator Buffer 2 if(iDeMarker(NULL, PERIOD_CURRENT, 14, i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 1+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 2+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 3+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 4+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 5+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 6+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 7+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 8+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 9+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 10+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 11+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 12+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 13+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 14+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 15+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 16+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 17+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 18+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 19+i) < 0.80 && iDeMarker(NULL, PERIOD_CURRENT, 14, 20+i) < 0.80 ) { Buffer2[i] = High[i]; //Set indicator value at Candlestick High } else { Buffer2[i] = EMPTY_VALUE; } } return(rates_total); } //+------------------------------------------------------------------+
كود:#include <stdlib.mqh> #include <stderror.mqh> //--- indicator settings #property indicator_chart_window #property indicator_buffers 2 #property indicator_type1 DRAW_ARROW #property indicator_width1 3 #property indicator_color1 0xFFAA00 #property indicator_label1 "Buy" #property indicator_type2 DRAW_ARROW #property indicator_width2 3 #property indicator_color2 0xFB00FF #property indicator_label2 "Sell" //--- indicator buffers double Buffer1[]; double Buffer2[]; double myPoint; //initialized in OnInit void myAlert(string type, string message) { if(type == "print") Print(message); else if(type == "error") { Print(type+" | loop @ "+Symbol()+","+IntegerToString(Period())+" | "+message); } else if(type == "order") { } else if(type == "modify") { } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { IndicatorBuffers(2); SetIndexBuffer(0, Buffer1); SetIndexEmptyValue(0, EMPTY_VALUE); SetIndexArrow(0, 241); SetIndexBuffer(1, Buffer2); SetIndexEmptyValue(1, EMPTY_VALUE); SetIndexArrow(1, 242); //initialize myPoint myPoint = Point(); if(Digits() == 5 || Digits() == 3) { myPoint *= 10; } 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[]) { int limit = rates_total - prev_calculated; //--- counting from 0 to rates_total ArraySetAsSeries(Buffer1, true); ArraySetAsSeries(Buffer2, true); //--- initial zero if(prev_calculated < 1) { ArrayInitialize(Buffer1, EMPTY_VALUE); ArrayInitialize(Buffer2, EMPTY_VALUE); } else limit++; //--- main loop for(int i = limit-1; i >= 0; i--) { if (i >= MathMin(5000-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation //Indicator Buffer 1 for(int j = 0; j<= 20; j++) { if(iDeMarker(NULL, PERIOD_CURRENT, 14, j + i) > 0.20) { Buffer1[i] = Low[i]; //Set indicator value at Candlestick Low } else { Buffer1[i] = EMPTY_VALUE; } } //Indicator Buffer 2 for(int jj = 0; jj<= 20; jj++) { if(iDeMarker(NULL, PERIOD_CURRENT, 14, jj + i) < 0.80) { Buffer2[i] = High[i]; //Set indicator value at Candlestick High } else { Buffer2[i] = EMPTY_VALUE; } } } return(rates_total); } //+------------------------------------------------------------------+
- 17-02-2022, 06:53 PM #8
منتظر الرد يا اخوة
- 18-02-2022, 11:11 AM #9
صعب جدا اخي احد يفهم مطلوبك
الصور قد تساعد
- 27-03-2022, 12:14 AM #10
- 03-04-2022, 10:28 PM #11
باختصار : اللوب عندك يمشي للاخر و يعطيك اخر قيمة متحققة على اخر شمعة
في الكود الاول التشييك يتم على كل الشمعات عشان هيك بطلع النتيجة عندك صح
في الكود الثاني
فرضا انت بتشيك على فرضا 5 شمعات
يتم تحقق اللوب على الشمعة الاولى و ياخذ القيمة
عند التشييك على الشمعة اللاحقة ( الثانية ) يقوم بالتشييك مع اهمال القيمة المتحققة في الشمعة الاولى ( خربت الدنيا )
اتمنى هذا التوضيح يساعدك في فهم الامر .
و اذا كان في فهمي لكودك خطأ ارجو المعذرة " جاد الفقير بما عنده "
- 06-08-2022, 03:22 PM #12