МТ5 удивляет. А он работает с логическими выражениями? - страница 2

 

ehoc:

А ведь есть люди не знающие с++.  Как вы думаете, смогут они освоить MQL5 ?

А ведь есть люди не знающие c++, Как вы думаете, смогут они освоить java, php и другие?
На MQL5 свет клином сошелся? Обычный язык программирования, круче mql4.

Да и на mql4 он похож, просто конструкции поменялись из-за расширенных возможностей.

 

Действительно, совместимость с MT4 можно было сохранить при желании. Многие вещи специально зачем-то были переиначены (начиная с мелочей вроде DoubleToStr и заканчивая более важными вещами а-ля MarketInfo). Не было никакой сложости оставить по возможности старые функции в качестве "синонимов" для новых, но так не было сделано. В результате сейчас прикладники пишут обертки для себя, чтобы вещи из МТ4 можно было быстро перевести на МТ5.

Меня больше всего поразил в MQL5 другой факт: с одной стороны декларация ООП подхода, а с другой - реализация API в виде процедурных вызовов, причем поделенных по принципу типа данных (с суффиксами XXXInteger, XXXDouble и т.д.). Для ООП языка было б лучше во всех отношениях иметь доступ к функционалу ядра в виде интерфейсов (объектов, классов со своими методами), реализованных внутри системы: Account, Position, Symbol, History и т.д. Сейчас все это запихивается на прикладном уровне в библиотеку на mql5, т.е. по сути, внутри терминала есть свой объект, например, позиции, и он на уровне API расчленяется на всякие даблы, стринги и пр., а потом в mql5 обратно собирается уже в другой объект-копию позиции. Смысла в таком двойном преобразовании туда-сюда не угадывается. Версионность библиотеки наверняка привнесет свои проблемы.

Ну уж, что сделано - то сделано. Хотели, как лучше ;-).
Документация по MQL5: Основы языка / Типы данных
Документация по MQL5: Основы языка / Типы данных
  • www.mql5.com
Основы языка / Типы данных - Документация по MQL5
 

marketeer:

Сейчас все это запихивается на прикладном уровне в библиотеку на mql5, т.е. по сути, внутри терминала есть свой объект, например, позиции, и он на уровне API расчленяется на всякие даблы, стринги и пр., а потом в mql5 обратно собирается уже в другой объект-копию позиции. Смысла в таком двойном преобразовании туда-сюда не угадывается. Версионность библиотеки наверняка привнесет свои проблемы.

Ну уж, что сделано - то сделано. Хотели, как лучше ;-).

Вполне нормальное решение и для MQ и для тех кто буде пользоваться MQL5. Доходчиво, безопасно и вполне логично.

Если сомневаетесь, представьте на минуту ТРУДНОСТИ компилятора связанные с разбором "каши" которая возвращается и передается в тот же MarketInfo.

Разработчикам это надо?

Тем более всем кому это нужно было все давно реализовали в виде классов или функций-оберток.

К примеру думаете это функционал MQL4?

//Возвращает день месяца последнего известного времени сервера
int Day();
//Возвращает порядковый номер дня недели (воскресенье-0,1,2,3,4,5,6)
int DayOfWeek();
//Возвращает текущий день года (1-1 января,..,365(6) - 31 декабря)
int DayOfYear();
//Возвращает текущий час (0,1,2,..23) последнего известного серверного времени
int Hour();
//Возвращает текущую минуту (0,1,2,..59) последнего известного серверного времени
int Minute();
//Возвращает номер текущего месяца (1-Январь,2,3,4,5,6,7,8,9,10,11,12)
int Month();
//Возвращает количество секунд, прошедших с начала текущей минуты
int Seconds();
//Возвращает день месяца (1 - 31) для указанной даты
int TimeDay(datetime date);
//Возвращает день недели (0-Воскресенье,1,2,3,4,5,6) для указанной даты
int TimeDayOfWeek(datetime date);
//Возвращает день (1 - 1 января,..,365(6) - 31 декабря) года для указанной даты
int TimeDayOfYear(datetime date);
//Возвращает час для указанного времени
int TimeHour(datetime time);
//Возвращает минуты для указанного времени
int TimeMinute(datetime time);
//Возвращает номер месяца для указанного времени (1-Январь,2,3,4,5,6,7,8,9,10,11,12)
int TimeMonth(datetime time);
//Возвращает количество секунд, прошедших с начала минуты для указанного времени
int TimeSeconds(datetime time);

