New bar event in EA

0
(0)
名前:
New bar event in EA
著者: (2011.07.01 16:45)
評価: 5
ダウンロード済み: 2839
ダウンロード:
New bar event in EA 1
ea_symr_newBar.mq4 (2.6 キロバイト) 意見
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.
That means if u run eg.: backtest on M5 timeframe u can catch the M6 M7...D1 events.
Why u can detect only upward trends? The answer is a question: how to generate tick data by metatrader? A1, A2, A3,...

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... 等.
I think this info isnt too relevant, so i dont publish it...

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(期間);
      }
    }
  }

 

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
{
New_Time_M1=iTime("EURUSD",PERIOD_M1,0); // New time set
New_Bar_M1=true; // A new bar detected

}

 

 

 

07.07.2011 22:44 alexander_zde

WHRoeder:
  1. 回[curIndex]-(MathMod(回[curIndex]/60,utils.periodIndexToPeriod(私)))*60

    for efficiency and readability, simplify

    回[curIndex]- MathMod(回[curIndex],utils.periodIndexToPeriod(私)*60);

  2. for efficiency and readability and to avoid unnecessary function calls, I'd replace the functions with an array and save results
    int utils.periodIndexToPeriod   = {
        PERIOD_M1,  PERIOD_M5,  PERIOD_M15, PERIOD_M30, PERIOD_H1,  期間_H4,
        PERIOD_D1,  PERIOD_W1,  PERIOD_MN1, 20,         50  };
    
    ために(int i=curIndex+1; 私<MAX; i++)
        int period  = utils.periodIndexToPeriod[私];
            seconds = period*60,
            time0   = times[curIndex] - MathMod(回[curIndex],秒);
        もしも (回[私] != time0) {
            回[私] = time0;
            onBar(期間);
    }   }

  3. And avoid unnecessary function calls with the simpler
    回[curIndex] = Time[0]; // = iTime(ヌル,0,0);

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[私];

  ログ("Elapsed : " + (GetTickCount()-始める)); // 2100 ms

  start = GetTickCount();

  ために(test=0; test<10000000; test++)
   ために(i=0; 私<MAX; i++)
    int value2 = utils2.periodIndexToPeriod(私);

  ログ("Elapsed : " + (GetTickCount()-始める)); // 8000 MS

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

  1. 回[curIndex]-(MathMod(回[curIndex]/60,utils.periodIndexToPeriod(私)))*60

    for efficiency and readability, simplify

    回[curIndex]- MathMod(回[curIndex],utils.periodIndexToPeriod(私)*60);

  2. for efficiency and readability and to avoid unnecessary function calls, I'd replace the functions with an array and save results
    int utils.periodIndexToPeriod   = {
        PERIOD_M1,  PERIOD_M5,  PERIOD_M15, PERIOD_M30, PERIOD_H1,  期間_H4,
        PERIOD_D1,  PERIOD_W1,  PERIOD_MN1, 20,         50  };
    
    ために(int i=curIndex+1; 私<MAX; i++)
        int period  = utils.periodIndexToPeriod[私];
            seconds = period*60,
            time0   = times[curIndex] - MathMod(回[curIndex],秒);
        もしも (回[私] != time0) {
            回[私] = time0;
            onBar(期間);
    }   }

  3. And avoid unnecessary function calls with the simpler
    回[curIndex] = Time[0]; // = iTime(ヌル,0,0);

この投稿は役に立ちました?

星をクリックして評価してください!

平均評価 0 / 5. 投票数: 0

これまでのところ投票はありません! この投稿を最初に評価してください.

この投稿が役に立たなかったことをお詫び申し上げます!

この投稿を改善しましょう!

この投稿を改善する方法を教えてください?



著者: 外国為替ウィキチーム
私たちは経験豊富な外国為替トレーダーのチームです [2000-2023] 自分の思いどおりに人生を生きることに専念している人. 私たちの主な目的は、経済的自立と自由を獲得することです, 私たちは自立可能なライフスタイルを実現する手段として、独学で外国為替市場での豊富な経験を積んできました。.