Массивы (Array) - страница 2

 

попробуйте готовые известные индюки может окажутся алтернативой

https://www.mql5.com/ru/code/8531

https://www.mql5.com/ru/code/7344

https://www.mql5.com/ru/code/7282

 

спасибо за заботу, но это не совсем то...

всё-таки хочется запустить связку по МА и X_CCI... на мой бестолковый взгляд она будет очень хороша при определённых настройках...

ещё раз благодарю!!!

попутного тренда!

 

мне другое странно.

создана целая тема про массивы и никто из MQL-щиков не может дать вразумительного ответа как извлечь данные массива...

жаль... даже не знаю теперь, у кого спрашивать... вроде как ресурс-то специально для этого...

или где-то есть ветка типа "Школа MQL"?

 

мдя... ни ответа, ни привета...

может, всё-таки, кто-нибудь подскажет, как значение МА выцарапать?

буду премного благодарен...

 
Goalkeeper >>:

мдя... ни ответа, ни привета...

может, всё-таки, кто-нибудь подскажет, как значение МА выцарапать?

буду премного благодарен...

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp." 
#property link      "http://www.metaquotes.net/"                  
//----
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red

//---- параметра после доработки
extern int CCIPeriod = 12;
extern int MovingPeriod = 12;

//---- buffers
double CCIBuffer[];
double Signal[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   IndicatorBuffers(5);
   SetIndexBuffer(0, CCIBuffer);
   SetIndexBuffer(1, Signal);
   SetIndexBuffer(2, RelBuffer);
   SetIndexBuffer(3, DevBuffer);
   SetIndexBuffer(4, MovBuffer);

   SetIndexStyle(0, DRAW_LINE);
   SetIndexStyle(1, DRAW_LINE);

   IndicatorShortName("X_CCI(" + CCIPeriod + "," + MovingPeriod + ")");

   SetIndexLabel(0, "Value");
   SetIndexLabel(1, "Signal");

   return(0);
}

//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
{
   if(CCIPeriod <= 1) return(0);
   if(Bars <= CCIPeriod) return(0);


   int countedBars = IndicatorCounted();

//---- initial zero
   if(countedBars < 1)
   {
      for(int i = 1; i <= CCIPeriod; i++)
      {
         CCIBuffer[Bars-i] = 0.0;
         DevBuffer[Bars-i] = 0.0;
         MovBuffer[Bars-i] =0.0;
      }
   }

   int limit = Bars - countedBars;
   if(countedBars > 0) 
      limit++;

//---- moving average
   for(i = 0; i < limit; i++)
   {
      MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
   }

//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(countedBars > CCIPeriod - 1) 
   {
      i = Bars - countedBars - 1;
   }
   
   double mul = 0.015 / CCIPeriod;
   while(i >= 0)
   {
      double sum = 0.0;
      int k = i + CCIPeriod - 1;
      
      while(k >= i)
      {
         sum += MathAbs((High[k] + Low[k] + Close[k])/3 - MovBuffer[i]);
         k--;
      }
      
      RelBuffer[i] = (High[i] + Low[i] + Close[i])/3 - MovBuffer[i];
      DevBuffer[i] = sum*mul;
      
      i--;
   }

//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(countedBars > CCIPeriod - 1) 
   {
       i = Bars - countedBars - 1;
   }

   while(i >= 0)
   {
      if(DevBuffer[i] == 0.0) CCIBuffer[i] = 0.0;
      else                    CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];

      i--;
   }

   i = Bars - CCIPeriod + 1;
   if(countedBars > CCIPeriod - 1) 
   {
       i = Bars - countedBars - 1;
   }

   while(i >= 0)
   {
      Signal[i] = iMAOnArray(CCIBuffer, 0, MovingPeriod, 0, MODE_EMA, i);

      i--;
   }
   
   return(0);
}
Нужный буфер имеет индекс 1
 

2 TheXpert:

Получается не совсем то, что хочется, а именно:

- значение X_CCI совсем другое и, соответственно, МА тоже;

- на рисунке по Вашему индикатору (нижнее окно) относительный флет рисуется как волатильность в обе стороны, а по моим раскраскам (верхнее окно) - реальный флет.

Короче говоря, я так понял надо дальше рыть... Что ж, буду рыть...

 
Goalkeeper >>:

2 TheXpert:

Получается не совсем то, что хочется, а именно:

- значение X_CCI совсем другое и, соответственно, МА тоже;

- на рисунке по Вашему индикатору (нижнее окно) относительный флет рисуется как волатильность в обе стороны, а по моим раскраскам (верхнее окно) - реальный флет.

Короче говоря, я так понял надо дальше рыть... Что ж, буду рыть...

Да елки, даже по картинке видно, ЧТО Вы делаете неправильно.

На первом графике Вы сглаживаете X_CCI с периодом 50 машкой периодом 12

На втором -- мой индюк -- X_CCI c периодом 12 сглаженный машкой 12.

Нужное выделено и подчеркнуто.

 

Ну не ругайтесь на новичка... Я ж не со зла, просто в поисках истины чуток не доглядел... Теперь по существу.

ОГРОМНОЕ СПАСИБО за индикатор, это действительно то, что я хотел.

Правда пришлось подогнать последнюю строчку кода

   while(i >= 0)
   {
      Signal[i] = iMAOnArray(CCIBuffer, 0, MovingPeriod, 0, MODE_SMA, i);

      i--;
   }
   
   return(0);
}

и получилось 100% совпадение





Но вопрос остался. Как же мне выцарапать значение МА ???



Пытаюсь сделать так:





//+------------------------------------------------------------------+
//| Indicators Data                                                  |
//+------------------------------------------------------------------+
double      MA;             // полное значение MА
double      XCCI;           // полное значение X_CCI
double      MAn;            // округлённое значение MА до целого
double      XCCIn;           // округлённое значение X_CCI до целого
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
//+------------------------------------------------------------------+
//| вычисление значения X_CCI                                        |
//+------------------------------------------------------------------+
   XCCI=iCustom(NULL, 0, "CCI_mql4_com",0,0);
//+------------------------------------------------------------------+
//| вычисление значения Moving Average                               |
//+------------------------------------------------------------------+
   double MA[100], CCI[100];
   int    i,limit=ArraySize(XCCI);
     for(i=0; i<limit; i++)
         {      
            CCI[i]=iCustom(NULL, 0, "CCI_mql4_com",PRICE_CLOSE,0,i);
            MA[i]=iMAOnArray(CCI,0,12,0,MODE_SMA,i);
         }
//+------------------------------------------------------------------+
//| приведение значений X_CCI и Moving Average к целому числу        |
//+------------------------------------------------------------------+
   MAn=NormalizeDouble(MA, 0);
   XCCIn=NormalizeDouble(XCCI, 0);
//+------------------------------------------------------------------+
//| вывод значений X_CCI и Moving Average на экран                   |
//+------------------------------------------------------------------+
   Comment("MA_full: ", MA, "  CCI_full: ", XCCI, "  MA_norm: ", MAn, "  CCI_norm: ", XCCIn);
//----
   return(0);
  }

но не получается. Подскажите правильный код, плиз...

Уже всю голову сломал в поисках буфера...

:'(

 

все продолжаете два буфера в одном цикле строить )

 
да... :)) а что? разве такой расклад не имеет право на существование?
Причина обращения: