Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
На мой взгляд, подобное обращение с типами - это очнеь нехороший стиль программирования.
Вобще, с преобразованием типов надо быть очень осторожным - типы придуманы для того, чтобы возложить на компилятор задачи по контролю допустимых значений перменных. В строку не может прямо передаваться булевое значение true. А если необходимо, чтобы был передан текст "true" - то это надо сделать явно.
в mq4 всё классно)
спасибо!
в mq4 всё классно)
Во-первых, в MQL4 не "классно", а "нет сообщения об ошибке". Что как раз очень плохо.
Если произойдут какие-то большие изменения (придумают MQL6) - подобные "классные" места дадут ошибки в первую очередь.
А во-вторых, именно привычка к подобному расхлябанному стилю программирования и приводит потом к весьма сложно выявляемым ошибкам. В данном случае, действительно, достаточно провести явное преобразование, как предложил fxsaber, но, на мой взгляд, правильнее было бы объявление функции BoolToString(bool bValue), где прямо, в зависимости от входной величины возвращается та или иная строка, и ее использование для преобразований.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MT4Orders
fxsaber, 2017.02.08 14:19
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
получая очень понятный результат на выходе.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MT4Orders
fxsaber, 2017.02.10 12:01
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.0645
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 100
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_IOC (1)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment =
Request.position = 57775
Request.position_by = 0
Явное написание BoolToString и подобных сделало бы код, как минимум, менее читаемым. А их использование - увеличило время на разработку и отладку.
Явное написание BoolToString и подобных сделало бы код, как минимум, менее читаемым. А их использование - увеличило время на разработку и отладку.
Именно в данном случае не могу согласиться. Как раз BoolToString является более читабельным, чем безликий, ни о чём не говорящий, макрос TOSTRING. Макросы, конечно, вещь неплохая, но ведь это не значит, что их нужно использовать во всех случаях жизни. У них тоже есть свои недостатки, которые в такой ситуации перевешивают преимущества от их использования.
Именно в данном случае не могу согласиться. Как раз BoolToString является более читабельным, чем безликий, ни о чём не говорящий, макрос TOSTRING. Макросы, конечно, вещь неплохая, но ведь это не значит, что их нужно использовать во всех случаях жизни. У них тоже есть свои недостатки, которые в такой ситуации перевешивают преимущества от их использования.
Тут даже спорить не нужно. Достаточно попробовать написать свою
с результатом, как показано выше. И тогда вывод будет однозначен.
Тут даже спорить не нужно. Достаточно попробовать написать свою
с результатом, как показано выше. И тогда вывод будет однозначен.
Не понял, о чём спорить? Что в таком виде:
является неясным? Все прозрачно.
Каким образом в данном случае (преобразование bool в string) поможет представленная функция ToString(), на вход которой, к тому же, подается MqlTradeRequest, а не bool?
Не понял, о чём спорить? Что в таком виде:
является неясным? Все прозрачно.
Каким образом в данном случае (преобразование bool в string) поможет представленная функция ToString(), на вход которой, к тому же, подается MqlTradeRequest, а не bool?
Привел практический пример, когда нужно распринтовать MqlTradeRequest. Мы же в конце-концов исходим из практических задач, а не порассуждать только.
Так вот отказ от приведений типов в пользу таких монстров а-ля BoolToString влечет за собой хреновый код. Чтобы в этом убедиться, достаточно переписать вышеприведенную функцию, отказавшись от приведения типов.
Единообразная запись, не зависящая от типов - это сила, а не костыль. Отсюда растут макросы и шаблоны, делая код универсальным.
Единообразная запись, не зависящая от типов - это сила, а не костыль. Отсюда растут макросы и шаблоны, делая код универсальным.
Мне кажется, что тут надо глядеть по обстоятельствам. Где-то сила, а где-то потенциальные проблемы.
В частности в макросах не происходит проверка типов. Просто тупо раскрывается содержимое макроса с параметрами. И, боюсь, не везде это хорошо.
В данном случае - проблем нет.
Но, если макрос раскрывается в какие-нибудь сравнения - все уже далеко не так однозначно. Скажем, если в результате работы макросов будет раскрытие в byte и в int - сравнение данных величин запросто приведет к сложно вычисляемому зацикливанию (при переполнению байта, который может не достичь значения, заданного в int'e).
Я очень хорошо помню, как убил почти неделю на выявление подобной "плавающей" ошибки. Именно после этого я очень полюбил строгую "венгерскую" нотацию, поверх четкого типизирования переменных. Потенциальная проблема в выражении while(btCounter < iMaxValue) - гораздо более заметна, чем в выражении while(GetCounter()<GetMaxValue())
В данном случае - не вижу ничего "монстрообразного" или "хуже читаемого", хоть в макросе TOSTRING(), хоть в функции BoolToString(). По-моему, это вполне эквивалентные варианты, очень слабо отличающиеся друг от друга.