Вопрос знатокам MQL - страница 16

 
artmedia70:

Есть такой символ?

Благодарю нижайше!!! Я бы такой глюк ни за что не нашел... Понапишут в учебниках туфты, а я и повелся, копирую не глядя...
 

Подскажите пожалуйста, где ошибка? Почему результаты разные?

//+------------------------------------------------------------------+
//|                                                       TestFr.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double FrUpz=0;
   double FrUp1 = GetFractal("0", 0, 1, MODE_UPPER);
   double FrUp2 = GetFractal("0", 0, 2, MODE_UPPER);
   double FrUp3 = GetFractal("0", 0, 3, MODE_UPPER);
   Print("# FrUp1=",FrUp1);
   Print("# FrUp2=",FrUp2);
   Print("# FrUp3=",FrUp3);
   for(int z=1;z<=3;z++)
      {
       FrUpz = GetFractal("0", 0, z, MODE_UPPER);
       Print("z=",z," FrUpz=",FrUpz);
      } 
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru  & khorosh        |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.02.2009                                                     |
//|  Описание : Возвращает фрактал по его номеру.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
double GetFractal(string sy="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    i, k=iBars(sy, tf), kf;
  for (i=3; i<k; i++) {
    if(mode==MODE_LOWER){
    f=iFractals(sy, tf, MODE_LOWER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iLow(sy,tf,i));
     } 
    }
    if(mode==MODE_UPPER){
    f=iFractals(sy, tf, MODE_UPPER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iHigh(sy,tf,i));
      }
    }
  }
  Print("GetFractalBar(): Фрактал не найден");
  return(-1);
}

Результат:

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=3 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=2 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=1 FrUpz=1.37104

2014.02.17 19:56:38.828 TestFr EURUSD,M15: # FrUp3=1.37056

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp2=1.37162

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp1=1.37083

 
khorosh:

Подскажите пожалуйста, где ошибка? Почему результаты разные?

Результат:

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=3 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=2 FrUpz=1.37083

2014.02.17 19:56:38.828 TestFr EURUSD,M15: z=1 FrUpz=1.37104

2014.02.17 19:56:38.828 TestFr EURUSD,M15: # FrUp3=1.37056

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp2=1.37162

2014.02.17 19:56:38.812 TestFr EURUSD,M15: # FrUp1=1.37083


