Proszę o pomoc przy modyfikacji wskaźnika.

O jezykach programowania w platformach i nie tylko.
srebrnooki
Uczestnik
Uczestnik
Posty: 4
Rejestracja: 13 lis 2010, 21:16

Proszę o pomoc przy modyfikacji wskaźnika.

Nieprzeczytany post autor: srebrnooki »

Tak jak w temacie. Wskaźnik to Market Flow Analysis Method (MFAM) Indicator for Price Action dosytępny tu : http://codebase.mql4.com/7343
Próbuje uzyskać trzy ostatnie odczyty HH (Highest High) i LL (Lowest Lows) na wykresie pogrubione linie. Może komuś się to uda bo ja nie daje rady.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Proszę o pomoc przy modyfikacji wskaźnika.

Nieprzeczytany post autor: personov »

Kod: Zaznacz cały

double HH = iCustom(Symbol(),Period(),"MktFlwAnlMth",4,0);
double LL = iCustom(Symbol(),Period(),"MktFlwAnlMth",6,0);
Ostatnia cyfra w nawiasie oznacza którą wartość wstacz chcesz mieć. 0 to świeca aktualna, 1 to świeca poprzednia itd.
Solą życia jest kasa.

srebrnooki
Uczestnik
Uczestnik
Posty: 4
Rejestracja: 13 lis 2010, 21:16

Re: Proszę o pomoc przy modyfikacji wskaźnika.

Nieprzeczytany post autor: srebrnooki »

Chodzi o zmianę kodu w taki sposób by wypisywały się trzy ostatnie różne wartości HH ni zależnie od numeru świeczki

Kod: Zaznacz cały

//+----------------------------------------+
//|                  BREW_MktFlwAnlMth.mq4 |
//| Market Flow Analysis Method            |
//| http://www.forexforprofits.com         |
//+----------------------------------------+
#property  copyright "Copyright © 2011, Brewmanz"
#property link      "http://www.metaquotes.net/"

//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Lime
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_color2 Cyan
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
#property indicator_color3 Red
#property indicator_style3 STYLE_SOLID
#property indicator_width3 2
#property indicator_color4 Magenta
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1

#property indicator_color5 Lime
#property indicator_style5 STYLE_SOLID
#property indicator_width5 2
#property indicator_color6 Cyan
#property indicator_style6 STYLE_SOLID
#property indicator_width6 1
#property indicator_color7 Red
#property indicator_style7 STYLE_SOLID
#property indicator_width7 2
#property indicator_color8 Magenta
#property indicator_style8 STYLE_SOLID
#property indicator_width8 1

//#include <LibUtil.mqh>

//---- input parameters
extern string Comment1="Set UseSeparateChartAges to true to show how Highest High etc Bar Aging is working";
extern bool UseSeparateChartAges=false;
extern string Comment2="Set MaxAge to limit how long a Highest High etc is valid for";
extern int  MaxAge=999;

//---- display buffers
double buff_BarsSinceLastHH[];
double buff_BarsSinceHHAfterLL[];
double buff_BarsSinceLastLL[];
double buff_BarsSinceLLAfterHH[];

double buff_HH[];
double buff_HAfterL[];
double buff_LL[];
double buff_LAfterH[];

double buff_DBG[];

//---- work buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   string short_name;
   IndicatorBuffers(8);
   IndicatorDigits(Digits);
//---- indicator line

   SetIndexBuffer(0,buff_BarsSinceLastHH);
   SetIndexBuffer(1,buff_BarsSinceHHAfterLL);
   SetIndexBuffer(2,buff_BarsSinceLastLL);
   SetIndexBuffer(3,buff_BarsSinceLLAfterHH);
   SetIndexBuffer(4,buff_HH);
   SetIndexBuffer(5,buff_HAfterL);
   SetIndexBuffer(6,buff_LL);
   SetIndexBuffer(7,buff_LAfterH);
   if(UseSeparateChartAges)
   {
      SetIndexStyle( 0,DRAW_LINE);
      SetIndexStyle( 1,DRAW_LINE);
      SetIndexStyle( 2,DRAW_LINE);
      SetIndexStyle( 3,DRAW_LINE);
      SetIndexStyle( 4,DRAW_NONE);
      SetIndexStyle( 5,DRAW_NONE);
      SetIndexStyle( 6,DRAW_NONE);
      SetIndexStyle( 7,DRAW_NONE);
   }
   else
   {
      SetIndexStyle( 0,DRAW_NONE);
      SetIndexStyle( 1,DRAW_NONE);
      SetIndexStyle( 2,DRAW_NONE);
      SetIndexStyle( 3,DRAW_NONE);
      SetIndexStyle( 4,DRAW_LINE);
      SetIndexStyle( 5,DRAW_LINE);
      SetIndexStyle( 6,DRAW_LINE);
      SetIndexStyle( 7,DRAW_LINE);
   }

