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

 
Karputov Vladimir:
Нельзя каждый случай неправильного стиля программирования списывать на баги.

Это что за НАЕЗД на ровном месте?! Указываю на явный баг, а мне про лапшу про "стиль".

Мне вот до A100 и Meat, как до Луны пешком. Они баги показывают, хоть я их не понимаю. Но не лезу же со своим "стилем".

 
fxsaber:
Не работает.

Привожу полный код:

//+------------------------------------------------------------------+
//|                                                      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)
   if(prev_calculated!=0)
     {
      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:34:03.318 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 18992.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 12498.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       
... экономия бумаги :)
2016.09.23 12:34:31.804 2 (SBRF-12.16,M1)       
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 5343.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 17815.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #4 OnDeinit
Файлы:
2.mq5  3 kb
 
Karputov Vladimir:

Привожу полный код:

и распечатка:

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

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

PP      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
FE      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 13573.0
IQ      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 13573.0
CF      0       12:41:08.169    Test3 (RTS-12.16,H1)    
JO      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
QI      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 25434.0
NM      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 25434.0
MJ      0       12:41:08.169    Test3 (RTS-12.16,H1)    
DJ      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
QO      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 9469.0
HK      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 9469.0
CM      0       12:41:08.187    Test3 (RTS-12.16,H1)    
JF      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
OS      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 1887.0
NG      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 1887.0
У меня в терминале ни одного индикатора и советника не запущено.
 
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.

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