Radulovic Attila
Tag
Bejegyzések száma: 653

A kondícióid jók, csak így használd (már ha kizárólag lezárt értékeket akarsz összehasonlítani, és gyertyánként csak egyszer):

if (DeMarkerBuffer[1] > 0.3 && DeMarkerBuffer[2] < 0.3) Alert ("DeMarker átlépte felfelé a 0.3-as szintet");
if (DeMarkerBuffer[1] < 0.7 && DeMarkerBuffer[2] > 0.7) Alert ("DeMarker átlépte lefelé a 0.7-es szintet");

Helyileg a második while lefutása után rakd be a kódot.

A többszöri jelzés azért történik, mert ugye most minden tickben teljesül a feltétel. Ezért be kell őt „zárni” egy időbeli ellenőrzéshez, hogy gyertyánként csak egyszer fusson le.

Kód fejlécébe (pl. double ExtMinBuffer[]; sor alá):

int
  NextRun = 0;

Init végére (pl. SetIndexDrawBegin(0,DeMarkerPeriod); alá):

NextRun = int(Time[0]) + Period() * 60;

A második while után:

if (int(TimeCurrent()) >= NextRun) {

   if (DeMarkerBuffer[1] > 0.3 && DeMarkerBuffer[2] < 0.3) Alert ("DeMarker átlépte felfelé a 0.3-as szintet");
   if (DeMarkerBuffer[1] < 0.7 && DeMarkerBuffer[2] > 0.7) Alert ("DeMarker átlépte lefelé a 0.7-es szintet");

   NextRun = int(Time[0]) + Period() * 60;
}
  • A chartra helyezéskor (vagy idősíkváltáskor) az történik majd, hogy az aktuális gyertya + periódusnyi másodpercre állítódik a következő futás időpontja. Vagyis legközelebb csak az aktuális gyertya lezárulása után érkezhet jelzés legjobb esetben.
  • Minden gyertya befejezésekor lefut az ellenőrzés az (akkor) két utolsó lezárt gyertyával kapcsolatban.
  • Az ellenőrzés után kijelöljük a következő futás időpontját, így akadályozva meg a folyamatos alerteket.
  • Ez egy gyors megoldás, de a célnak tökéletesen megfelel.