А почему вот это не должно работать в MQL5?

//Returns TRUE if expert works in regimen of the testing, otherwise returns FALSE
bool IsTesting();
//Returns TRUE if expert works in regimen of the optimization of the testing
bool IsOptimization();
//Returns TRUE if expert is tested in mode of the visualizations
bool IsVisualMode();

Почему не может работать это?

//Возвращает состояние главного соединения клиентского терминала с сервером
bool IsConnected();
//Возвращает TRUE, если DLL вызов функции разрешены, иначе возвращает FALSE
bool IsTerminalDllsAllowed();
//Возвращает TRUE, если есть разрешение нп использование DLL для данной программы
bool IsDllsAllowed();
//Возвращает TRUE, если в клиентском терминале разрешен запуск экспертов
//В MT5 считается устаревшей функцией, поскольку эксперт торгует постоянно
bool IsExpertEnabled();
//Возвращается TRUE, если в параметрах терминала разрешена автоматическая торговля
bool IsTerminalTradeAllowed();
//Возвращается TRUE, если эксперту разрешено торговать, иначе возвращает FALSE
bool IsTradeAllowed();

или это?

//Возвращает название брокерской компании, в которой зарегистрирован текущий счет
string AccountCompany();
//Возвращает наименование валюты для текущего счета
string AccountCurrency();
//Режим расчета свободных средств, разрешенных для открытия позиций на текущем счете
//Пока постоянно ввозвращает 0
double AccountFreeMarginMode();
//Возвращает значение плеча для текущего счета
long AccountLeverage();
//Возвращает имя пользователя текущего счета
string AccountName();
//Возвращает номер текущего счета
long AccountNumber();
//Возвращает имя активного сервера
string AccountServer();
//Возвращает значение уровня, по которому определяется состояние Stop Out
double AccountStopoutLevel();
//Возвращает режим расчета уровня Stop Out
int AccountStopoutMode();
//Возвращает значение уровня, по которому определяется состояние Margin Call
double AccountMarginCallLevel();
//Возвращается TRUE, если программа работает на демонстрационном счете
bool IsDemo();

Может и это тоже не будет работать?

//Возвращает значение баланса активного счета (сумма денежных средств на счете)
double AccountBalance();
//Возвращает сумму собственных средств для текущего счета
double AccountEquity();
//Возвращает сумму залоговых средств, используемых для поддержания открытых позиций
double AccountMargin();
//Возвращает значение свободных средств, разрешенных для открытия позиций на текущем счете
double AccountFreeMargin();
//Возвращает значение прибыли/убытка для текущего счета в базовой валюте
double AccountProfit();
//Возвращает значение кредита для активного счета
double AccountCredit();

Почему бы теперь MarketInfo не превратиться в нечто подобное?

//Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
//MODE_DIGITS - Количество цифр после десятичного точки в цене инструмента 
//MODE_SPREAD - Спрэд в пунктах
//MODE_STOPLEVEL   - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах 
//MODE_TRADEALLOWED   - Разрешение торгов по указанному инструменту
//MODE_PROFITCALCMODE - Способ расчета прибыли. 0 - Forex; 1 - CFD; 2 - Futures 
//MODE_FREEZELEVEL    - Уровень заморозки ордеров в пунктах
int MarketInfoInt(string symbol,ENUM_MT4_MARKETINFO_INT type);
//Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
//MODE_LOW   - Минимальная дневная цена
//MODE_HIGH  - Максимальная дневная цена 
//MODE_BID   - Последняя поступившая цена предложения для инструмента
//MODE_ASK   - Последняя поступившая цена продажи для инструмента
//MODE_POINT - Размер пункта в валюте котировки для текущего инструмента
//MODE_LOTSIZE   - Размер контракта в базовой валюте инструмента 
//MODE_TICKVALUE - Размер минимального изменения цены инструмента в валюте депозита
//MODE_TICKSIZE  - Минимальный шаг изменения цены инструмента в валюте котировки
//MODE_SWAPLONG  - Размер свопа для длинных позиций
//MODE_SWAPSHORT - Размер свопа для коротких позиций
//MODE_MINLOT    - Минимальный размер лота
//MODE_LOTSTEP   - Шаг изменения размера лота
//MODE_MAXLOT    - Максимальный размер лота
//MODE_MARGININIT        - Начальные залоговые требования для 1 лота
//MODE_MARGINMAINTENANCE - Размер залоговых средств для поддержки открытых позиций
//MODE_MARGINHEDGED      - Маржа, взимаемая с перекрытых позиций в расчете на 1 лот
//MODE_MARGINREQUIRED    - Размер свободных средств для открытия 1 лота на покупку
double MarketInfoDouble(string symbol,ENUM_MT4_MARKETINFO_DOUBLE type);
//Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
//MODE_TIME - Время поступления последней котировки
//MODE_SYMBOL_STARTING   - Дата начала торгов по инструменту (обычно используется для фьючерсов)
//MODE_SYMBOL_EXPIRATION - Дата окончания торгов по инструменту (обычно используется для фьючерсов)
datetime MarketInfoTime(string symbol,ENUM_MT4_MARKETINFO_TIME type);

