мультивалютный CCI

 
Нужен обычный ССI из метатрейдера безо всяких гистограмм и наворотов, но с возможностью указывать в настройках любую пару из терминала. Чтоб их можно было натаскать несколько в одно окошко. Очень нужно.
 
Goose >>:
Нужен обычный ССI из метатрейдера безо всяких гистограмм и наворотов, но с возможностью указывать в настройках любую пару из терминала. Чтоб их можно было натаскать несколько в одно окошко. Очень нужно.

Если очень нужно, то есть прямой резон сделать самому.

Берете из CodeBase оригинальный код CCI.

1. Добавляете внешнюю переменную: extern string CCISymbol="EURUSD"; //потом вставляется нужный символ

2. В iMA(NULL,........) заменяете NULL на CCISymbol.

3. High[k], Low[k], Close[k] заменяете на iHigh( CCISymbol, 0, k), iLow( CCISymbol,0, k), iClose( CCISymbol, 0, k) соответственно.

4. Записываете код под новым именем как CCI_Symbol, компилируете и наслаждаетесь результатом.

5. Рассказываете знакомым девушкам, какой Вы крутой кодер.

 
granit77 писал(а) >>

Если очень нужно, то есть прямой резон сделать самому.

Берете из CodeBase оригинальный код CCI.

1. Добавляете внешнюю переменную: extern string CCISymbol="EURUSD"; //потом вставляется нужный символ

2. В iMA(NULL,........) заменяете NULL на CCISymbol.

3. High[k], Low[k], Close[k] заменяете на iHigh( CCISymbol, 0, k), Low( CCISymbol,0, k), Close( CCISymbol, 0, k) соответственно.

4. Записываете код под новым именем как CCI_Symbol, компилируете и наслаждаетесь результатом.

5. Рассказываете знакомым девушкам, какой Вы крутой кодер.

Улыбнуло;))

 
granit77 >>:

Если очень нужно, то есть прямой резон сделать самому.

Берете из CodeBase оригинальный код CCI.

1. Добавляете внешнюю переменную: extern string CCISymbol="EURUSD"; //потом вставляется нужный символ

2. В iMA(NULL,........) заменяете NULL на CCISymbol.

3. High[k], Low[k], Close[k] заменяете на iHigh( CCISymbol, 0, k), iLow( CCISymbol,0, k), iClose( CCISymbol, 0, k) соответственно.

4. Записываете код под новым именем как CCI_Symbol, компилируете и наслаждаетесь результатом.

5. Рассказываете знакомым девушкам, какой Вы крутой кодер.

Спасибо! 

Однако ж я ни в зуб ногой в этом деле. Вроде все сделал, как велено, только у меня на графике получается совсем не та линия.

Чего еще надо поменять? Взялись повышать мое реноме у девушек, так уж давайте теперь, до конца :)

#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern string CCISymbol="EURJPY";
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(CCISymbol, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(iHigh( CCISymbol, 0, k) + iLow( CCISymbol,0, k) + iClose( CCISymbol, 0, k) / 3);
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Обратись к ForexTools, у него есть готовое такое решение.
 
Мне кажется надо заменить Bars, High, Low, Close на iBars, iHigh, iLow, iClose соответсвенно проставив там CCISymbol.
 
1
  while(k >= i)
        {
         //в отношениях с девушками главное скобки правильно расставить
          price =(iHigh( CCISymbol, 0, k) + iLow( CCISymbol,0, k) + iClose( CCISymbol, 0, k)) / 3;
         //                                                                                _______   
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }

2
      price = (High[i] + Low[i] + Close[i]) / 3; //???????
 
leman >>:
Мне кажется надо заменить Bars, High, Low, Close на iBars, iHigh, iLow, iClose соответсвенно проставив там CCISymbol.

Я потомственный танкист в этом деле.

Где "там "проставить CCISymbol, и во всем ли коде нужно  Bars, High, Low, Close заменить на  iBars, iHigh, iLow, iClose, или только в некоторой части? Я смысла этих манипуляций не представляю совершенно, так что простите за тупость.

Кстати, спасибо за LeMan Trend, вещь хорошая.

Kos - спасибо, посмотрел, там целый пакет валют в одном, для моих целей это будет неудобно совершенно. Мне просто нужен индюк с двумя параметрами - период и валюта, все.


 
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern string CCISymbol="GBPJPY";
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(0, CCIBuffer);  
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);

//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(iBars(CCISymbol,0) <= CCIPeriod) return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) CCIBuffer[iBars(CCISymbol,0)-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) DevBuffer[iBars(CCISymbol,0)-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) MovBuffer[iBars(CCISymbol,0)-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = iBars(CCISymbol,60) - counted_bars;
   if(counted_bars > 0) limit++;
//---- moving average
   for(i = 0; i < limit; i++) MovBuffer[i] = iMA(CCISymbol, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = iBars(CCISymbol,0) - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) i = iBars(CCISymbol,0) - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(iHigh(CCISymbol, 0, k) + iLow(CCISymbol,0, k) + iClose(CCISymbol, 0, k)) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = iBars(CCISymbol,0) - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = iBars(CCISymbol,0) - counted_bars - 1;
   while(i >= 0)
     {
       price = (iHigh(CCISymbol,0,i) + iLow(CCISymbol,0,i) + iClose(CCISymbol,0,i)) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = iBars(CCISymbol,0) - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = iBars(CCISymbol,0) - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

За LeManTrend пожалуйста.

Все должно работать

 
leman >>:

За LeManTrend пожалуйста.

Все должно работать

Спасибо огромное! Самое то, что надо! Зарррработало!

 

Есть еще одно решение предложенное Vinin, но для WPR, после небольших модификаций получаем то, что доктор прописал:))


//+------------------------------------------------------------------+
//|                                             VininI_MV_WPR_v1.mq4 |
//|                                         Victor Nicolaev aka Vinin|
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Сopyright 2008. Victor Nicolaev aka Vinin"
#property link      "e-mail: vinin@mail.ru"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua

#property indicator_level1 0
#property indicator_level2 100
#property indicator_level3 -100



//---- input parameters

extern string CCI_Symbol="GBPUSD";
extern int CCI_Period= 14;
extern int Limit=1440;

double CCI[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0,CCI_Period);
   SetIndexBuffer(0,CCI);
   IndicatorShortName(CCI_Symbol+"(CCI,"+CCI_Period+")");
   SetIndexLabel(0,CCI_Symbol+"(CCI)");
   return(0); }

//+------------------------------------------------------------------+
int start() {
   static int TimeCCI=-1;
   int limit;
   int counted_bars=IndicatorCounted();
   int i, CurrentTime, CCIPos;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   if (limit>Limit && Limit>0) limit = Limit;
   if (TimeCCI>0) limit+=iBarShift(CCI_Symbol,Period(),TimeCCI);
   for (i = limit;i>=0;i--){
      CurrentTime=Time[i];
      CCIPos=iBarShift(CCI_Symbol,Period(),CurrentTime);
      if (iTime(CCI_Symbol,Period(),CCIPos)<CurrentTime) CCIPos++;
      CCI[i] = iCCI(CCI_Symbol,Period(),CCI_Period,PRICE_TYPICAL,CCIPos);
   }
   TimeCCI=iTime(CCI_Symbol,Period(),0);
   
   
   return(0); 
}
Причина обращения: