CCI on chart is different than iCCI result
price_close and you take bar 0
do you get right result on bar 1 ??
price_close and you take bar 0
do you get right result on bar 1 ??
No, other bars are wrong as well.
the code is below. maybe you can help point to the issue
//+--------------------------------------------------+ //| Generic variables | //+--------------------------------------------------+ double pips; //define pip size //+--------------------------------------------------+ //| variables for BUY/SELL | //+--------------------------------------------------+ extern int StopLossLimit=0.0050; //--- Defined the stop loss limit = 50 pips extern int TakeProfitLimit=0.0100; //--- Defined the take profit limit = 100 pips extern double LotSize=0.1; //--- Defines the trade lot size = 0.1 lot >> 10,000 >> pips = 1 extern int MagicNumber = 2222; //+--------------------------------------------------+ //| variables for CCI | //+--------------------------------------------------+ double CCI[50]; int CciPeriod = 14; double CciGapForBuy = 0.1; double CciGapForClose = -0.1; //+------------------------------------------------------------------+ int init() { // Define PIPS size. check if graphs tick is 5 digits or 3 digits then PIPS is tick*10 // double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE); if (ticksize == 0.00001 || ticksize == 0.001) pips = ticksize*10; else pips =ticksize; //+--------------------------------------------+ //| for CCI check - create initial CCI array | //+--------------------------------------------+ int CciLoopIndex1=0; int CciLoopLimit=ArraySize(CCI); for(CciLoopIndex1=0; CciLoopIndex1<CciLoopLimit; CciLoopIndex1++) { CCI[CciLoopIndex1]=iCCI(NULL,0,CciPeriod,PRICE_CLOSE,CciLoopIndex1); } return(0); } //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ int start() { //When new candle starts, checks if Rule for Buy/Sell is met // if(IsNewCandle()) { //Print ("New candle"); CheckForRule(); } return(0); } //+------------------------------------------------------------------+ //| checks if any orders open on this currency pair. | //+------------------------------------------------------------------+ int OpenOrdersThisPair(string pair) { int total=0; for(int i=OrdersTotal()-1; i >= 0; i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()== pair) total++; } return (total); } //+------------------------------------------------------------------+ //| Returns Order number for this currency pair. | //+------------------------------------------------------------------+ int OrderNumberThisPair(string pair) { int OrderTicketNumber=0; for(int i=OrdersTotal()-1; i >= 0; i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()== pair) OrderTicketNumber=OrderTicket(); } return (OrderTicketNumber); } //+------------------------------------------------------------------+ //| Verify its a new candle function | //+------------------------------------------------------------------+ bool IsNewCandle() { static int BarsOnChart=0; if (Bars == BarsOnChart) return (false); BarsOnChart = Bars; return(true); } //+------------------------------------------------------------------+ //| order entry function | //+------------------------------------------------------------------+ void OrderEntry(string direction) { if(direction=="BUY") //--- for BUY { if(OpenOrdersThisPair(Symbol())==0) //--- verifies no other open trades for same currancy pair in parallel { int buyticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-0.0050,Ask+0.0200,NULL,MagicNumber,0,Green); } } if(direction=="SELL") { if(OpenOrdersThisPair(Symbol())==0) { int sellticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+0.0050,Bid-0.0200,NULL,MagicNumber,0,Red); } } if(direction=="CLOSE") { if(OpenOrdersThisPair(Symbol())>0) { OrderClose(OrderNumberThisPair(Symbol()),OrderLots(),Bid,3,Blue); } } } //+--------------------------------------------------------------------------+ //| This function checks whether the defined rule for Buy or Sell is met. | //| if rule meets BUY criteria then OrderEntry function is trigerred with 1 | //| if rule meets SELL criteria then OrderEntry function is trigerred with 0 | //+--------------------------------------------------------------------------+ void CheckForRule() { string CheckCciReturn; CheckCciReturn = CheckCCI(); if(CheckCciReturn=="BUY") OrderEntry("BUY"); if(CheckCciReturn=="CLOSE") OrderEntry("CLOSE"); } //+--------------------------------------------------------------------------+ //| This function checks BUY/SELL triggers, based on CCI cross its MA | //| | //| | //+--------------------------------------------------------------------------+ string CheckCCI() { int CciLoopIndex1=0; int CciLoopLimit=ArraySize(CCI); double PreviousPeriodMA; double CurrentPeriodMA; PreviousPeriodMA=iMAOnArray(CCI,CciPeriod,CciPeriod,0,MODE_SMA,0); //--- move all CCI array cells, to previous cell, in order to free CCI[0] for current CCI info for(CciLoopIndex1=CciLoopLimit; CciLoopIndex1>0; CciLoopIndex1--) { CCI[CciLoopIndex1]=CCI[CciLoopIndex1-1]; } //--- Retrieve current CCI to CCI[0] CCI[0]=iCCI(NULL,0,CciPeriod,PRICE_CLOSE,0); //--- Calculate MA on CCI array, for MA_Period days (currently MA(14)) CurrentPeriodMA=iMAOnArray(CCI,0,CciPeriod,0,MODE_SMA,0); Print("CCI:"+CCI[0]+" MA:"+CurrentPeriodMA); if (CCI[0]>CurrentPeriodMA+(MathAbs(CurrentPeriodMA)*CciGapForBuy) && CCI[1]<PreviousPeriodMA) return("BUY"); if (CCI[0]<CurrentPeriodMA+(MathAbs(CurrentPeriodMA)*CciGapForClose)) { return("CLOSE"); } return ("NO"); } //+------------------------------------------------------------------+
- src
- cci.mq4 has
MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i); : price = (High[i] + Low[i] + Close[i]) / 3; RelBuffer[i] = price - MovBuffer[i];
thanks for comments
I edited the code as you metioned in #1
in #2, I'm not sure I got your suggestion.
even before the iMA that I'm using, simple iCCI in my EA (look for the print statement) shows different value that CCI indicator.
I attached a picture that shows the different values.
I attached a picture that shows the different values.
No you didn't . . .
int start() { //When new candle starts, checks if Rule for Buy/Sell is met // if(IsNewCandle()) { //Print ("New candle"); CheckForRule(); } double CCI_0 =iCCI(NULL,0,CciPeriod,PRICE_CLOSE,0); Comment("CCI_0 = ",CCI_0); return(0); }
put the green lines inside your code
Check this and you will see the value of CCI at bar 0 every tick....
So why is it different ????
does anyone know how the CCI on the chart is calculated?
look at the attached pictures
on chart - 14/Nov 10:00 CCI is -208.7495
in my EA - 14/Nov 10:00 iCCI returns -149.5238
in my EA, I'm using the: iCCI(NULL,0,CciPeriod,PRICE_CLOSE,0) CciPeriod=14
I also tryed using PRICE_TYPICAL and PRICE_OPEN, but yet failed to get the CCI value that I see in the chart
please help...