Может и к тайм-сериям теперь обратиться нет возможности, Примерно так?

//Возвращает количество баров на определенном графике
int iBars(string symbol,int SecondsToTF = 0); //передается число секунд в ТФ
//Функция возвращает смещение бара, которому принадлежит указанное время
int iBarShift(string symbol,int SecondsToTF, datetime time = -1, bool exact = false);
//Возвращает значение цены закрытия указанного бара с соответствующего графика
double iClose(string symbol, int timeframe, int shift);
//Возвращает значение максимальной цены указанного параметром shift бара с соответствующего графика
double iHigh(string symbol, int timeframe, int shift);
//Возвращает индекс найденного наибольшего значения (смещение относительно текущего бара)
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0); 
//Возвращает значение минимальной цены указанного параметром shift бара с соответствующего графика
double iLow(string symbol, int timeframe, int shift);
//Возвращает индекс найденного наименьшего значения (смещение относительно текущего бара)
int iLowest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0);
//Возвращает значение времени открытия указанного параметром shift бара с соответствующего графика
datetime iTime(string symbol, int timeframe, int shift);
//Возвращает значение тикового объема указанного параметром shift бара с соответствующего графика
double iVolume(string symbol, int timeframe, int shift);

PS

- Думаешь мы дышим воздухом, здесь, в этом месте? (Из диалога Нео и Морфиуса. Произвольный перевод)


 
Interesting:

Вполне нормальное решение и для MQ и для тех кто буде пользоваться MQL5. Доходчиво, безопасно и вполне логично.

Если сомневаетесь, представьте на минуту ТРУДНОСТИ компилятора связанные с разбором "каши" которая возвращается и передается в тот же MarketInfo.

Разработчикам это надо?

Ужас. Все с ног на голову. Выделил жирным только три пункта (остальное по факту в поддержку моей же точки зрения, только вы этого видимо не осознаете). 1) нелогично, неудобно, нетехнологично и не имеет отношения к безопасности (не улучшает её); 2) "каши" для компилятора ничуть не жалко - наоборот - важно, чтобы "каши" было меньше для прикладника за счет её поедания компилятором; 3) да, именно разработчикам это было бы надо, если бы ставилась цель разработать платформу, упрощающую жизнь прикладникам/трейдерам, а не перекладывать на них задачи системного уровня. Но впрочем не вижу смысла дискутировать по этому поводу. "Пианист играет как умеет".
 
marketeer:

Действительно, совместимость с MT4 можно было сохранить при желании. Многие вещи специально зачем-то были переиначены (начиная с мелочей вроде DoubleToStr и заканчивая более важными вещами а-ля MarketInfo). Не было никакой сложости оставить по возможности старые функции в качестве "синонимов" для новых, но так не было сделано. В результате сейчас прикладники пишут обертки для себя, чтобы вещи из МТ4 можно было быстро перевести на МТ5.

Меня больше всего поразил в MQL5 другой факт: с одной стороны декларация ООП подхода, а с другой - реализация API в виде процедурных вызовов, причем поделенных по принципу типа данных (с суффиксами XXXInteger, XXXDouble и т.д.). Для ООП языка было б лучше во всех отношениях иметь доступ к функционалу ядра в виде интерфейсов (объектов, классов со своими методами), реализованных внутри системы: Account, Position, Symbol, History и т.д. Сейчас все это запихивается на прикладном уровне в библиотеку на mql5, т.е. по сути, внутри терминала есть свой объект, например, позиции, и он на уровне API расчленяется на всякие даблы, стринги и пр., а потом в mql5 обратно собирается уже в другой объект-копию позиции. Смысла в таком двойном преобразовании туда-сюда не угадывается. Версионность библиотеки наверняка привнесет свои проблемы.

