- يناير 2, 2014
- منشور من طرف: فريق ويكي الفوركس
- فئة: مستشار الخبراء
اسم: |
|
||
مؤلف: | symr (2011.07.01 16:45) | ||
تقييم: | 5 | ||
تم التنزيل: | 2839 | ||
تحميل: |
|
||
So many people wants:
How to detect new bar present. It is so simple especially if u want detect new bar in current timeframe, void start(){ static datetime tmp; لو (tmp!= Time[0]) { tmp = Time[0]; //do ur code here } } but what about the other timeframe event? It is not too hard but it has some restriction: MT4 is not support onBar event, but u can put the upward times into array and check the array times every tick, if it reached the right time, execute the new bar event. Until the D1 timeframe its more difficult because the week starting at eg.: الأحد 20:45 (Broker specific) and the start of the month can start in the middle of the week... إلخ. So there is a topic for this Q, but i think so many people dont read the articles and forums, so i published this code. Some explanation: in the init function u fill the time array with the starter times : curIndex = utils.periodToPeriodIndex(فترة()); مرات[curIndex] = Time[0]; ل(int i=curIndex+1; أنا<MAX; i++) مرات[أنا] = times[curIndex]- MathMod(مرات[curIndex],utils.periodIndexToPeriod(أنا)*60); and in the start function u checked is there enough time elapsed now, then execute the event لو (مرات[curIndex] != Time[0]) { مرات[curIndex] = Time[0]; onBar(فترة()); ل(int i=curIndex+1; أنا<MAX; i++) { int period = utils.periodIndexToPeriod(أنا), seconds = period*60, time0 = times[curIndex] - MathMod(مرات[curIndex],ثواني); لو (مرات[أنا] != time0) { مرات[أنا] = time0; onBar(period); } } }
Write ur code in void onTick() {
}
و void onBar(int period) { } That's all folks.
تحديث 1.1: Thx to WHRoeder for clear code |
|||
5 تعليقات لنشر تعليق جديد, لو سمحت تسجيل الدخول أو يسجل
Why don't you just use the iTime function?
http://docs.mql4.com/series/itime 27.11.2012 10:48 Master.Aurora
Why not use iTime("EURUSD",PERIOD_M1,0) على سبيل المثال. لو(New_Time_M1 != iTime("EURUSD",PERIOD_M1,0)) // Compare time --> new bar is born }
07.07.2011 22:44 alexander_zde
WHRoeder:
Thanks for this I am trying with custom timerames, if I set it up for a 3 hour candle for example eg 180 دقائق. When does this time start to count? eg form midnight every 3 hours or does it depend when the indicatoe is placed on the chart?
thanks again 05.07.2011 17:04 manuel_fx
أهلاً. thx for this ideas, ur right. 1. Accessing the arrays is more faster than use switch - case element. (in this example 4 مرات), some test: start = GetTickCount(); ل(test=0; test<10000000; test++) ل(i=0; أنا<MAX; i++) int value1 = utils.periodIndexToPeriod[أنا]; log("Elapsed : " + (GetTickCount()-start)); // 2100 ms start = GetTickCount(); ل(test=0; test<10000000; test++) ل(i=0; أنا<MAX; i++) int value2 = utils2.periodIndexToPeriod(أنا); log("Elapsed : " + (GetTickCount()-start)); // 8000 آنسة but how accsess this 10.000.000*MAX in a row? 😀 and i think much more readble switch - case options beacuse it is more similar the other rutins. Easily readable by someone who not a coder. 2. use local variable in loop save some times but not so much i think so test it: in half year backtest, where do some loop in onBar event, ur code done in 6006ms, my 5990ms on ~ 72Kbar event so its same 3. وقت[0] / iTime(باطل,0,0) does not affect the result. So i change the loop code for ur versions (more readable), but not change the array access rutin. btw thx a lot, i swear i will not publish a code, بعد 2 أكون, when i am too tired 😛 01.07.2011 20:27 symr
|