Logic for using ¨Footprints Indicator¨ Cluster Box

Aira MJ
646
Aira MJ  

Hi,

I want to apply the logic to an EA with the indicator attached to check for the previous 1,2 o 3 candles and where the maximum was in that candle, top or bottom and what type of candle, providing the maximum an X trigger value. Could I use iCustoms for it?


It would work like an OrderFlow Indicator with signal.


ClusterBox

Documentation on MQL5: Technical Indicators / iCustom
Documentation on MQL5: Technical Indicators / iCustom
  • www.mql5.com
[in]  Custom indicator name. If the name starts with the reverse slash '\', the EX5 indicator file is searched for relative to the MQL5\Indicators indicator root directory. Thus, when calling FirstIndicator"...), the indicator is downloaded as MQL5\Indicators\FirstIndicator.ex5. If the path contains no file, the error 4802...
William Roeder
25075
William Roeder  
YThi MJ: Could I use iCustoms for it?

That indicator has no buffers, so no.

Aira MJ
646
Aira MJ  
William Roeder:

That indicator has no buffers, so no.

Buffers could be added?

I have just seen how it works and I discovered buffers today.

  • Alert for maximum values ​​at previous 1 or 2 bars
  • At the start of the bar, first third / Bulls will need to have the maximum values ​​on the bottom and Bears will need to have the maximum values ​​on the top /
Buy Bulls and Sell Bears signals.


Maybe adding a time for previous bar and dividing it by 2, selecting the first third and seeing if the maximum value was there meeting a Higher Than from the 5 groups. Then getting a signal for yes or not, meaning Buy for a Bull Candle and Sell for a Bear Candle. The data is there. 


Something like: Bar Time /2, Selecting 1st half, if i_minVolumeLevelX, Alert.

Still, I do not know how to add it. 

Aira MJ
646
Aira MJ  
I am trying to code it. Can anybody tell me how to select the First Half of a Bar?
William Roeder
25075
William Roeder  
Wait until the bar is half formed, read it.
Aira MJ
646
Aira MJ  
William Roeder:
Wait until the bar is half formed, read it.

Previous bar first half

Aira MJ
646
Aira MJ  

Two Experts already have not been able to give it a signal. Is there anybody that knows how to do it?

I guess you might say, 'Pay a Freelance' but I do not want to pay a Freelance right now, nor do I know if it might be really possible.

Aira MJ
646
Aira MJ  

It should be in here. I need to divide the bar information in 2 parts and give it a signal. I have copied it from ShowText but now I do not know how to convert it into what I need.


It should be like: If highest value is in First Half of bar and First Half is bigger than Second Half, then Signal.


I am attaching the document translated to English and have pasted the bit of code that should lead to it. 

void ShowSignal(int barIndex,double lowPrice,int arraySize)
  {
   if(!g_isShowInfo)
      return;

   for(int i=0; i<arraySize; i+=i_pointsInBox)
     {
      //--- Is the volume of the level large enough?
      int volumeLevel=GetVolumeLevel(i);
      if(volumeLevel<0)
         continue;

      //--- Display volumes
      double price=lowPrice+i*g_tickSize;
      ShowArrow(i,Time[barIndex],price,IntegerToString(g_volumePriceArray[i]),g_volumeLevelsColor[volumeLevel].levelColor);
     }
  }
Files:
Aira MJ
646
Aira MJ  

I am trying to shape it from this to give it 2 signals:

   double highPrice= CastPriceToCluster(High[iHighest(NULL,0,MODE_HIGH)]);
   double lowPrice = CastPriceToCluster(Low[iLowest(NULL,0,MODE_LOW)]);
void PreviousBarTotals(int limit,double &lowPrice,int &arraySize)
  {
//--- Opening a tick history file
   bool fileClose = false;
   int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);
   if(hTicksFile<1)
      fileClose=true;

//--- Search for the first tick belonging to the limit bar or any later bar
   TickStruct tick;
   tick.time= Time[limit];
   tick.bid = Open[limit];
   while(!IsStopped() && !fileClose)
     {
      if(!IsReadTimeAndBidAskOfTick(hTicksFile,tick))
         return;

      if(tick.time>=Time[limit])
         break;
     }

//--- Displaying data
   datetime extremeTime=Time[0]+PeriodSeconds();
   while(tick.time<extremeTime && tick.time!=0)
     {
      int barIndex=iBarShift(NULL,0,tick.time);
      SumDataForOneBar(hTicksFile,tick,lowPrice,arraySize,fileClose);
      SumDataFirstHalf(hTicksFile,tick,lowPrice,arraySize,fileClose);
      SumDataSecondHalf(hTicksFile,tick,lowPrice,arraySize,fileClose);
      //ShowBarHistogramms(barIndex,lowPrice,arraySize);
     }

   if(!fileClose)
      FileClose(hTicksFile);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SumDataForOneBar(int hTicksFile,TickStruct &tick,double &lowPrice,int &arraySize,bool &fileClose)
  {
//--- Reading ticks belonging to one candlestick
   int ticksCount=1;
   g_ticksPrice[0]=CastPriceToCluster(tick.bid);
   if(!fileClose)
      ReadTicksFromFile(hTicksFile,PeriodSeconds(),tick,ticksCount,fileClose);

   if(fileClose) // This is not an error - else is not needed, because after ReadTicksFromFile execution, fileClose may change
      AddDataFromBuffer(PeriodSeconds(),tick,ticksCount);
 
   ArrayMaximum(g_ticksPrice,ticksCount);

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SumDataFirstHalf(int hTicksFile,TickStruct &tick,double &lowPrice,int &arraySize,bool &fileClose)
 {
//--- Reading ticks belonging to one candlestick
   int ticksCount=1;
   g_ticksPrice[0]=CastPriceToCluster(tick.bid);
   if(!fileClose)
      ReadTicksFromFile(hTicksFile,(PeriodSeconds()/2),tick,ticksCount,fileClose);

   if(fileClose) // This is not an error - else is not needed, because after ReadTicksFromFile execution, fileClose may change
      AddDataFromBuffer((PeriodSeconds()/2),tick,ticksCount);

   ArrayMaximum(g_ticksPrice,ticksCount);

  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SumDataSecondHalf(int hTicksFile,TickStruct &tick,double &lowPrice,int &arraySize,bool &fileClose)
  {
//--- Reading ticks belonging to one candlestick
   int ticksCount=1;
   g_ticksPrice[0]=CastPriceToCluster(tick.bid);
   if(!fileClose)
      ReadTicksFromFile(hTicksFile,(PeriodSeconds()-(PeriodSeconds()/2)),tick,ticksCount,fileClose);

   if(fileClose) // This is not an error - else is not needed, because after ReadTicksFromFile execution, fileClose may change
      AddDataFromBuffer((PeriodSeconds()-(PeriodSeconds()/2)),tick,ticksCount);

   ArrayMaximum(g_ticksPrice,ticksCount);

  }
But I do not know how to activate them:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Signal(int,double,int arraySize)
  {
   for(int i=0; i<arraySize; i+=i_pointsInBox)
     {
      if(SumDataFirstHalf>SumDataSecondHalf)&&(SumDataFirstHalf==SumDataForOneBar)
         strong[];
      if(SumDataSecondHalf>SumDataFirstHalf)&&(SumDataSecondHalf==SumDataForOneBar)
         weak[];
     }
  }
Keith Watford
Moderator
31179
Keith Watford  

Do not double post!

I have deleted your other post concerning this same indicator.

Aira MJ
646
Aira MJ  
Keith Watford:

Do not double post!

I have deleted your other post concerning this same indicator.

Ok. I did it because there is more people focused on offering help.