Detecteer Nieuwe Kaarsen in MetaTrader 4: Tips en Tricks

Mike 2011.07.01 23:45 19 0 0
Bijlage

Iedere trader wil weten:

Hoe detecteer je een nieuwe kaars?

Het is eigenlijk heel simpel, vooral als je een nieuwe kaars wilt detecteren in de huidige tijdsperiode.

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // voer hier je code uit
  }
}

Maar hoe zit het met het detecteren van nieuwe kaarsen in andere tijdframes? Het is niet te moeilijk, maar het heeft wel wat beperkingen:

MT4 ondersteunt geen onBar-event, maar je kunt de starttijden in een array opslaan en deze tijden bij elke tick controleren. Als het de juiste tijd bereikt, voer je het nieuwe kaars-event uit. Dit betekent dat je, als je bijvoorbeeld een backtest uitvoert op een M5-tijdsperiode, ook de M6, M7... D1 evenementen kunt opvangen.

Waarom kun je alleen stijgende trends detecteren? De vraag is: hoe genereert MetaTrader tickdata? A1, A2, A3,...


Bij de D1-tijdsperiode wordt het moeilijker, omdat de week bijvoorbeeld begint op zondag om 20:45 (broker-specifiek) en het begin van de maand kan midden in de week vallen... enzovoort. Ik denk dat deze info niet zo relevant is, dus publiceer ik het niet...


Er is een onderwerp voor deze vraag, maar ik denk dat veel mensen de artikelen en fora niet lezen, dus heb ik deze code gepubliceerd.


Enkele uitleg:


In de init-functie vul je de tijd-array met de starttijden:

  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);

En in de start-functie controleer je of er voldoende tijd is verstreken, en dan voer je het event uit:

  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);
      }
    }
  }

Schrijf je code in:

void onTick() { 
}

en

void onBar(int period) {
}

Dat is alles, mensen!


Update 1.1: Bedankt aan WHRoeder voor de duidelijke code.

Lijst
Reactie 0