Laman utama Perdagangan Sistem Siaran

Cara Mengesan Bar Baru Dalam EA MetaTrader 4

Lampiran
10370.zip (734 bytes, Muat turun 0 kali)

Ramai trader bertanya:

Bagaimana cara mengesan bar baru yang muncul?

Ia sangat mudah, terutamanya jika anda ingin mengesan bar baru dalam timeframe semasa.

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // masukkan kod anda di sini
  }
}

Namun, bagaimana dengan acara timeframe yang lain? Ia tidak terlalu sukar tetapi ada beberapa batasan:

MT4 tidak menyokong acara onBar, tetapi anda boleh menyimpan waktu ke dalam array dan semak waktu tersebut pada setiap tick. Jika sudah sampai waktu yang tepat, jalankan acara bar baru.

Contohnya, jika anda menjalankan backtest pada timeframe M5, anda dapat menangkap acara M6, M7,... hingga D1.

Kenapa anda hanya dapat mengesan trend menaik? Jawapannya adalah: bagaimana untuk menghasilkan data tick melalui MetaTrader? A1, A2, A3,...

Sehingga timeframe D1 menjadi lebih sukar kerana minggu bermula pada waktu tertentu contohnya: Ahad 20:45 (bergantung kepada broker) dan permulaan bulan juga boleh bermula di tengah minggu... dan sebagainya.
Saya rasa info ini tidak terlalu relevan, jadi saya tidak menerbitkannya...

Jadi, ada topik untuk soalan ini, tetapi saya rasa ramai orang tidak membaca artikel dan forum, jadi saya menerbitkan kod ini.

Beberapa penjelasan:
Dalam fungsi init, anda mengisi array waktu dengan waktu permulaan:

  curIndex = utils.periodToPeriodIndex(Period());
  times[curIndex] = Time[0];
  for(int i=curIndex+1; i<MAX; i++)
    times[i] = times[curIndex] - MathMod(times[curIndex],utils.periodIndexToPeriod(i)*60);

Dalam fungsi start, anda periksa sama ada sudah cukup waktu berlalu, kemudian jalankan acara tersebut.

  if (times[curIndex] != Time[0]) {
    times[curIndex] = Time[0];
    onBar(Period());
    for(int i=curIndex+1; i<MAX; i++) {
      int period = utils.periodIndexToPeriod(i),
          seconds = period*60,
          time0 = times[curIndex] - MathMod(times[curIndex],seconds);
      if (times[i] != time0) {
        times[i] = time0;
        onBar(period);
      }
    }
  }

Jadi, tuliskan kod anda dalam:

void onTick() { 
}

dan

void onBar(int period) {
}

Itu sahaja, rakan-rakan.

Update 1.1: Terima kasih kepada WHRoeder untuk kod yang jelas.

Siaran berkaitan

Komen (0)