Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен торговый робот? Закажи его в сервисе Фриланс!
tommy27
94
tommy27 2012.01.13 19:57 

Как собрать статистику по индюку?

Нужна статистика показаний от одной нулевой точки до другой (на скрине отмечены стрелками)

1.количество таких отрезков за произвольно заданный промежуток времени

2.сколько раз индикатор меняет цвет в каждом таком отрезке

3.максимальное значение индикатора в каждом отрезке

Может есть какие то готовые функции позволющие такое проделать? Если нет прошу помоч советом.

Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2012.01.13 23:00  

Да тут достаточно самого индюкатора. Просто создать скрипт, пройтись в цикле по истории и тупо вычислить. Кода - если писать его по-человечески, с разными функциями, - строк на 100-200, вряд ли больше.

Если пишете на MQL4 - никаких проблем. Вызов значений буферов индюкатора - функцией iCustom().

Если не пишете - попробуйте заинтересовать кого-нибудь, на хрена это Вам нужно.

tommy27
94
tommy27 2012.01.13 23:32  

Спасибо.

Надоело уже просить, осваиваю сам потихоньку. Пробовал записать в файл с помощью FileWriteArray получается но не то. А как бы сохранить double массив в файл CSV ?

Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2012.01.13 23:50  

Проще писать, не особо заморачиваясь, просто с помощью FileWrite().

А зачем писать массив в файл? Или у Вас проблема с программным поиском максимального значения индюкатора на отрезке? Ну если Вы собираетесь открыть файл в Экселе и там проанализировать - вполне достойный путь...

Хотя да, понял, файл все же нужен. Но выводить придется двумерный массив - № отрезка, число перемен знака внутри него, максимальное/минимальное значение индюкатора внутри.

tommy27
94
tommy27 2012.01.14 01:14  

Для начала хотелось бы сделать так:

В файл выводятся значения индикатора построчно, где каждая строка это данные индикатора от одной нулевой точки до другой - как это сделать пока не очень понимаю (

а потом в экселе всё анализируется.

Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2012.01.14 01:24  

Ну если так, то это просто. Что такое нулевая точка? Это первый бар, на котором значение меняет знак (движение из глубины истории к настоящему)? Или предыдущий к этому бару? Судя по рисунку, похоже, что это первый бар перемены знака.

Короче, разберитесь пока с этим кодом. Ключевая функция, которую Вам придется изменить, - это последняя, makeUnifiedBuff(). В нее запишите значения индюкатора MACD_Сolored: у него минимум два буфера, их надо объединить. У меня нет исходника, сделайте это самостоятельно.

Ну а с цветами как-нибудь придумаете сами.

//+------------------------------------------------------------------+
//|                                           stats_MACD_colored.mq4 |
//+------------------------------------------------------------------+

int _h;                 /// хэндл файла статистики
double _unifiedBuff[ ];    /// "единый" буфер индюкатора
int _zeros[ ];

int start( )
{
   _h = FileOpen( "stats.csv", FILE_CSV | FILE_WRITE, " " );
   valuesToFile( );
   FileClose( _h );   
   return( 0 );
}//+------------------------------------------------------------------+

 
void valuesToFile( )
{
   makeZerosArray(  );
   int size = ArrayRange( _zeros, 0 );
   string stringOut = "";
   int shFirst, shLast;
   for( int i = 1; i < size - 1; i ++ )          /// цикл начнем со второго в истории "нулевого" бара
   {
      shFirst = _zeros[ i ];
      shLast = _zeros[ i + 1 ];
      stringOut = "" + i + ",";
      for( int sh = shFirst; sh > shLast; sh -- )     stringOut = stringOut + _unifiedBuff[ sh ] + ",";
      FileWrite( _h, stringOut );
      stringOut = "";
   }
   return;
}//+------------------------------------------------------------------+            


     /// заполняем массив нулевых точек
      void makeZerosArray(  )
      {
         makeUnifiedBuff( );
         
         int size = 0;        /// текущий размер массива нулевых точек
         for( int i = Bars - 2; i > 0; i -- )
         {
            if( _unifiedBuff[ i ] * _unifiedBuff[ i + 1 ] < 0 )      
            {
               size ++;
               ArrayResize( _zeros, size );
               _zeros[ size - 1 ] = i;
            }
         }
         return;
      }//+------------------------------------------------------------------+
      
      
            /// в этой функции надо создать "единый буфер", объединяющий буферы индюкатора; здесь это сделано для стандартного пользовательского MACD
            void makeUnifiedBuff( )
            {
               ArrayResize( _unifiedBuff, Bars );
               for( int i = Bars - 1; i >= 0; i -- )      _unifiedBuff[ i ] = iCustom( Symbol( ), 0, "MACD", 12, 26, 9, 0, i );
               return;
            }//+------------------------------------------------------------------+
            
tommy27
94
tommy27 2012.01.14 17:33  
Спасибо большое за помощь, буду разбираться.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий