Изменение входных параметров индикатора на ходу - страница 2

 
kbw74614:

А при самостоятельном выполнении OnCalculate никаких проблем не возникает. Либо это баг, либо что-то делаю неправильно.

Это либо баг, либо особенность, описание которой не нашел:

// Пример индикатора, показывающий отсутствие инициализации индикаторного буффера до завершения OnInit
#property strict

#property indicator_buffers 1

double Buffer[];

void FullOnCalculate( void )
{
  long volume[];
  int spread[];

  ArraySetAsSeries(volume, TRUE);
  ArraySetAsSeries(spread, TRUE);

  const int Size = MathMin(CopyTickVolume(Symbol(), Period(), 0, Bars, volume),
                           CopySpread(Symbol(), Period(), 0, Bars, spread));

  OnCalculate(Size, 0, Time, Open, High, Low, Close, Volume, volume, spread);

  return;
}

void OnInit( void )
{
  SetIndexBuffer(0, Buffer);

//  FullOnCalculate(); // вызывет ошибку "array out of range"

  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[])
{
  static bool FirstRun = TRUE;

  if (FirstRun)
  {
    FirstRun = FALSE;

    FullOnCalculate(); // а здесь ошибки не будет, если вызов произошел после завершения OnInit

    return(rates_total);
  }

  Buffer[0] = 0; // индикаторный буффер не инициализирован до завершения из OnInit

  return(rates_total);
}

Нельзя работать с заданными индикаторными буфферами, пока не завершится OnInit.

FullOnCalculate работает все же верно.

Осталось решить только одну проблему - отловить событие колесика мыши (см. первый пост ветки).

 
kbw74614:

Фактически так и делаю здесь:

Но такой вызов происходит, когда OnCalculate запускается сам - например, по приходу нового тика. А как вызвать OnCalculate напрямую? Например, OnStart вызвать получается без проблем. А с OnCalculate вызов  делается без проблем (как написал в FullOnCalculate), но вот что-то странное затем творится с входными массивами - выход за пределы. Пробовал все входные массивы переопределить через CopyRates в MqlRates. Но все равно происходит выход за пределы массива при выполнении вызванного OnCalculate.

 

А при самостоятельном выполнении OnCalculate никаких проблем не возникает. Либо это баг, либо что-то делаю неправильно. Прошу помочь. 

 

         int hwnd=WindowHandle(Symbol(),Period());
            if(hwnd!=0){
               PostMessageA(hwnd,WM_COMMAND,33324,0);    
            }
 
Integer:
Спасибо, рабочий вариант. Но из песочницы вылезать, наверное, следует, когда ничего уже больше не помогает. Здесь, как оказалось, не такой случай. 
 

Я вообще на 4ке делаю так и не заморачиваюсь, надеюсь предопределенные массивы таки не уберут.

Никаких выходов за пределы быть не может априори.

void OnTimer()
{
   datetime fakeDatetime[];
   double fakeDouble[];
   long fakeLong[];
   int fakeInt[];
   
   OnCalculate(Bars, IndicatorCounted(), fakeDatetime, fakeDouble, fakeDouble, fakeDouble, fakeDouble, fakeLong, fakeLong, fakeInt);
   ChartRedraw();
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &[],
                 const double &[],
                 const double &[],
                 const double &[],
                 const double &[],
                 const long &[],
                 const long &[],
                 const int &[]
   )
{
   // здесь пользуются стандратные массивы Open Close ... а в функцию передаются по сути только настройки пересчета.
}
 
Так, панелька.
Файлы:
mql4.zip  19 kb
 

А скролл наверное можно отловить только если с помощью винапи смотреть события окна графика.

Да и не особо нужно. Клавиатуры и мышки в принципе вполне хватает

 
вы это... когда скролл отловите без внешних ДЛЛок - свистите.
 
TheXpert:

Я вообще на 4ке делаю так и не заморачиваюсь, надеюсь предопределенные массивы таки не уберут.

Никаких выходов за пределы быть не может априори.

В вашем случае получается, что OnCalculate - это Event-функция, на входные параметры которой можно смело плевать. Если, например

ArraySetAsSeries(High, FALSE);

действительно, перевернет High-таймсерию, то логичнее всего делать именно так, как вы. Т.к. не вижу пока никакого разумного использования входных параметров OnCalculate.

TheXpert:
Так, панелька.

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

TheXpert:

А скролл наверное можно отловить только если с помощью винапи смотреть события окна графика.

Да и не особо нужно. Клавиатуры и мышки в принципе вполне хватает

Ну чарты мне удобнее мышкой крутить, чем клавой. Здесь, конечно, не принципиально.

 

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

ЗЫ Может, поделитесь ООП-шаблонами для написания индикаторов? 

 

Схема работы конвертера такая:

  1. Запустили на чарте индикатор/-ы, который хотим сделать правильным.
  2. Запустили конвертер-скрипт.
  3. Конвертер через WinAPI находит исходник индикатора и считывает его.
  4. Конвертер добавляет в исходник нужные строчки, чтобы индикатор стал правильным.
  5. Записывает преобразованный исходник с немного изменненым именем.
  6. Компилирует его.
  7. Пользователь видит в терминале соответствующий правильный индикатор.
  8. Старый больше не использует - незачем. Правильный - гораздо удобнее.

Мне жутко влом писать все пункты, кроме четвертого. Уверен, что все остальные пункты уже реализованы неоднократно у многих.

Сам возьмусь лишь только за выделенный пункт:

// На входе исходник индикатора
// На выходе исходник правильного индикатора
string Converter( const string Source );
Подсобите с остальными пунктами, чтобы все работало, как в схеме выше. Сделаем хорошее дело все вместе.
 
kbw74614:

ЗЫ Может, поделитесь ООП-шаблонами для написания индикаторов? 

Нету. Нахрена там ООП?