Alert beillesztése2015-09-03T07:59:07+00:00

Címkézve: 

2 bejegyzés megtekintése - 1-2 / 2
  • Szerző
    Bejegyzés
  • loscsaba86
    Tag
    Bejegyzések száma: 1

    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);
      }
    //+------------------------------------------------------------------+
    
    Radulovic Attila
    Tag
    Bejegyzések száma: 646

    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.
2 bejegyzés megtekintése - 1-2 / 2

A hozzászóláshoz jelentkezz be!

Adhatok Neked még több ingyenes tartalmat?

Értesítelek hetente megjelenő új tartalmaimról.

Hozzájárulok, hogy az adatvédelmi nyilatkozat szerint biztonságosan kezeld megadott adataimat, valamint hasznos anyagokat és egyedi ajánlatokat küldj nekem termékeiddel, szolgáltatásaiddal kapcsolatban e-mailben