Ну уж, что сделано - то сделано. Хотели, как лучше ;-).
marketeer:
Ужас. Все с ног на голову. Выделил жирным только три пункта (остальное по факту в поддержку моей же точки зрения, только вы этого видимо не осознаете). 1) нелогично, неудобно, нетехнологично и не имеет отношения к безопасности (не улучшает её); 2) "каши" для компилятора ничуть не жалко - наоборот - важно, чтобы "каши" было меньше для прикладника за счет её поедания компилятором; 3) да, именно разработчикам это было бы надо, если бы ставилась цель разработать платформу, упрощающую жизнь прикладникам/трейдерам, а не перекладывать на них задачи системного уровня. Но впрочем не вижу смысла дискутировать по этому поводу. "Пианист играет как умеет".

Ужас. Где и в чем вы увидели ужас?

1. При желании можно все. К примеру, я почти год назад начал работу с MQL5 (не знакомство, а именно работу) с вопроса именно миграции.

В результате уже пол года пользуюсь синтаксисом MQL4. Для решений связанных с ООП конечно имеется свой подход, но это уже ООП...

2. По поводу MarketInfo - И как Вы себе представляете наличие MarketInfo в MQL5 (причем в том виде в каком она была в MQL4)?

3. Возможно в будущем, когда основа языка будет сформирована разработчики создадут спецпальный раздел с "устаревшими" функциями, как это было сделано в MQL4 для некоторых функция.

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

Кроме всего прочего разработчики ориентируются на ООП, а значит они сознательно идут на замену старого функционала специализированными классами. Причем весь необходимый минимум постовляется в виде стандартных библиотек (кому не достаточно могут разрабатывать свою библиотеку классов, со своим функционалом)

Для тех же кто сейчас хочет пользоваться синтаксисом MQL4 есть три известных и удобных способа:

а) Писать свою "миграционную" библиотеку. По примеру той что сделал для себя я

б) воспользоваться  общедоступной статьей - Переход с MQL4 на MQL5

в) заказать все что требуется через сервис работа

Надеюсь в будущем начнет работать и магазин.

ЧТО В ЭТОМ НЕ ЛОГИЧНОГО?

4. Пишут обертки, пишут свои классы. И в чем собственно проблемы?

5. Вернемся к нашим баранам. есть суффиксы и что с того? есть предложения как сделать работу более надежной и комфортной, при этом не усложнив к язык на порядок?

вернемся к всеми известной по MQL4 MarketInfo, упомянутой выше. Представьите теперь себе на минуту что нужно применить в языке для того чтобы компилятор, транслятор и прочие вещи (обычно находящиеся за кулисами этого театра) корректно все обрабатывал.

Не проще, логичней и безопасней использовать суффиксы? Думаете я от хорошей жизни реализовал все именно так?

//Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
//MODE_DIGITS - Количество цифр после десятичного точки в цене инструмента 
//MODE_SPREAD - Спрэд в пунктах
//MODE_STOPLEVEL   - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах 
//MODE_TRADEALLOWED   - Разрешение торгов по указанному инструменту
//MODE_PROFITCALCMODE - Способ расчета прибыли. 0 - Forex; 1 - CFD; 2 - Futures 
//MODE_FREEZELEVEL    - Уровень заморозки ордеров в пунктах
int MarketInfoInt(string symbol,ENUM_MT4_MARKETINFO_INT type);
//Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
//MODE_LOW   - Минимальная дневная цена
//MODE_HIGH  - Максимальная дневная цена 
//MODE_BID   - Последняя поступившая цена предложения для инструмента
//MODE_ASK   - Последняя поступившая цена продажи для инструмента
//MODE_POINT - Размер пункта в валюте котировки для текущего инструмента
//MODE_LOTSIZE   - Размер контракта в базовой валюте инструмента 
//MODE_TICKVALUE - Размер минимального изменения цены инструмента в валюте депозита
//MODE_TICKSIZE  - Минимальный шаг изменения цены инструмента в валюте котировки
//MODE_SWAPLONG  - Размер свопа для длинных позиций
//MODE_SWAPSHORT - Размер свопа для коротких позиций
//MODE_MINLOT    - Минимальный размер лота
//MODE_LOTSTEP   - Шаг изменения размера лота
//MODE_MAXLOT    - Максимальный размер лота
//MODE_MARGININIT        - Начальные залоговые требования для 1 лота
//MODE_MARGINMAINTENANCE - Размер залоговых средств для поддержки открытых позиций
//MODE_MARGINHEDGED      - Маржа, взимаемая с перекрытых позиций в расчете на 1 лот
//MODE_MARGINREQUIRED    - Размер свободных средств для открытия 1 лота на покупку
double MarketInfoDouble(string symbol,ENUM_MT4_MARKETINFO_DOUBLE type);
//Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
//MODE_TIME - Время поступления последней котировки
//MODE_SYMBOL_STARTING   - Дата начала торгов по инструменту (обычно используется для фьючерсов)
//MODE_SYMBOL_EXPIRATION - Дата окончания торгов по инструменту (обычно используется для фьючерсов)
datetime MarketInfoTime(string symbol,ENUM_MT4_MARKETINFO_TIME type);

А может я не интересовался у разработчиков как это лучше реализовать?

6. Разработчиками создается стандартная библиотека классов, реализованная в виде MQL5. Чем именно это вам не нравится?

7. Внутри терминала (и сервера) много чего есть, и это может быть реализовано в каком угодно виде. Причем тут MQL5?

Разработчики не раз декларировали то что при создании языка MQL5 их интересует: безопасность, функциональность и простота будущего языка (именно в таком порядке).



 
Interesting:

6. Разработчиками создается стандартная библиотека классов, реализованная в виде MQL5. Чем именно это вам не нравится?

мне ненужна!!! и не думаю только мне.. НЕНУЖНА стандартная гигансткая библиотека классов!.. хочеться своего, и понимать что и где ты делаешь...

библиотека на открытие, на закрытие, на обчисления, на трал, на то.. на се.. ЗАЧЕМ??

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

 
maryan.dirtyn:

мне ненужна!!! и не думаю только мне.. НЕНУЖНА стандартная гигансткая библиотека классов!.. хочеться своего, и понимать что и где ты делаешь...

библиотека на открытие, на закрытие, на обчисления, на трал, на то.. на се.. ЗАЧЕМ??

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

Это вы зря, я вот попользовался библиотекой - понравилось.
Хотя по началу я тоже думал что оно нафиг не надо.
Оказалось очень удобно. Закрыть позицию 1 команда, получить данные о позиции - другая команда. Естественно если начинать изучать MQL5, то надо все пощупать на низком уровне, а потом стандартная библиотека сокращает рутину в разы.

Да и скорость работы от нее не сильно уменьшается. Да и всяких очепяток в ней нет (или почти нет), из-за которых пол дня ищешь в чем ошибся.

Тем более, если хотите пощупать, все исходники можете просматривать сколько влезет.

 

Отвлеклись от темы...

нашел я причину такой ситуации (напоминаю)

было такое условие в МТ4

if (  ((x1-x2) >= (y1+y2+y3)) && x2!=-1)

{

 

в МТ5 такая конструкция всегда возвращает TRUE! но если переделать

t1 = x1-x2

t2 = y1+y2+y3

то

if ( (t1>=t2) && x2!=-1)  работает так как нужно

 

Когда меня попросили показать участок кода я не смог воспроизвести данную ошибку, сейчас ошибка повторилась и я начал искать причину

 вот что я нашел:

х1 - глобальная переменная 

х2 - глобальная переменная 

y1 - входной параметр

y2 - локальный параметр

y3 - локальный параметр 

Print x1 = 2192 

Print x2 = 2193  

Print y1=100

Print y2=2

Print y3 = 3 

х2 = вызов функции где он пересчитывается например обзовем GetNewX2()

Print x2 = 0 

if (  ((x1-x2) >= (y1+y2+y3)) && x2!=-1) 

 {

Вошли в условие 

Print x2 = 2193  

 

 

Почему так происходит? Вызов функции GetNewX2 происходит как то асинхронно?

или в чем моя ошибка? 

 еще раз тестирую
 

Print x1 = 2192 

Print x2 = 2193  

Print y1=100

Print y2=2

Print y3 = 3 

х2 = вызов функции где он пересчитывается например обховем GetNewX2()

Print x2 = 2193

if (  ((x1-x2) >= (y1+y2+y3)) && x2!=-1) 

 {

не вошли

 

 ничего не понимаю

 
А где кусок рабочего кода?

 

Говорили мне что глобальные переменные нужно использовать осторожно...

в функции GetNewX2  объявил локальную переменную х2 (и есть глобальная переменная х2) в итоге наверно и получал неоределенность со сравнением

Надо быть внимательнее) 

МТ 5 интересен, но пока тяжко во всем разобраться, вроде переделал мультивалютник с МТ4 на МТ5 

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
Причина обращения: