Sự kiện quán bar mới ở EA

0
(0)
Tên:
Sự kiện quán bar mới ở EA
Tác giả: mùa hè (2011.07.01 16:45)
Xếp hạng: 5
Đã tải xuống: 2839
Tải xuống:
New bar event in EA 1
of_symr_newBar.mq4 (2.6 Kb) Xem
So many people wants:

Cách phát hiện thanh mới hiện diện.

Nó rất đơn giản, đặc biệt nếu bạn muốn phát hiện thanh mới trong khung thời gian hiện tại,

bắt đầu vô hiệu(){
  tmp ngày giờ tĩnh;
  nếu như (tmp!= Thời gian[0]) {
    tmp = Thời gian[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.: Chủ nhật 20:45 (Broker specific) and the start of the month can start in the middle of the week... vân vân.
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(Giai đoạn());
  lần[curIndex] = Thời gian[0];
  vì(int i=curIndex+1; Tôi<MAX; i++)
    lần[Tôi] = times[curIndex]- MathMod(lần[curIndex],utils.periodIndexToPeriod(Tôi)*60);

and in the start function u checked is there enough time elapsed now, then execute the event

  nếu như (lần[curIndex] != Thời gian[0]) {
    lần[curIndex] = Thời gian[0];
    onBar(Giai đoạn());
    vì(int i=curIndex+1; Tôi<MAX; i++) {
      int period  = utils.periodIndexToPeriod(Tôi),
          seconds = period*60,
          time0   = times[curIndex] - MathMod(lần[curIndex],giây);
      nếu như (lần[Tôi] != time0) {
        lần[Tôi] = time0;
        onBar(Giai đoạn);
      }
    }
  }

 

Write ur code in

void onTick() { 
}

void onBar(int period) {
}

That's all folks.

 

Cập nhật 1.1: Thx to WHRoeder for clear code

5 bình luận Để gửi bình luận mới, Xin vui lòng đăng nhập hoặc đăng ký

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)

ví dụ.

nếu như(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. lần[curIndex]-(MathMod(lần[curIndex]/60,utils.periodIndexToPeriod(Tôi)))*60

    for efficiency and readability, simplify

    lần[curIndex]- MathMod(lần[curIndex],utils.periodIndexToPeriod(Tôi)*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,  PERIOD_H4,
        PERIOD_D1,  PERIOD_W1,  PERIOD_MN1, 20,         50  };
    
    vì(int i=curIndex+1; Tôi<MAX; i++)
        int period  = utils.periodIndexToPeriod[Tôi];
            seconds = period*60,
            time0   = times[curIndex] - MathMod(lần[curIndex],giây);
        nếu như (lần[Tôi] != time0) {
            lần[Tôi] = time0;
            onBar(Giai đoạn);
    }   }

  3. And avoid unnecessary function calls with the simpler
    lần[curIndex] = Thời gian[0]; // = iTime(VÔ GIÁ TRỊ,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 phút. 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

CHÀO.

thx for this ideas, ur right.

1. Accessing the arrays is more faster than use switch - case element. (in this example 4 lần), some test:

  start = GetTickCount();

  vì(test=0; test<10000000; test++)
   vì(i=0; Tôi<MAX; i++)
    int value1 = utils.periodIndexToPeriod[Tôi];

  log("Elapsed : " + (GetTickCount()-start)); // 2100 ms

  start = GetTickCount();

  vì(test=0; test<10000000; test++)
   vì(i=0; Tôi<MAX; i++)
    int value2 = utils2.periodIndexToPeriod(Tôi);

  log("Elapsed : " + (GetTickCount()-start)); // 8000 bệnh đa xơ cứng

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. Thời gian[0] / iTime(VÔ GIÁ TRỊ,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, sau đó 2 là, when i am too tired 😛

01.07.2011 20:27 mùa hè

  1. lần[curIndex]-(MathMod(lần[curIndex]/60,utils.periodIndexToPeriod(Tôi)))*60

    for efficiency and readability, simplify

    lần[curIndex]- MathMod(lần[curIndex],utils.periodIndexToPeriod(Tôi)*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,  PERIOD_H4,
        PERIOD_D1,  PERIOD_W1,  PERIOD_MN1, 20,         50  };
    
    vì(int i=curIndex+1; Tôi<MAX; i++)
        int period  = utils.periodIndexToPeriod[Tôi];
            seconds = period*60,
            time0   = times[curIndex] - MathMod(lần[curIndex],giây);
        nếu như (lần[Tôi] != time0) {
            lần[Tôi] = time0;
            onBar(Giai đoạn);
    }   }

  3. And avoid unnecessary function calls with the simpler
    lần[curIndex] = Thời gian[0]; // = iTime(VÔ GIÁ TRỊ,0,0);

Bài đăng này hữu ích như thế nào?

Bấm vào một ngôi sao để đánh giá nó!

Đánh giá trung bình 0 / 5. Số phiếu bầu: 0

Không có phiếu bầu cho đến nay! Hãy là người đầu tiên đánh giá bài viết này.

Chúng tôi xin lỗi vì bài đăng này không hữu ích cho bạn!

Hãy để chúng tôi cải thiện bài đăng này!

Hãy cho chúng tôi biết cách chúng tôi có thể cải thiện bài đăng này?



Tác giả: Nhóm ngoại hối Wiki
Chúng tôi là một nhóm gồm các Nhà giao dịch ngoại hối giàu kinh nghiệm [2000-2023] những người cống hiến để sống cuộc sống theo cách riêng của chúng ta. Mục tiêu chính của chúng tôi là đạt được sự độc lập và tự do về tài chính, và chúng tôi đã theo đuổi việc tự học và có được nhiều kinh nghiệm trong thị trường ngoại hối như là phương tiện của chúng tôi để đạt được lối sống bền vững.