Библиотеки: Simple Trading

 

Simple Trading:

Простая библиотека для MT4, содержащая базовый инструментарий для выполнения торговых операций. Разместите файл "Trade.mqh" в каталоге Include, после чего библиотеку можно использовать, включив её в основной исходный код при помощи #inlcude <Trade.mqh>

Автор: Sergey Vasilev

 

Я конечно прошу прощения за мой французский, но что за массовый "индусс-стайл" в OrderSend() ?

_SL == 0 ? 0.0 : _SL
_TP == 0 ? 0.0 : _TP
Это какая-то особая магия?
 
h.i.a:

Я конечно прошу прощения за мой французский, но что за массовый "индусс-стайл" в OrderSend() ?

Это какая-то особая магия?

Равносильно:

if(_SL == 0) 
  _SL=0.0;
else
  _SL=_SL;

Почитайте

Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
  • www.mql5.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 

Виталий, вопрос не в том как работает примитивная булева логика тернарного оператора ?, Вопрос в том зачем эта логика конкретно в таком выражении, какую полезную нагрузку несёт ?

OrderSend(symbol, OP_SELLLIMIT, _volume, price, slp, _SL == 0 ? 0.0 : _SL, _TP == 0 ? 0.0 : _TP, cmnt, magic, expir)

Кроме варианта поклонения богам индусского погроммирования, есть разумные идеи? ;)

З.Ы. И кмк ваш пример не совсем корректен, _SL ничего присваиваться не будет, с каких пор "==" стал оператором присвоения значения?
 
h.i.a:

Виталий, вопрос не в том как работает примитивная булева логика тернарного оператора ?, Вопрос в том зачем эта логика конкретно в таком выражении, какую полезную нагрузку несёт ?

Кроме варианта поклонения богам индусского погроммирования, есть разумные идеи? ;)

З.Ы. И кмк ваш пример не совсем корректен, _SL ничего присваиваться не будет, с каких пор "==" стал оператором присвоения значения?
OrderSend(symbol, OP_SELLLIMIT, _volume, price, slp, _SL == 0 ? 0.0 : _SL (если выбрано значение стопа "0",то стоп равен "0": или значение стопа), _TP == 0 ? 0.0 : _TP, cmnt, magic, expir)

Вполне достойная и краткая конструкция, без каких либо переопределений

 
Vitaly Muzichenko:

Вполне достойная и краткая конструкция, без каких либо переопределений

А вот просто так написать какая религия не позволяет?
OrderSend(symbol, OP_SELLLIMIT, _volume, price, slp, _SL, _TP, cmnt, magic, expir)

Какой еще раз, повторюсь, смысл в конструкции возвращающей ровно себя:

_SL == 0 ? 0.0 : _SL

Что тут проверять, если _SL изначально 0, то он и вернёт себя, то есть 0.

Я думал изначально, может это хитрый "финт ушами" из-за какого-то нестандартного поведения MT, но это косяк в базовом понимании что есть булева логика. За ненужный if() даже школьникам на олимпиадах баллы снижают. Просто пока еще удивительно видеть в официально публикуемых либах подобные вещи... наверное скоро привыкну.

 
h.i.a:

Я конечно прошу прощения за мой французский, но что за массовый "индусс-стайл" в OrderSend() ?

Это какая-то особая магия?
Спасибо, что сделали замечание. Не могу объяснить, почему я это сделал. Хорошо, что есть люди, которые никогда не ошибаются.
 

Это был вопрос/замечание 50/50. Так как сам неоднократно сталкивался, с тем что из-за багов или неудачного расположения "звёзд на небе" работая со сторонним фрейморком, драйвером или рантаймом приходилось не то что лишнее выражение, а целые строки добавлять, чтобы например принудительно обновить не обновляющийся должным образом GUI или кэш записи БД. И без пояснения, причина появления в коде таких строк для стороннего человека с вероятностью близкой к 100% будет не ясна, так как с точки зрения нормальной логики кода эти строчки/выражения будут ничем не обоснованы. В MT4 1160 например поломали не сокращённый AND для выражений вида bool MyFunc() & bool MyFunc2(), компилятору теперь дополнительное сравнение ==/!= подавай, хотя обещали пофиксить.

Но с другой стороны,  скачивая библиотеку (предполагающую по-умолчанию более тщательно спроектированный, протестированный и оформленный код + скилл разработчика выше среднего + набор рекомендуемых практик от человека с опытом в данной технологии) тем более с официального сайта производителя, а не с абстрактного форума домохозяек-любительниц программирования, предполагаешь всё-таки как минимум отсутствие ляпов в вещах уровня 2*2 (и тем более практики индуизма), ибо при этом автоматически дальнейшее обсуждение рекомендуемых подходов, практик и скиллов автора делится на 0 и становится бессмысленным. Написано не глумления ради, всё-таки MQL это DSL. А вот в более серьезных промышленных вещах могут и тапками больно закидать ;)




 
h.i.a:

Это был вопрос/замечание 50/50.

Поверьте, здесь далеко не все являются профессионалами. Мне попадались более плачевные варианты (в основном со злоупотреблением switch-конструкций). Эта библиотека очень старая и выложил я её не для того, чтобы "обозначиться", ведь профита с неё никакого не имею. Но и в давние времена я бы точно не стал писать, что масло является масляным. Но никакие оправдания неуместны и это, действительно, моя ошибка. Спасибо ещё раз, что ткнули носом.
 
h.i.a:

Виталий, вопрос не в том как работает примитивная булева логика тернарного оператора ?, Вопрос в том зачем эта логика конкретно в таком выражении, какую полезную нагрузку несёт ?

Кроме варианта поклонения богам индусского погроммирования, есть разумные идеи? ;)

З.Ы. И кмк ваш пример не совсем корректен, _SL ничего присваиваться не будет, с каких пор "==" стал оператором присвоения значения?

Одной из идей может быть автозамена 

Допустим, раньше было 

SL == 0 ? 
_globalSL  : _SL

а потом, от глобальной решили уйти в пользу безвариантного 0, ну и быстро сделать это можно с помощью автозамены

Не факт, что это тот самый случай, но все же

 
Nikolai Karetnikov:

Одной из идей может быть автозамена 

Допустим, раньше было 

а потом, от глобальной решили уйти в пользу безвариантного 0, ну и быстро сделать это можно с помощью автозамены

Не факт, что это тот самый случай, но все же

допустим _SL==0, в этом случае присваивается _SL=0

а если _SL!=0, то в этом случае присвоится _SL=_SL

т.е, условие _SL == 0 ? 0.0 : _SL оставляет все как было

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