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

 
fxsaber:
Хорошо бы в потомках его тоже сделать private. Для лучшего понимания. Не суть, короче.
В потомках его вызывать надо. )
 
Sergei Vladimirov:
В потомках его вызывать надо. )
Вся фишка как раз в том, что не надо. См. мой пример.
 
fxsaber:
Вся фишка как раз в том, что не надо. См. мой пример.
Ваш пример просто другой, а суть в нём та же - в потомке переопределяется виртуальный метод базового класса. Ладно, в общем, всем всё понятно.
 

Ошибка в индикаторных буферах

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

Результат в логе

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

Отладчик при этом упорно говорит, что Buf.Buffer ВСЕГДА - dynamic array[0],I. Т.е. индикаторный буфер. Но нулевого размера, как оказывается.

Оказалось, что дебагер больше пишет в лог, чем релиз. Релиз не сообщает таких вещей

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0 detached
Неужели в MT5 индикаторный буфер можно задать только один раз?
 

А зачем такие сложности, если не секрет? Ну, кроме интереса изысканий, конечно.

Вместо вот этого (что, кстати, в принципе неправильно, потому что переинициализация может потребоваться и в процессе работы, а не только при запуске):

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

Просто вот так:

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

А зачем такие сложности, если не секрет? Ну, кроме интереса изысканий, конечно.

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

Проблема старая, как оказалось

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как скрыть сообщение "Indicator buffer #x detached"

Konstantin Ivanov, 2015.02.17 21:18

В своем индикаторе я храню массивы-буферы в экземплярах объекта.
При удалении объекта в OnDeinit(), для всех массивов привязанных к буферам (SetIndexBuffer()) отображается сообщение:

 "Indicator buffer #x detached"

Как отсоединить массив от буфера без такого сообщения?
Или как скрыть это сообщение? 

Находил ветку http://forum.mql4.com/63975, но предложенный вариант сохранения буферов в глобальном контексте мне не подходит


И мне тоже не подходит вариант сохранения буферов  в глобальном контексте. Интересно, что в MT4 все работает.

 

статья Пошаговое руководство по написанию советников в MQL5 для начинающих  Имеется код:


Разве При трех знаках не надо делить?

 
Aleksey Rodionov:

статья Пошаговое руководство по написанию советников в MQL5 для начинающих  Имеется код:


Разве При трех знаках не надо делить?

Это рудимент, оставшийся от EURUSD (5 знаков) и USDJPY (3 знака). Ошибки нет, но лучше так не делать, особенно начинающим.
 
Мне нужно задать единый интерфейс для всех наследуемых классов. В нем должен быть всегда метод Init. Но Init - как дубль конструктора, поэтому варианты входных параметров нельзя определить наперед. Как задать такой интерфейс?
 
МК, почему бы не сделать допустимым следующий синтаксис для импортируемых функций:
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Сейчас приходится городить уродливые вещи:

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

Для внутренних инлайниющихся функций не предлагаю, но для импортированных функций это ведь должно быть безопасно.

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