CCI Arrows

fxwalb

Master Trader
Dec 18, 2009
31
0
62
I don't know but the second check on myCCInow in the end is unnecessary. Do you see any errors in the Experts log output?
Thanks for your help.
Code is now like this, but still not working

//+------------------------------------------------------------------+
//| CCI Arrows |
//| Copyright © 2009, EarnForex |
//| http://www.earnforex.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, EarnForex"
#property link "http://www.earnforex.com"
#property version "1.01"
#property description "CCI Arrows - direct trading signals based on CCI indicator."
#property description "Displays red and blue arrows for Short and Long signals."

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2

#property indicator_color1 Red
#property indicator_type1 DRAW_ARROW
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5

#property indicator_color2 Lime
#property indicator_type2 DRAW_ARROW
#property indicator_style2 STYLE_SOLID
#property indicator_width2 5



input ENUM_TIMEFRAMES TimeFrame = PERIOD_H4;
input double Arrow_Offset=20.0;


input double UpLevel=100;
input double DnLevel=-100;


double myCCInow;

double dUpCCIBuffer[];
double dDownCCIBuffer[];

input int CCI_Period = 21; //This value sets the CCI Period Used, The default is 21

int myCCI;
double CCIBuffer[];
double mtf_CCIBuffer[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+

void OnInit()
{
IndicatorSetString(INDICATOR_SHORTNAME, "CCI_Arrows(" + IntegerToString(CCI_Period) + ")");

//---- indicator buffers mapping

SetIndexBuffer(0, dUpCCIBuffer, INDICATOR_DATA);
SetIndexBuffer(1, dDownCCIBuffer, INDICATOR_DATA);

//---- drawing settings


PlotIndexSetInteger(0, PLOT_ARROW, 115);//233
// PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -Arrow_Offset);
PlotIndexSetString(0, PLOT_LABEL, "CCI Buy");

PlotIndexSetInteger(1, PLOT_ARROW, 115);//234
// PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, Arrow_Offset);
PlotIndexSetString(1, PLOT_LABEL, "CCI Sell");



myCCI = iCCI(NULL,TimeFrame, CCI_Period, PRICE_TYPICAL);

}

//+------------------------------------------------------------------+
//| Custom CCI Arrows |
//+------------------------------------------------------------------+
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[])



{

//--------------------
datetime TimeArray[];


CopyTime(Symbol(), TimeFrame, 0, rates_total, TimeArray);
int shift, limit, y;

if(BarsCalculated(myCCI) < rates_total) return(0);

//--- we can copy not all data
int to_copy;
if(prev_calculated > rates_total || prev_calculated < 0) {
to_copy = rates_total;
}
else {
to_copy = rates_total-prev_calculated;
if(prev_calculated > 0)
to_copy++;
}

if(CopyBuffer(myCCI, 0, 0, rates_total, mtf_CCIBuffer) <= 0) {
Print("Getting MA buff failed! Error", GetLastError());
return(0);
}

for(int i=0, y=0; i<limit; i++) {
if (time < TimeArray[y])
y++;

CCIBuffer = mtf_CCIBuffer[y];

}


//--------------------


ArraySetAsSeries(High, true);
ArraySetAsSeries(Low, true);


for (int i = rates_total; i > 1; i--)
{
dUpCCIBuffer[rates_total - i + 1] = 0;
dDownCCIBuffer[rates_total - i + 1] = 0;

myCCInow = CCIBuffer[rates_total - i + 1];

double myCCI2 = CCIBuffer[rates_total - i]; //CCI One bar ago

//---

if (myCCInow >= 0) //is going long
{
if(myCCI2 < 0) //did it cross from below 50
{
dUpCCIBuffer[rates_total - i + 1] = Low - 2 * _Point*Arrow_Offset; //
}
}

//-----------------

if (myCCInow < 0) //is going short
{
if(myCCI2 > 0) //did it cross from above 50
{
dDownCCIBuffer[rates_total - i + 1] = High + 2 * _Point*Arrow_Offset; //
}
}

//-----------------
}

//-----
return(rates_total);
}
 

fxwalb

Master Trader
Dec 18, 2009
31
0
62
I still suggest you looking at the Experts log tab in your MT5 terminal. You can also try outputting your myCCInow and myCCI2 values to see if they are correct.
Coded it new and found error
array out of range

//+------------------------------------------------------------------+
//| CCI Arrows |
//| Copyright © 2009, EarnForex |
//| http://www.earnforex.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, EarnForex"
#property link "http://www.earnforex.com"
#property version "1.01"
#property description "CCI Arrows - direct trading signals based on CCI indicator."
#property description "Displays red and blue arrows for Short and Long signals."

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1 Blue
#property indicator_type1 DRAW_ARROW
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_type2 DRAW_ARROW
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2

double dUpCCIBuffer[];
double dDownCCIBuffer[];
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H4;
input int CCI_Period = 14; //This value sets the CCI Period Used, The default is 21
int myCCI;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
IndicatorSetString(INDICATOR_SHORTNAME, "CCI_Arrows(" + IntegerToString(CCI_Period) + ")");

