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);
}