Для удобства контроля малость переделал функцию, Теперь возвращает номер бара

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru  & khorosh        |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.02.2009                                                     |
//|  Описание : Возвращает фрактал по его номеру.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
double GetFractal(string sy="0",int tf=0,int nf=0,int mode=MODE_UPPER) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0;
   int    i,k=iBars(sy,tf),kf;
   for(i=3; i<k; i++) 
     {
      if(mode==MODE_LOWER)
        {
         f=iFractals(sy,tf,MODE_LOWER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iLow(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
      if(mode==MODE_UPPER)
        {
         f=iFractals(sy,tf,MODE_UPPER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iHigh(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
     }
   Print("GetFractalBar(): Фрактал не найден");
   return(-1);
  }
//+------------------------------------------------------------------+

Результат

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: z=3 FrUpz=9.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: z=2 FrUpz=9.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: z=1 FrUpz=13.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: # FrUp3=24.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: # FrUp2=17.0

2014.02.17 21:45:57.409 TestFr GBPUSD,H1: # FrUp1=13.0


 

Добавил явную инициализацию всех переменных

double GetFractal(string sy="0",int tf=0,int nf=0,int mode=MODE_UPPER) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0;
   int    i=0,k=iBars(sy,tf),kf=0;
   for(i=3; i<k; i++) 
     {
      if(mode==MODE_LOWER)
        {
         f=iFractals(sy,tf,MODE_LOWER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iLow(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
      if(mode==MODE_UPPER)
        {
         f=iFractals(sy,tf,MODE_UPPER,i);
         if(f!=0) 
           {
            kf++;
//            if(kf>nf) return(iHigh(sy,tf,i));
               if(kf>nf) return(i);
           }
        }
     }
   Print("GetFractalBar(): Фрактал не найден");
   return(-1);
  }

Результат

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=3 FrUpz=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=2 FrUpz=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=1 FrUpz=13.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp3=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp2=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp1=13.0

Надо разработчикам показать. Что-то не то в функциях

 

Обратил внимание, что код

Print(ChartID()," ",ChartGetInteger(ChartID(),CHART_HEIGHT_IN_PIXELS,0));

размещенный в индикаторе выдает престранные результаты. Так, если открыта вкладка графика, на который собственно и был сброшен индикатор, то результаты высоты главного окна графика выдаются вполне корректные.

Но как только я ухожу с "родного" графика результат почему-то становится равным 75 (естественно, в других случаях результаты могут различаться), но при этом значение идентификатора графика остается прежним.

При возвращении на "родной" график значения высоты становятся правильными.

Большая просьба разработчиков и тех, кто "в теме", объяснить, в чем тут особенность. Неужели так и задумано?! Что-то не верится!

Ну а уж, если это так, то прошу подсказать код, выдающий корректное значение высоты "родного" графика при любой открытой вкладке.
 
Vinin:

Добавил явную инициализацию всех переменных

Результат

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=3 FrUpz=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=2 FrUpz=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: z=1 FrUpz=13.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp3=24.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp2=17.0

2014.02.17 21:50:09.462 TestFr GBPUSD,H1: # FrUp1=13.0

Надо разработчикам показать. Что-то не то в функциях

Спасибо, что уделили моему вопросу внимание. Получается, что причина была только из-за того, что две переменные в функции не были явно инициализированы. Придётся просматривать все Кимовские функции и исправлять.
 

Добрый день.

В коде советника задействованы ф-и И.Кима. Которые предусматривают вызов "замонтированных" библиотек. В коде после "внешних пареметоров" предусмотрено:

//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>

Однако, случайно (после всё того же обновления мт4 - советник не работает) я заметила странную запись в окне "Свойства советника", вкладка "зависимости":

Подскажите пож., что означает эта ошибка и как исправить (если в папке Инклюд и сейчас присутствуют обе библиотеки)? Причем тут папка Libraries?

 
Rita:

Добрый день.

В коде советника задействованы ф-и И.Кима. Которые предусматривают вызов "замонтированных" библиотек. В коде после "внешних пареметоров" предусмотрено:

Однако, случайно (после всё того же обновления мт4 - советник не работает) я заметила странную запись в окне "Свойства советника", вкладка "зависимости":

Подскажите пож., что означает эта ошибка и как исправить (если в папке Инклюд и сейчас присутствуют обе библиотеки)? Причем тут папка Libraries?


stderror.mqh импортирует функцию ErrorDescription из библиотеки stdlib.ex4, которая в стандартной поставке терминала находится в папке Libraries, вместе с исходником. Проверьте, есть ли у вас там этот файл, если нет - возьмите из любого другого терминала.
 

В обоих папках (Инклюд и Libraries) присутствуют исходники stdlib. На всякий случай добавила-скопировала из папки Инклюд.

Но ошибка, описанная выше - по прежнему отображается во вкладке "зависимости". Может быть как-то изменить вызов этих функций: Вместо:

//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>

Задать вызов как-то иначе?

Или теперь пользоваться ф-ями И.Кима в последней версии мт4 будет невозможно?

 
Rita:

В обоих папках (Инклюд и Libraries) присутствуют исходники stdlib. На всякий случай добавила-скопировала из папки Инклюд.

Но ошибка, описанная выше - по прежнему отображается во вкладке "зависимости". Может быть как-то изменить вызов этих функций: Вместо:

Задать вызов как-то иначе?

Или теперь пользоваться ф-ями И.Кима в последней версии мт4 будет невозможно?


Убедитесь что в папке Libraries присутствует исполняемый файл stdlib.ex4, хотя вроде это не кимовский, стандартный файл из поставки.


Как вариант, посмотреть что из него берёт кимовская функция и разбираться что не так.

Причина обращения: