Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Alert beillesztése
Címkézve: Alert DeMarker
-
SzerzőBejegyzés
-
Sziasztok!
Előrebocsátom, hogy csak nagyon alapfogalmaim vannak az MQL programozásról. Van nekem egy DeMarker indikátorom. Ebbe szeretnék Alertet tenni, hogy feldobja egy ablakban, amikor az indikátor átlépi alulról a 0.3 vagy felülről a 0.7 értéket.
Be is illesztettem az általam jónak vélt sort, de vagy az összes ticknél alertezik, ami elég gáz vagy pedig éppen semmit nem csinál, ha a program más részébe másolom át. A kérdésem, hogy hova kéne ezt beilleszteni és kell-e még kiegészítést tenni?
Alulra bemásolom a programkódot is, hogy lássátok mi az ami megvan nekem, de először ideírom, hogy én mit akarok beilleszteni, amikor a két szint közül valamelyik átlépésre kerül. Tehát ezeket a sorokat akarom hozzáírni:
if (DeMarkerBuffer[i] > 0.3 && DeMarkerBuffer[i+1] < 0.3) Alert („DeMarker átlépte felfelé a 0.3-as szintet”);
if (DeMarkerBuffer[i] < 0.7 && DeMarkerBuffer[i+1] > 0.7) Alert („DeMarker átlépte lefelé a 0.7-es szintet”);Köszi előre is a tippeket!
———————————————–
ÉS AKKOR ITT A DEMARKER PROGRAMKÓDJA://+------------------------------------------------------------------+ //| DeMarker.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 1 #property indicator_buffers 1 #property indicator_color1 DodgerBlue #property indicator_level1 0.3 #property indicator_level2 0.7 //---- input parameters extern int DeMarkerPeriod=14; //---- buffers double DeMarkerBuffer[]; double ExtMaxBuffer[]; double ExtMinBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 2 additional buffers are used for counting. IndicatorBuffers(3); SetIndexBuffer(0,DeMarkerBuffer); SetIndexBuffer(1,ExtMaxBuffer); SetIndexBuffer(2,ExtMinBuffer); //---- indicator line SetIndexStyle(0,DRAW_LINE); //---- name for DataWindow and indicator subwindow label short_name="DeM("+DeMarkerPeriod+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); //---- first values aren't drawn SetIndexDrawBegin(0,DeMarkerPeriod); //---- return(0); } //+------------------------------------------------------------------+ //| DeMarker | //+------------------------------------------------------------------+ int start() { double dNum; int i,nCountedBars; //---- insufficient data if(Bars<=DeMarkerPeriod) return(0); //---- bars count that does not changed after last indicator launch. nCountedBars=IndicatorCounted(); //---- ExtMaxBuffer[Bars-1]=0.0; ExtMinBuffer[Bars-1]=0.0; if(nCountedBars>2) i=Bars-nCountedBars-1; else i=Bars-2; while(i>=0) { dNum=High[i]-High[i+1]; if(dNum<0.0) dNum=0.0; ExtMaxBuffer[i]=dNum; dNum=Low[i+1]-Low[i]; if(dNum<0.0) dNum=0.0; ExtMinBuffer[i]=dNum; i--; } //---- initial zero if(nCountedBars<1) for(i=1; i<=DeMarkerPeriod; i++) DeMarkerBuffer[Bars-i]=0.0; //---- i=Bars-DeMarkerPeriod-1; if(nCountedBars>=DeMarkerPeriod) i=Bars-nCountedBars-1; while(i>=0) { dNum=iMAOnArray(ExtMaxBuffer,0,DeMarkerPeriod,0,MODE_SMA,i)+ iMAOnArray(ExtMinBuffer,0,DeMarkerPeriod,0,MODE_SMA,i); if(dNum!=0.0) DeMarkerBuffer[i]=iMAOnArray(ExtMaxBuffer,0,DeMarkerPeriod,0,MODE_SMA,i)/dNum; else DeMarkerBuffer[i]=0.0; i--; } return(0); } //+------------------------------------------------------------------+
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.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.