Выпущен MetaTrader 4 Client Terminal build 600 с обновленным языком MQL4 и Маркетом приложений - страница 65

 
Insight:

У экспертов, скомпилированных старым компилятором (509 билд), при смене тайм-фрейма обнуляются глобальные переменные.
Проще говоря, все данные и настройки которые эксперт накопил на момент смены тайм-фрейма будут удалены.

При компиляции эксперта новым компилятором, такой проблемы нет.


Шаги для воспроизведения проблемы:

1. Создаю эксперт с кодом:

2. Компилирую старым компилятором (509 билд)

3. Запускаю эксперт в старом МТ (509 билд) -->> Print выдаст "g = 0"
4. Меняю тайм-фрейм -->> Print выдаст "g = 2"

5. Запускаю эксперт в новом МТ (604 билд) -->> Print выдаст "g = 0"

6. Меняю тайм-фрейм -->> Print выдаст "g = 0"



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

Исправим в ближайшее время

 
iWPR(0,0,WPR_PERIOD,BAR_AGO) возвращает 0, а не значение буфера. Заметил когда у советника после обновления "сорвало крышу". Проверил на разных терминалах (600 и 604 билд).
 
GSB:

Разработчики, я ввел людей в заблуждение.

Действительно в Справке 605 функция ChartIndicatorAdd() есть а редактор пишет что нет.


Вам нужно обновить справку, эту функцию уже убрали
 
Rosh:

Вам нужно обновить справку, эту функцию [ ChartIndicatorAdd() ] уже убрали

Во- первых, в 604 в справке функции ChartIndicatorAdd() как раз не было а в 605 она есть.


Во-вторых, почему убрали? Она функциональна и востребована

 

На такой код:

    int handle = WindowHandle (Symbol(), Period());

новый компилятор не ругается. А, согласно справочнику, вторым аргументом должна передаваться переменная типа string:

int  WindowHandle(
   string       symbol,     // символ
   string       timeframe   // период
   );

Вроде слышал, что новый компилятор не производит принудительно приведения типов. Где я не прав?

 
altiveus:
iWPR(0,0,WPR_PERIOD,BAR_AGO) возвращает 0, а не значение буфера. Заметил когда у советника после обновления "сорвало крышу". Проверил на разных терминалах (600 и 604 билд).

Отруби руки тому кто такой код написал.


Вот ещё один https://forum.mql4.com/ru/60554/page31#904618

Чуток подальше ему всё объяснили. Повторять не хочется.

 
GSB:

Во- первых, в 604 в справке функции ChartIndicatorAdd() как раз не было а в 605 она есть.

Во-вторых, почему убрали? Она функциональна и востребована


1. Справка собирается независимо от других компнентов. К билдам никак не привязана. Обновитесь

2. Потому что в MQL4 нет понятия "хендл индикатора"

 
Rosh:

1. Справка собирается независимо от других компнентов. К билдам никак не привязана. Обновитесь

2. Потому что в MQL4 нет понятия "хендл индикатора"


Возможно хэндла и нет у пользовательких, но функция удаления по имени индикатора есть, почему так не сделать по имени индикатора?

Во-вторых, через PostMessage() же можно вызвать пользовательский индикатор по номеру в списке, ну а для штатных то наверняка и хэндлы есть

#property show_inputs

#include <winuser32.mqh>

extern int command = 34300; // порядковый номер в списке пользовательских индикаторов

//+------------------------------------------------------------------+
//| Script program start function                                              |
//+------------------------------------------------------------------+

void OnStart()
  {
// коды скрипта

//  вызов индикатора
    IndicatorAdd(command);

}
//+------------------------------------------------------------------+
//------- function ------
void IndicatorAdd(int cmd)
  {
  int hw = WindowHandle(Symbol(),Period());
  PostMessageA(hw, WM_COMMAND, cmd, 0);
//---
  
  }
//+------------------------------------------------------------------+

Пока не знаю только как параметры передать те что нужны, с тем чтобы окно установок параметров не вызывалось

 
GSB:

Возможно хэндла и нет у пользовательких, но функция удаления по имени индикатора есть, почему так не сделать по имени индикатора?

Во-вторых, через PostMessage() же можно вызвать пользовательский индикатор по номеру в списке, ну а для штатных то наверняка и хэндлы есть

Пока не знаю только как параметры передать те что нужны, с тем чтобы окно установок параметров не вызывалось


Тут готовое решение есть. Только параметры по умолчанию. Пока не заморачивался с их передачей.

 //=======================================================================================================================================
 // 8.8.2. Функция загружает на указанный график пользовательский индикатор по его имени. Функция предназначена для UNICODE-строк.
 void ServiceLoadCustomIndicatorW(int    hwndChart,      // Системный дескриптор окна графика, куда загружается индикатор.
                                  string sNameIndicator, // Имя загружаемого индикатора.
                                  int    bOK);           // Подтверждение запуска индикатора, при наличии диалогового окна свойств индикатора.
                                                         //   TRUE  - автонажатие на кнопку "OK" разрешено.
                                                         //   FALSE - автонажатие на кнопку "OK" запрещено.
 //=======================================================================================================================================
 // 8.9.2. Функция загружает на указанный график эксперт по его имени. Функция предназначена для UNICODE-строк.
 void ServiceLoadExpertW(int    hwndChart,   // Системный дескриптор окна графика, куда загружается эксперт.
                         string sNameExpert, // Имя загружаемого эксперта.
                         int    bOK);        // Подтверждение запуска эксперта, при наличии диалогового окна свойств эксперта.
                                             //   TRUE  - автонажатие на кнопку "OK" разрешено.
                                             //   FALSE - автонажатие на кнопку "OK" запрещено.
 //=======================================================================================================================================
 // 8.10.2. Функция загружает на указанный график скрипт по его имени. Функция предназначена для UNICODE-строк.
 void ServiceLoadScriptW(int    hwndChart,   // Системный дескриптор окна графика, куда загружается скрипт.
                         string sNameScript, // Имя загружаемого скрипта.
                         int    bOK);        // Подтверждение запуска скрипта, при наличии диалогового окна свойств скрипта.
                                             //   TRUE  - автонажатие на кнопку "OK" разрешено.
                                             //   FALSE - автонажатие на кнопку "OK" запрещено.
                                             // Скрипт может не иметь параметров и окна свойств!
                                             // При использовании метода для загрузки скрипта из скрипта на текущем графике параметр не работает
                                             // из-за невозможности одновременной работы двух скриптов на одном графике.
 //=======================================================================================================================================
 // 8.11.2. Функция загружает на указанный график стандартный индикатор по его имени. Функция предназначена для UNICODE-строк.
 void ServiceLoadStdIndicatorW(int    hwndChart,      // Системный дескриптор окна графика, куда загружается индикатор.
                               string sNameIndicator, // Имя загружаемого индикатора.
                               int    bOK);           // Подтверждение запуска индикатора, при наличии диалогового окна свойств индикатора.
                                                      //   TRUE  - автонажатие на кнопку "OK" разрешено.
                                                      //   FALSE - автонажатие на кнопку "OK" запрещено.
 //=======================================================================================================================================
 

MT4 билд 604

Использую:

#import "kernel32.dll"
int GetLastError(void);
...
#import

Вызовы типа kernel32::GetLastError() проходят успешно, а вот на обычные вызовы встроенной функции приводят к ошибке:

'GetLastError' - ambiguous call to overloaded function with the same parameters
Кто-нибудь сталкивался с этим?

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