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: 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.
2 bejegyzés megtekintése - 1-2 / 2
  • Be kell jelentkezni a hozzászóláshoz.