Download MetaTrader 5

Help needed - line of code not working as intended.

To add comments, please log in or register
fin_kroon1
22
fin_kroon1  

Hi,

 

I have an indicator with various parameters. But one line isn't functioning as intended:

 

MathAbs(iHigh(NULL, PERIOD_M1, iHighest(NULL, PERIOD_M1, MODE_HIGH, 11, 0)) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iClose(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, iLowest(NULL, PERIOD_M1, MODE_LOW, 3, 0)) * 0.95) //Ensures a minimum of 1:0.95 risk/reward ratio assuming high of past 11 bars as t.p. and low of past 3 bars as s.l. in long position opened at close of candle just painted

 

Is there a mistake in here I have missed or using wrong function or param somewhere? coding isn't my strong suit....

 

 Here is the block it sits in:

 

 //--- main loop

   for(int i = limit-1; i >= 0; i--)

     {

      if (i >= MathMin(500-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation   

      //Indicator Buffer 1

      if(MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iOpen(NULL, PERIOD_M1, 2+i) - iClose(NULL, PERIOD_M1, 2+i)) * 1.1 //Candlestick Body > Candlestick Body * fixed value

      && iClose(NULL, PERIOD_M1, 1+i) > iOpen(NULL, PERIOD_M1, 1+i) //Candlestick Close > Candlestick Open

      && iOpen(NULL, PERIOD_M1, 2+i) > iClose(NULL, PERIOD_M1, 2+i) //Candlestick Open > Candlestick Close

      && MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > (iHigh(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, 1+i)) * 0.25 //Candlestick Body > Candlestick Range * fixed value

      && iHigh(NULL, PERIOD_M1, 1+i) > iHigh(NULL, PERIOD_M1, 2+i) //Candlestick High > Candlestick High

      && MathAbs(iHigh(NULL, PERIOD_M1, iHighest(NULL, PERIOD_M1, MODE_HIGH, 11, 0)) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iClose(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, iLowest(NULL, PERIOD_M1, MODE_LOW, 3, 0)) * 0.95) //Ensures a minimum of 1:0.95 risk/reward ratio

        {

         Buffer1[i] = iLow(NULL, PERIOD_M1, 1+i); //Set indicator value at Candlestick Low

         if(i == 0 && Time[0] != time_alert) { myAlert("indicator", "M1 bull eng."); time_alert = Time[0]; } //Instant alert, only once per bar

        }

 

 Any help appreciated, thanks

Keith Watford
Moderator
8293
Keith Watford  
//Candlestick Body > Candlestick Range * fixed value

When will a candle's body ever be larger than the candle's range?

It is simply not possible.

Fernando Carreiro
3922
Fernando Carreiro  
GumRai: When will a candle's body ever be larger than the candle's range? It is simply not possible.

I think the OP means this (see below), which is possible if the fixed range < 1.0.

// Candlestick Body > ( Candlestick Range * fixed value )
fin_kroon1
22
fin_kroon1  

 Are you refering to :

 

 && MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > (iHigh(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, 1+i)) * 0.25 //Candlestick Body > Candlestick Range * fixed value

 

 Yes the body will never be bigger than range. 

 That line satisfies the body being larger than a quarter of the range size.  To ensure there is a half decent directional movement in price. Hence the * 0.25. 

 Everything works fine except the last line relating to:

 

Highest price or resistance of the last 11 bars - close of candle(1) > close candle(1) - lowest price or support of the past 3 bars.

Keith Watford
Moderator
8293
Keith Watford  
FMIC:

I think the OP means this (see below), which is possible if the fixed range < 1.0.

Of course, I see what you mean.
Keith Watford
Moderator
8293
Keith Watford  
for(int i = limit-1; i >= 0; i--)

you are looping through difference values for i

then

&& MathAbs(iHigh(NULL, PERIOD_M1, iHighest(NULL, PERIOD_M1, MODE_HIGH, 11, 0)) - iClose(NULL, PERIOD_M1, 1+i)) >
   MathAbs(iClose(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, iLowest(NULL, PERIOD_M1, MODE_LOW, 3, 0)) * 0.95) 
  //Ensures a minimum of 1:0.95 risk/reward ratio

getting iHighest and iLowest values relative to bar 0

peter.MT4Web
157
peter.MT4Web  

Maybe there should always be an i involved in your bar-index.

fin_kroon1
22
fin_kroon1  

So replace those yellow highlighted 0's with "i" to give:

 

   && MathAbs(iHigh(NULL, PERIOD_M1, iHighest(NULL, PERIOD_M1, MODE_HIGH, 11, i)) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iClose(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, iLowest(NULL, PERIOD_M1, MODE_LOW, 3, i)) * 0.95) //Ensures a minimum of 1:0.95 risk/reward ratio //Custom Code

 

No improvement unfortunately, still no indicators painting. 

whroeder1
17112
whroeder1  
  1. Don't paste code
    Play video
    Please edit your post.
    For large amounts of code, attach it.

  2. for(int i = limit-1; i >= 0; i--){
       if (i >= MathMin(500-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation   
    Do your lookbacks correctly.
  3. if(MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) ...
       && iClose(NULL, PERIOD_M1, 1+i) > iOpen(NULL, PERIOD_M1, 1+i) ...
       && iOpen(NULL, PERIOD_M1, 2+i) > iClose(NULL, PERIOD_M1, 2+i) ...
    I is the index your are computing, drop the +1 and change the +2 to +1. Simplify your code.
  4. iClose(NULL, PERIOD_M1, 1+i) >
    Why are you limiting your indicator to only run on the M1? Drop your function calls, use the predefines and simplify your code.
fin_kroon1
22
fin_kroon1  
 thanks
fin_kroon1
22
fin_kroon1  
//+------------------------------------------------------------------+
//|                               Indicator: engulfing candle M1.mq4 |
//|                                       Created with EABuilder.com |
//|                                             http://eabuilder.com |
//+------------------------------------------------------------------+
#property copyright "Created with EABuilder.com"
#property link      "http://eabuilder.com"
#property version   "1.00"
#property description "eng. range & body SERIES"

#include <stdlib.mqh>
#include <stderror.mqh>

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2

#property indicator_type1 DRAW_ARROW
#property indicator_width1 1
#property indicator_color1 0x00FF00
#property indicator_label1 "M1 bull eng."

#property indicator_type2 DRAW_ARROW
#property indicator_width2 1
#property indicator_color2 0x0000FF
#property indicator_label2 "M1 bear eng."

//--- indicator buffers
double Buffer1[];
double Buffer2[];

datetime time_alert; //used when sending alert
double myPoint; //initialized in OnInit

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" | engulfing candle M1 @ "+Symbol()+","+Period()+" | "+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
   else if(type == "indicator")
     {
      Print(type+" | engulfing candle M1 @ "+Symbol()+","+Period()+" | "+message);
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
   IndicatorBuffers(2);
   SetIndexBuffer(0, Buffer1);
   SetIndexEmptyValue(0, 0);
   SetIndexArrow(0, 241);
   SetIndexBuffer(1, Buffer2);
   SetIndexEmptyValue(1, 0);
   SetIndexArrow(1, 242);
   //initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int limit = rates_total - prev_calculated;
   //--- counting from 0 to rates_total
   ArraySetAsSeries(Buffer1, true);
   ArraySetAsSeries(Buffer2, true);
   //--- initial zero
   if(prev_calculated < 1)
     {
      ArrayInitialize(Buffer1, 0);
      ArrayInitialize(Buffer2, 0);
     }
   else
      limit++;
   
   //--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if (i >= MathMin(500-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation   
      //Indicator Buffer 1
      if(MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iOpen(NULL, PERIOD_M1, 2+i) - iClose(NULL, PERIOD_M1, 2+i)) * 1.1 //Candlestick Body > Candlestick Body * fixed value
      && iClose(NULL, PERIOD_M1, 1+i) > iOpen(NULL, PERIOD_M1, 1+i) //Candlestick Close > Candlestick Open
      && iOpen(NULL, PERIOD_M1, 2+i) > iClose(NULL, PERIOD_M1, 2+i) //Candlestick Open > Candlestick Close
      && MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > (iHigh(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, 1+i)) * 0.25 //Candlestick Body > Candlestick Range * fixed value
      && iHigh(NULL, PERIOD_M1, 1+i) > iHigh(NULL, PERIOD_M1, 2+i) //Candlestick High > Candlestick High
      && MathAbs(iHigh(NULL, PERIOD_M1, iHighest(NULL, PERIOD_M1, MODE_HIGH, 11, i)) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iClose(NULL, PERIOD_M1, 1+i) -iLow(NULL, PERIOD_M1, iLowest(NULL, PERIOD_M1, MODE_LOW, 3, i))) * 0.95  //Ensures a minimum of 1:0.95 risk/reward ratio //Custom Code
      )
        {
         Buffer1[i] = iLow(NULL, PERIOD_M1, 1+i); //Set indicator value at Candlestick Low
         if(i == 0 && Time[0] != time_alert) { myAlert("indicator", "M1 bull eng."); time_alert = Time[0]; } //Instant alert, only once per bar
        }
      else
        {
         Buffer1[i] = 0;
        }
      //Indicator Buffer 2
      if(MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > MathAbs(iOpen(NULL, PERIOD_M1, 2+i) - iClose(NULL, PERIOD_M1, 2+i)) * 1.1 //Candlestick Body > Candlestick Body * fixed value
      && iClose(NULL, PERIOD_M1, 1+i) < iOpen(NULL, PERIOD_M1, 1+i) //Candlestick Close < Candlestick Open
      && iOpen(NULL, PERIOD_M1, 2+i) < iClose(NULL, PERIOD_M1, 2+i) //Candlestick Open < Candlestick Close
      && MathAbs(iOpen(NULL, PERIOD_M1, 1+i) - iClose(NULL, PERIOD_M1, 1+i)) > (iHigh(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, 1+i)) * 0.25 //Candlestick Body > Candlestick Range * fixed value
      && iLow(NULL, PERIOD_M1, 1+i) < iLow(NULL, PERIOD_M1, 2+i) //Candlestick Low < Candlestick Low
      && iClose(NULL, PERIOD_M1, 1+i) - iLow(NULL, PERIOD_M1, iLowest(NULL, PERIOD_M1, MODE_LOW, 11)) > MathAbs(iHigh(NULL, PERIOD_M1, iHighest(NULL, PERIOD_M1, MODE_HIGH, 3)) - iClose(NULL, PERIOD_M1, 1+i)* 0.95) //Ensures a minimum of 1:0.95 risk/reward ratio //Custom Code
      )
        {
         Buffer2[i] = iHigh(NULL, PERIOD_M1, 1+i); //Set indicator value at Candlestick High
         if(i == 0 && Time[0] != time_alert) { myAlert("indicator", "M1 bear eng."); time_alert = Time[0]; } //Instant alert, only once per bar
        }
      else
        {
         Buffer2[i] = 0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
12
To add comments, please log in or register