//---- name for DataWindow and indicator subwindow label
   short_name="MFAM("
   +")";

   IndicatorShortName(""+short_name);
   SetIndexLabel(0,"AgeHH");
   SetIndexLabel(1,"HH_AfterLL");
   SetIndexLabel(2,"AgeLL");
   SetIndexLabel(3,"LL_AfterHH");
   SetIndexLabel(4,"HH");
   SetIndexLabel(5,"HAfterL");
   SetIndexLabel(6,"LL");
   SetIndexLabel(7,"LAfterH");
//----
//   SetIndexDrawBegin(0,MaPeriod);
//----
   return(0);
}
//+------------------------------------------------------------------+
int start()
{

//to moje dokonanie:
double H1,H2,H3,L1,L2,L3,ToLastHH,ToHHSinceLL,ToLastLL,ToLLSinceHH=0;
//jeszcze trochę dalej



   int ix,ixLimit,counted_bars=IndicatorCounted();
//----
   if(counted_bars>0)counted_bars--;
   ixLimit = Bars-counted_bars-1;
//----
   for(ix=ixLimit;ix>=0;ix--)
   {
      if(ix==Bars-1)
      {
         // FirstEverBar
         buff_BarsSinceLastHH   [ix] = 0;
         buff_BarsSinceHHAfterLL[ix] = 0;
         buff_BarsSinceLastLL   [ix] = 0;
         buff_BarsSinceLLAfterHH[ix] = 0;
         continue;
      }

//--- New Bar?      
      static datetime NewBarTimeCheck = 0;
      bool IsNewBar = false;
      if(NewBarTimeCheck!=Time[ix])
      {  
         IsNewBar = true;
         NewBarTimeCheck = Time[ix];
      }

      // up age of all bars
      int barsToLastHH    = 1 + buff_BarsSinceLastHH   [ix+1];
      int barsToHHSinceLL = 1 + buff_BarsSinceHHAfterLL[ix+1];
      int barsToLastLL    = 1 + buff_BarsSinceLastLL   [ix+1];
      int barsToLLSinceHH = 1 + buff_BarsSinceLLAfterHH[ix+1];

      // note any extreme price action
      if(High[ix] > High[ix+barsToLastHH])
     
         barsToLastHH = 0;
      

               
            
      if(High[ix] > High[ix+barsToHHSinceLL])
         barsToHHSinceLL = 0;
         
         ToHHSinceLL = High[ix+barsToHHSinceLL];
         
      if(Low[ix] < Low[ix+barsToLastLL])
          
         barsToLastLL = 0;
  

      if(Low[ix] < Low[ix+barsToLLSinceHH])
         barsToLLSinceHH = 0;
       ToLLSinceHH = Low[ix+barsToLLSinceHH]; 
     
         
      // check if Max Age has been exceeded
      if(barsToLastHH    > MaxAge)
         barsToLastHH    = iHighest(NULL, Period(), MODE_HIGH, MaxAge, ix) - ix;
      if(barsToHHSinceLL > MaxAge)
         barsToHHSinceLL = iHighest(NULL, Period(), MODE_HIGH, MaxAge, ix) - ix;
      if(barsToLastLL    > MaxAge)
         barsToLastLL    = iLowest (NULL, Period(), MODE_LOW,  MaxAge, ix) - ix;
      if(barsToLLSinceHH > MaxAge)
         barsToLLSinceHH = iLowest (NULL, Period(), MODE_LOW,  MaxAge, ix) - ix;
      
      // check new HH then we have new Active Lo created
      switch(barsToLastHH)
      {
      case 0:
        


//to moje dokonanie:   
      H3=H2;
         H2=H1;
         H1=High[ix+barsToLastHH];



         barsToLastLL = barsToLLSinceHH;
         ToLastLL = ToLLSinceHH;
        
         break;
      case 1:
      
         barsToLLSinceHH = 0;
           
      
         break;
         
      }
 
 
    
      // check new LL then we have new Active Hi created
      switch(barsToLastLL)
      {
      case 0:
 
    
  //to moje dokonanie:          
H3=H2;
     H2=H1;
         H1=High[ix+barsToLastHH];
             barsToLastHH = barsToHHSinceLL;
       
         ToLastHH = ToHHSinceLL;
   
           
         break;
      case 1:
      
         barsToHHSinceLL = 0;
   
     
         break;
      }
 
  
      buff_BarsSinceLastHH   [ix] = barsToLastHH;
      buff_BarsSinceHHAfterLL[ix] = barsToHHSinceLL;
      buff_BarsSinceLastLL   [ix] = barsToLastLL;
      buff_BarsSinceLLAfterHH[ix] = barsToLLSinceHH;
        
      buff_HH     [ix] = High[ix + barsToLastHH];
      buff_HAfterL[ix] = High[ix + barsToHHSinceLL];
      buff_LL     [ix] = Low [ix + barsToLastLL];
      buff_LAfterH[ix] = Low [ix + barsToLLSinceHH];
   }


//to moje dokonanie:
Comment( 
   "\n","  ", DoubleToStr( H1,5),"  ", DoubleToStr( H2,5),"  ", DoubleToStr( H3,5),
      "\n","  ", DoubleToStr( L1,5),"  ", DoubleToStr( L2,5),"  ", DoubleToStr( L3,5),
   "\n","HH: ", DoubleToStr( ToLastHH,5),"  ",barsToLastHH,
    "\n","HAfterL: ",DoubleToStr(ToHHSinceLL,5),"  ",barsToHHSinceLL,
     "\n","LL: ",DoubleToStr(ToLastLL,5),"  ",barsToLastLL,
      "\n","LAfterH: ",DoubleToStr(ToLLSinceHH,5),"  ",barsToLLSinceHH
      )
;
//----
   return(0);
}
//+------------------------------------------------------------------+
Oto moje dokonania w tym zakresie tylko że nie zawsze działają poprawnie. Zależy od tego jak LL i ActiveL się zachowują. W każdym badź razie przybliża to co chcę osiągnąć. H!, H2, H3 jako trzy ostatnie różne wartość HH w kolejności od najświeższej do najstarszej. I to samo dla LL

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Proszę o pomoc przy modyfikacji wskaźnika.

Nieprzeczytany post autor: personov »

W czasie rzeczywistym to nie problem.
Jeśli poprzednie HH jest różne od HHaktualnego to zapisujesz.

Kod: Zaznacz cały

double szczyt1=0;
double szczyt2=0;
double szczyt3=0;
void start()
{ double HH0=iCustom(Symbol(),Period(),"MktFlwAnlMth",4,0);
  double HH1=iCustom(Symbol(),Period(),"MktFlwAnlMth",4,1);
if(HH0!=HH1){szczyt3=szczyt2;szczyt2=szczyt1;szczyt1=HH0;}
Ale jeśli chciałbyś na dzieńdobry, zaraz po odpaleniu wskaźnika mieć już wszystkie trzy wartości - to nie wiem.
Solą życia jest kasa.

srebrnooki
Uczestnik
Uczestnik
Posty: 4
Rejestracja: 13 lis 2010, 21:16

Re: Proszę o pomoc przy modyfikacji wskaźnika.

Nieprzeczytany post autor: srebrnooki »

Tej idei mi brakowało. Sam bym się tłukł i nie wpadł na to. Teraz mam z czym pracować. Dzięki.

-- Dodano: ndz 14-10-2012, 23:31 --

A jednak nie działa to prawidłowo. Odczytuje wskazania ale zawsze tylko określoną kolejność. Tzn tylko rosnące szczyty. Jak jest wyżej(szczyt3), niżej(szczyt2),wyżej(szczyt1) to nie odczytuje tego prawidłowo. Wima leży w wskaźniku ale nie jestem w stanie zorientować się gdzie. Domyślam się że chodzi o zmianę HH w chwili gdy nowe LL zachodzi. Ale dokładnie dlaczego tak jest nie wiem.
Tak więc prośba cały czas aktualna.

ODPOWIEDZ