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

 
fxsaber:

У меня не работает - до OnDeinit не доходит даже.

И заметьте, у меня в логе числа совпадают, а у Вас - нет. Мой лог

У меня в терминале ни одного индикатора и советника не запущено.

У меня такая конфигурация:

2016.09.23 12:25:34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09.23 12:25:34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+02:00
2016.09.23 12:25:34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(После перезапуска термнала, вкладка "Журнал", первые три строчки)

 
Karputov Vladimir:

У меня такая конфигурация:

(После перезапуска термнала, вкладка "Журнал", первые три строчки)

2016.09.23 12:42:22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09.23 12:42:22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+02:00
2016.09.23 12:42:22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber:

Неоднозначно. На х32 машине:

2016.09.23 13:23:55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09.23 13:23:55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00, UAC, Intel Atom  Z3740 @ 1.33GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+02:00
2016.09.23 13:23:55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


не  работает.

 
Andrey Barinov:
Они "вываливаются", но при попытке их вызова будет ошибка компиляции.

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

Я победил свою проблему так в родителе все протектед и наследование идет под протектед далее переопределение. 

 
Karputov Vladimir:

Неоднозначно. На х32 машине:


не  работает.

Заявку оформил, хоть и задолбало это делать столь часто.
 
fxsaber:

Как в индикаторе узнать свой хэндл на чарте? Через ChartIndicatorName не подходит, т.к. он возвращает короткое имя. А с таким же именем может уже быть уже запущен этот же индикатор с другими входными параметрами.

Мне это нужно, чтобы индикатор имел возможность удалить себя с чарта и расчетов. 

Возможно вы уже разобрались с этим вопросом, но на всякий случай уточню. Хэндл индикатора фактически является лишь адресацией на описание индикатора внутри создавшей его программы (т.е. эксперт, индикатор, скрипт), можно считать что это некий "номер". Из этого следует, что этот "номер" не имеет никакого смысла вне программы создавшей индикатор (получившей его хэндл). И даже программа вызывающая функцию ChartIndicatorGet() не получает некий глобальный хэндл индикатора, а лишь создает у себя описание этого индикатора и выделяет "номер" этого описания для адресации. Глобального хэндла индикатора, уникального в рамках всего терминала, не существует.

Использование короткого имени можно посмотреть в примерах. Можно так:

   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");

Решается проблема "уже запущен этот же индикатор с другими входными параметрами".

Да и визуально понятнее какой индикатор работает:


 
Anton:

Возможно вы уже разобрались с этим вопросом, но на всякий случай уточню. Хэндл индикатора фактически является лишь адресацией на описание индикатора внутри создавшей его программы (т.е. эксперт, индикатор, скрипт), можно считать что это некий "номер". Из этого следует, что этот "номер" не имеет никакого смысла вне программы создавшей индикатор (получившей его хэндл). И даже программа вызывающая функцию ChartIndicatorGet() не получает некий глобальный хэндл индикатора, а лишь создает у себя описание этого индикатора и выделяет "номер" этого описания для адресации. Глобального хэндла индикатора, уникального в рамках всего терминала, не существует.

Использование короткого имени можно посмотреть в примерах. Можно так:

Решается проблема "уже запущен этот же индикатор с другими входными параметрами".

Да и визуально понятнее какой индикатор работает:

Спасибо, мне stringo примерно так и объяснил какое-то время назад. Я нашел несколько способов определить, что хэндл принадлежит "мне":

  1. Меняю крайнее значение индикаторного буфера и сравниваю с соответствующим значением CopyBuffer. Если совпадает - это "я". На этом идее и получился неудаляемый индикатор.
  2. Меняю ShortName и сравниваю с ChartIndicatorName.

 
fxsaber:

На этом идее и получился неудаляемый индикатор.

Это про организацию ссылки на "самого себя"? Так это не "получился", а вы сами так экзотично индикатор написали.

Если вас смущает такое поведение индикатора, то просто не делайте так.

А куда его добавлять и как это хотя бы теоретически может помочь. Это баг терминала. Причем серьезный баг. Потому как мне повезло - я вижу в логе, что индикатор работает. А сколько вот таких индикаторов без выводов в логи пашут в терминале, а Вы о них ничего совсем не знаете. Вот только темы поднимаются, а почему у меня CPU так грузится на пустом терминале?

Есть довольно много способов "выстрелить себе в ногу". Индикатор можно банально зациклить. И сделать это случайно гораздо проще, чем случайно написать вашу конструкцию. Это тоже "баг терминала"?

 
Anton:

Это про организацию ссылки на "самого себя"? Так это не "получился", а вы сами так экзотично индикатор написали.

Если вас смущает такое поведение индикатора, то просто не делайте так.

Есть довольно много способов "выстрелить себе в ногу". Индикатор можно банально зациклить. И сделать это случайно гораздо проще, чем случайно написать вашу конструкцию. Это тоже "баг терминала"?

Баг терминала, это когда возможно неснимаемое выполнение тяжелого индикатора без ведома пользователя на полностью пустом (без открытых чартов) терминале. И потом вопросы, почему Ваш терминал грузит CPU на ровном месте? Это баг! Внутреннего диспетчера задач нет, контроля никакого.
 
Anton:

Это про организацию ссылки на "самого себя"? Так это не "получился", а вы сами так экзотично индикатор написали.

Это не экзотика, а попытка самоидентифицироваться в индикаторе. Попытался более цивилизованно это сделать вылилась в облом
#property indicator_separate_window
#property indicator_buffers 0
#property indicator_plots   0

bool WhereIAm( long &Chart_ID, int &Sub_Window )
{
  const string PrevShortName = MQLInfoString(MQL_PROGRAM_NAME);  
  
  MathSrand((int)TimeCurrent());
  const string ShortName = (string)MathRand();
    
  IndicatorSetString(INDICATOR_SHORTNAME, ShortName);    
  
  Chart_ID = ChartFirst();

  Print(Chart_ID);
  
  while (Chart_ID > 0)
  {
    const int Total = (int)ChartGetInteger(Chart_ID, CHART_WINDOWS_TOTAL);
    
    for (Sub_Window = 0; Sub_Window < Total; Sub_Window++)
    {
      const int TotalIndicators = ChartIndicatorsTotal(Chart_ID, Sub_Window);
      
      for (int i = 0; i < TotalIndicators; i++)
        if (ShortName == ChartIndicatorName(Chart_ID, Sub_Window, i))
        {
          IndicatorSetString(INDICATOR_SHORTNAME, PrevShortName);
          
          return(true);
        }
    }
    
    Chart_ID = ChartNext(Chart_ID);
  }

  IndicatorSetString(INDICATOR_SHORTNAME, PrevShortName);
  
  return(false);
}


#define TOSTRING(A) #A + " = " + (string)A + " "

void OnInit( void )
{
  long Chart_ID;
  int Sub_Window;
  
  if (WhereIAm(Chart_ID, Sub_Window))
    Print(TOSTRING(Chart_ID) + TOSTRING(Sub_Window));
    
  return;
}
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[] )
{
  return(rates_total);
}
Так вот фигушки, потому что в Сервисдеске, мягко говоря, ввели в заблуждение.