Ошибки, баги, вопросы - страница 1697

 
Karputov Vladimir:
 Print(MQLInfoString(MQL_PROGRAM_NAME)); возвращает короткое имя индикатора. Если короткое имя не задано - вернётся полное имя.
Спасибо.
 
Vladimir Pastushak:

 Благодарю Вас.

Алексей, Ваш пример не работает, все равно в наследнике вываливаются методы родителя которые не должны вываливаться.

 


Не должно быть такого, код можете кинуть?

Те данные, что в родителе были protected и public будут protected при protected-наследовании .

	          
 
  1. Устанавливаем руками на ГОЛЫЙ чарт индикатор
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define TOSTRING(A) #A + " = " + (string)A + "\n"
    
    int OnCalculate( const int rates_total,
                     const int prev_calculated,
                     const datetime &time[],
                     const double &open[],
                     const double &high[],
                     const double &low[],
                     const double &close[],
                     const long &tick_volume[],
                     const long &volume[],
                     const int &spread[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Удаляем руками индикатор с чарта.
  3. В логе видим, что индикатор продолжает выполняться. Можно закрыть все чарты в терминале, но он все равно будет выполняться. И это не поможет, конечно,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. Перезагрузка терминала останавливает выполнение индикатора.
  5. Это сколько же может индикаторов выполняться вот так в холостую, а мы о них ни слухом, ни духом?! Контроля нет совсем.
 
fxsaber:
  1. Устанавливаем руками на ГОЛЫЙ чарт индикатор
  2. Удаляем руками индикатор с чарта.
  3. В логе видим, что индикатор продолжает выполняться. Можно закрыть все чарты в терминале, но он все равно будет выполняться.
  4. Перезагрузка терминала останавливает выполнение индикатора.
  5. Это сколько же может быть индикаторов выполняться вот так вхолостую, а мы о них ни слухом, ни духом?! Контроля нет совсем.

Невозможно читать и смотреть коды с #define и с ::

 

Пожалуйста перепишите коды в стилистике общепринятого MQL5. 

 
fxsaber:
  1. Устанавливаем руками на ГОЛЫЙ чарт индикатор
  2. Удаляем руками индикатор с чарта.
  3. В логе видим, что индикатор продолжает выполняться. Можно закрыть все чарты в терминале, но он все равно будет выполняться.
  4. Перезагрузка терминала останавливает выполнение индикатора.
  5. Это сколько же может индикаторов выполняться вот так в холостую, а мы о них ни слухом, ни духом?! Контроля нет совсем.
Добавление проверки флага _StopFlag не поможет?
 
Karputov Vladimir:

Невозможно читать и смотреть коды с #define и с ::

 

Пожалуйста перепишите коды в стилистике общепринятого MQL5. 

Это и есть стилистика MQL5. Изучите, пожалуйста, что такое #define и что такое ::.
 
Alexey Kozitsyn:
Добавление проверки флага _StopFlag не поможет?
А куда его добавлять и как это хотя бы теоретически может помочь. Это баг терминала. Причем серьезный баг. Потому как мне повезло - я вижу в логе, что индикатор работает. А сколько вот таких индикаторов без выводов в логи пашут в терминале, а Вы о них ничего совсем не знаете. Вот только темы поднимаются, а почему у меня CPU так грузится на пустом терминале?
 
fxsaber:
Это и есть стилистика MQL5. Изучите, пожалуйста, что такое #define и что такое ::.
Я не об этом. "::" вообще не нужны в Ваших примерах - может это Ваша привычка, но там они вообще не нужны. И без #defane код нормально пишется. Просто попробуйте переписать - код станет чистым - авось сразу что-то станет видно.
 
Karputov Vladimir:
Я не об этом. "::" вообще не нужны в Ваших примерах - может это Ваша привычка, но там они вообще не нужны. И без #defane код нормально пишется. Просто попробуйте переписать - код станет чистым - авось сразу что-то станет видно.

У меня всего в одном месте был "::". И я не пишу коды с нуля. Как правило, что-то вырываю из своих кодов. Вот :: затесался один через копи-пасту. Никогда на него не обратил бы внимание, но убрал, раз так Вам легче.

А вот #define убирать - принципиально нет. 99% кода можно написать без него. Это не повод убирать его.

И есть 1% (условно), когда без #define НЕВОЗМОЖНО!

 
fxsaber:

У меня всего в одном месте был "::". И я не пишу коды с нуля. Как правило, что-то вырываю из своих кодов. Вот :: затесался один через копи-пасту. Никогда на него не обратил бы внимание, но убрал, раз так Вам легче.

А вот #define убирать - принципиально нет. 99% кода можно написать без него. Это не повод убирать его.

И есть 1% (условно), когда без #define НЕВОЗМОЖНО!

Если отказаться от копирования буфера:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(handle!=INVALID_HANDLE)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      //if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
      //   Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

то индикатор успешно заканчивает свою работу 

2016.09.23 12:11:12.655 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:14.794 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:15.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:16.936 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #4 OnDeinit