//---- indicator buffers mapping
SetIndexBuffer(0, dUpCCIBuffer, INDICATOR_DATA);
SetIndexBuffer(1, dDownCCIBuffer, INDICATOR_DATA);

//---- drawing settings
PlotIndexSetInteger(0, PLOT_ARROW, 233);
PlotIndexSetInteger(1, PLOT_ARROW, 234);

PlotIndexSetString(0, PLOT_LABEL, "CCI Buy");
PlotIndexSetString(1, PLOT_LABEL, "CCI Sell");

myCCI = iCCI(NULL, 0, CCI_Period, PRICE_CLOSE);
}

//+------------------------------------------------------------------+
//| Custom CCI Arrows |
//+------------------------------------------------------------------+
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[])
{

double CCIBuffer[];
double mtf_CCIBuffer[];
//------------------------

datetime TimeArray[];

CopyTime(Symbol(), TimeFrame, 0, rates_total, TimeArray);
int shift, limit, y;

if(BarsCalculated(myCCI) < rates_total) return(0);

//--- we can copy not all data
int to_copy;
if(prev_calculated > rates_total || prev_calculated < 0) {
to_copy = rates_total;
}
else {
to_copy = rates_total-prev_calculated;
if(prev_calculated > 0)
to_copy++;
}

if(CopyBuffer(myCCI, 0, 0, rates_total, mtf_CCIBuffer) <= 0) {
Print("Getting MA buff failed! Error", GetLastError());
return(0);
}

for(int i=0, y=0; i<limit; i++) {
if (time < TimeArray[y])
y++;

CCIBuffer = mtf_CCIBuffer[y];

}

//---------------------------------------------------
ArraySetAsSeries(High, true);
ArraySetAsSeries(Low, true);




// CopyBuffer(myCCI, 0, 0, rates_total, CCIBuffer);

for (int i = rates_total; i > 1; i--)
{
dUpCCIBuffer[rates_total - i + 1] = 0;
dDownCCIBuffer[rates_total - i + 1] = 0;

double myCCInow = CCIBuffer[rates_total - i + 1]; // *******for this line array out of range ********
double myCCI2 = CCIBuffer[rates_total - i]; //CCI One bar ago

if (myCCInow >= 0) //is going long
{
if((myCCInow > 0) && (myCCI2 < 0)) //did it cross from below 50
{
dUpCCIBuffer[rates_total - i + 1] = Low - 2 * _Point;
}
}

if (myCCInow < 0) //is going short
{
if((myCCInow < 0) && (myCCI2 > 0)) //did it cross from above 50
{
dDownCCIBuffer[rates_total - i + 1] = High + 2 * _Point;
}
}
}

return(rates_total);
}
 

fxwalb

Master Trader
Dec 18, 2009
31
0
62
I don't think that you can copy arrays like it:

MQL5:
CCIBuffer[i] = mtf_CCIBuffer[y];
You didn't specify the size of CCIBuffer anywhere before.
How should I do this?
 
Last edited by a moderator:

fxwalb

Master Trader
Dec 18, 2009
31
0
62
You do it with CopyBuffer. But why do you copy an indicator to mtf_CCIBuffer instead of the one you use in further calculations?
OK, changed now the code to this version, but still is not yet MTF

//+------------------------------------------------------------------+
//| CCI Arrows |
//| Copyright © 2009, EarnForex |
//| http://www.earnforex.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, EarnForex"
#property link "http://www.earnforex.com"
#property version "1.01"
#property description "CCI Arrows - direct trading signals based on CCI indicator."
#property description "Displays red and blue arrows for Short and Long signals."

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1 Blue
#property indicator_type1 DRAW_ARROW
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_type2 DRAW_ARROW
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2

double dUpCCIBuffer[];
double dDownCCIBuffer[];
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H4;
input int CCI_Period = 14; //This value sets the CCI Period Used, The default is 21
int myCCI;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
IndicatorSetString(INDICATOR_SHORTNAME, "CCI_Arrows(" + IntegerToString(CCI_Period) + ")");

//---- indicator buffers mapping
SetIndexBuffer(0, dUpCCIBuffer, INDICATOR_DATA);
SetIndexBuffer(1, dDownCCIBuffer, INDICATOR_DATA);

//---- drawing settings
PlotIndexSetInteger(0, PLOT_ARROW, 233);
PlotIndexSetInteger(1, PLOT_ARROW, 234);

PlotIndexSetString(0, PLOT_LABEL, "CCI Buy");
PlotIndexSetString(1, PLOT_LABEL, "CCI Sell");

myCCI = iCCI(NULL, TimeFrame, CCI_Period, PRICE_CLOSE);
}

//+------------------------------------------------------------------+
//| Custom CCI Arrows |
//+------------------------------------------------------------------+
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[])
{

double CCIBuffer[];
double mtf_CCIBuffer[];
//------------------------

datetime TimeArray[];

CopyTime(Symbol(), TimeFrame, 0, rates_total, TimeArray);
int shift, limit, y;

if(BarsCalculated(myCCI) < rates_total) return(0);

//--- we can copy not all data
int to_copy;
if(prev_calculated > rates_total || prev_calculated < 0) {
to_copy = rates_total;
}
else {
to_copy = rates_total-prev_calculated;
if(prev_calculated > 0)
to_copy++;
}

if(CopyBuffer(myCCI, 0, 0, rates_total, CCIBuffer) <= 0) {
Print("Getting MA buff failed! Error", GetLastError());
return(0);
}

for(int i=0, y=0; i<limit; i++) {
if (time < TimeArray[y])
y++;

CCIBuffer = CCIBuffer[y];

}

//---------------------------------------------------
ArraySetAsSeries(High, true);
ArraySetAsSeries(Low, true);




// CopyBuffer(myCCI, 0, 0, rates_total, CCIBuffer);

for (int i = rates_total; i > 1; i--)
{
dUpCCIBuffer[rates_total - i + 1] = 0;
dDownCCIBuffer[rates_total - i + 1] = 0;

double myCCInow = CCIBuffer[rates_total - i + 1]; //
double myCCI2 = CCIBuffer[rates_total - i]; //CCI One bar ago

if (myCCInow >= 0) //is going long
{
if((myCCInow > 0) && (myCCI2 < 0)) //did it cross from below 50
{
dUpCCIBuffer[rates_total - i + 1] = Low - 2 * _Point;
}
}

if (myCCInow < 0) //is going short
{
if((myCCInow < 0) && (myCCI2 > 0)) //did it cross from above 50
{
dDownCCIBuffer[rates_total - i + 1] = High + 2 * _Point;
}
}
}

return(rates_total);
}
 

fxwalb

Master Trader
Dec 18, 2009
31
0
62
I don't quite understand what do you mean by MTF? How do you want to display an indicator from a smaller or bigger timeframe on the chart of the current timeframe?
MTF=multi-time-frame
means: indicator should display the arrows of a higher (4h) in lower (1h or 15min) timeframes.
 

Enivid

Administrator
Staff member
Nov 30, 2008
13,582
605
144
Odessa
www.earnforex.com
MTF=multi-time-frame
means: indicator should display the arrows of a higher (4h) in lower (1h or 15min) timeframes.
I know what MTF means, I just don't understand how are you going to achieve it. For example, it's H1 chart and you want to use M5 CCI arrows. How will you display 2 or more arrows generated during one 60-minute period? And what's the point?
 

fxwalb

Master Trader
Dec 18, 2009
31
0
62
I know what MTF means, I just don't understand how are you going to achieve it. For example, it's H1 chart and you want to use M5 CCI arrows. How will you display 2 or more arrows generated during one 60-minute period? And what's the point?
the arrow of a higher timeframe should be displayed in a lower one

it is a question whether it is possible at all to code something like this

in MT4 a mtf MA indicator displayes a step of 4 periods in 1h when displaying a MA of 4h timeframe
 

AderFx

Active Trader
Mar 17, 2010
5
0
32
Hello Guys,

Thanks for sharing this excellent indicator !

I tried to change the value for the cross signal... default is "0" but... what I need to change if I want an arrow when it cross value of "70" ?

Thanks to you all !

Bye
 

Enivid

Administrator
Staff member
Nov 30, 2008
13,582
605
144
Odessa
www.earnforex.com
Hello Guys,

Thanks for sharing this excellent indicator !

I tried to change the value for the cross signal... default is "0" but... what I need to change if I want an arrow when it cross value of "70" ?

Thanks to you all !

Bye
You need to change "0" to "70" in the lines below in .mq4 file and then recompile:

MQL5:
 if(myCCInow>0 && myCCI2<0) //did it cross from below 50
MQL5:
 if(myCCInow<0 && myCCI2>0) //did it cross from above 50
 
Last edited:

AderFx

Active Trader
Mar 17, 2010
5
0
32
You need to change "0" to "70" in the lines below in .mq4 file and then recompile:

MQL5:
 if(myCCInow>0 && myCCI2<0) //did it cross from below 50
MQL5:
 if(myCCInow<0 && myCCI2>0) //did it cross from above 50
Hello,

Thanks for your help,
I tried with value "100" but seems not working correctly, blue arrow are correct but there is some red arrows that are not visible.



You know why?

My code:
MQL5:
 if(myCCInow>100 && myCCI2<100) //did it cross from below 50
MQL5:
 if(myCCInow<100 && myCCI2>100) //did it cross from above 50
Thank you !!
 
Last edited by a moderator:

AderFx

Active Trader
Mar 17, 2010
5
0
32
Sorry... I found the error...

MQL5:
if (myCCInow<0)   //is going short
Thanks !! :)
 
Last edited by a moderator:

AderFx

Active Trader
Mar 17, 2010
5
0
32
Hi Guys,

Little problem, When I draw a trendline in H1 timeframe and come back to M15 for example, my trendlines are deleted... if I remove indicator "CCIArrow" I haven't problems.

Any ideas?

Thank you.
Bye