Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Обратите внимание на фильтр по символу и по магику в цикле перебора позиций. Если фильтра нет, но вы тралите вообще все открытые позиции на всех символах, а это плохо.
Ну а так,на первый взгляд, все вроде бы в норме.
Обратите внимание на фильтр по символу и по магику в цикле перебора позиций. Если фильтра нет, но вы тралите вообще все открытые позиции на всех символах, а это плохо.
Ну а так,на первый взгляд, все вроде бы в норме.
Большое спасибо, Андрей! Про Magic всё понятно, потому что на одном символе, действительно, могут быть открыты сразу несколько позиций, но возник встречный вопрос. Советник будет перебирать открытые позиции сразу по всем символам, если ему явно не указать на текущий символ? И это даже не смотря на то, что он установлен на конкретную валютную пару, например, EURUSD? Честно говоря, не совсем пойму вот этот момент.
С уважением, Владимир.
Большое спасибо, Андрей! Про Magic всё понятно, потому что на одном символе, действительно, могут быть открыты сразу несколько позиций, но возник встречный вопрос. Советник будет перебирать открытые позиции сразу по всем символам, если ему явно не указать на текущий символ? И это даже не смотря на то, что он установлен на конкретную валютную пару, например, EURUSD? Честно говоря, не совсем пойму вот этот момент.
С уважением, Владимир.
Итак, на основании прочитанной литературы, написал небольшой алгоритм по созданию советника с функцией трейлинг стоп:
Прошу помотреть алгоритм и подсказать мне, какие моменты были упущены.
С уважением, Владимир.
С теорией неплохо, теперь практика. Получится сделать?
С теорией неплохо, теперь практика. Получится сделать?
Попытаюсь. Но Вы сами понимаете, что для этого нужен совершенно другой уровень знаний, которых у меня пока ещё нет.
С уважением, Владимир.
Да, Алексей, уже видел этот код. Он выполнен в виде включаемого файла. Про символ, честно говоря, в нём ничего не нашёл, хотя просмотрел его несколько раз. Возможно, чего-то ещё недопонимаю или просто плохо ищу.
С уважением, Владимир.
Пока продолжим про функции.
Как уже я написал ранее, функции везде, их нужно любить и их нужно уметь писать. Функции, - это наши маленькие бойцы в решении глобальных задач. Если мы были бы генералами в армии, то какими бы бойцами мы хотели управлять? Вот примерный список:
Но мы отвлеклись, перейдем снова на функции.
Если функция решает слишком много задач в целом, - то следуя аналогии, это очень умный боец, который если что-то с ним пойдет не так, может погубить все предприятие. Если спросить что делает такая функция, ответ может быть длинным. Если результат этой функции вдруг перестанет быть верным, то разобраться, что же вызывает ошибку в ней будет крайне сложно (потому что задач много, кода много, большое количество вызовов подпроцедур и где именно ошибка понять сложно).
Если функция вычисляет корректный результат по понедельникам, средам и воскресеньями, а в остальные дни в зависимости от "настроения" - то можем ли мы положится на такую функцию? Представьте что допустим системная функция OrderSend открывала бы позиции только по четвергам, и если определен некий магический параметр со значением 13. И сказанное вовсе не бред или фантазии. Такое поведение можно устроить по щелчку пальцев, достаточно функцию сделать зависимой от неких параметров во внешней среде.
Допустим функция:
Будет всегда возвращать сумму двух значений, не зависимо от внешнего окружения. Это значит что если даже мы скопипастим эту функцию в другой скрипт или эксперт, то она будет прекрасно работать и в нем. Такую функцию можно будет написать один раз а потом использовать во многих своих програмах просто тупо копируя. Мы всегда сможем положится на ее результат, зная, что ее работа ни от чего не зависит. Такие функции, результат которых не зависит от их окружения, называют функции без побочных эффектов или чистыми функциями. Если стремится писать чистые функции, то очень скоро их становится достаточно много. Это значит что их можно объединить в файл, и включать его в свои новые проекты. Это называется повторное использование кода. Мы не делаем работу дважды. Вместо этого мы пользуемся уже написанными функциями, которые знаем, и чья надежность была уже не однократно опробирована.
Посмотрим на антипример теперь:
Результат вроде бы тот же, ведь с всегда равен нулю. Или не всегда? А что если кто-то где-то меняет c? Что тогда? А если кто-то где-то также использует внешнюю переменную с, но уже для своих целей и у него переменная c другого типа, допустим string? Объединить обе эти две функции уже нельзя (компилятор не даст объявить две переменные с одинаковым именем). Разобраться с их общими зависимостями тоже сложно. Вообще не понятно что с этим делать. Я вот например до сих пор не знаю надежного и простого способа заставить работать такие функции вместе.
Даже если другой функции нет, и внешнюю переменную читает только одна функция, то скопировать ее в другое место становится не так просто. Нужно скопировать и эту функцию и ее зависимость. А если мы копируем эти функции в общий файл? Там этих функций набирается 50, 100 штук. И каждая вместе с собой копирует еще кучу своих зависимых переменных. Получается запутанный клубок связанных переменных не понятно с какими функциями. А зачем все это? Какие задачи это решает? Зачем создавать лишние зависимости когда в подавляющем большинстве случаев можно обойтись без них?
У функций есть еще одно удивительное свойство. Функции самоописуемы. Т.е. не надо рисовать схему, достаточно выбрать хорошие имена и разделить общий алгоритм на функции. Вот скажем пример:
Что делает этот код я не знаю, потому что функции даже не написаны. Но если бы я его читал, то по всей видимости это означало бы, что в случае успешного выбора первого <попавшегося> отложенного ордера с направлением ORDER_TYPE_BUY он бы отменялся (первая функция выбирает, вторая отменяет). Так как код запускался бы каждый тик, то не зависимо от количества отложенных ордеров, каждый из них рано или поздно был бы отменен. Также это означает, что любая попытка установки отложенного ордера на покупку будет пресекаться - ордер будет тут же сниматься. При этом ордера на продажу будут выставляться без проблем.
Всего две строчки кода и две функции. А алгоритм получился нетривиальным, а главное надежный.
Применительно к МКЛ нужно сказать еще немного о чистых функциях. Так как это прикладной язык, то сложно писать что-либо не опираясь на данные предоставляемые из терминала. В конце концов в этом и состоит главная задача: правильно взаимодействовать с торговым окружением. Формально, любое торговое окружение изменчиво: меняются цены, количество ордеров, баланс и пр. пр. пр. Следовательно любая функция взаимодействующая с таким изменчивым торговым окружением не является чистой. Потому что внешнее торговое окружение тоже можно можно принять как за некую глобальную переменную, которая постоянно меняется. Но когда мы пишем OrdersTotal() мы не рассчитываем что данная функция всегда будет возврать одно и тоже значение. Вместо этого мы ожидаем, что она будет возвращать количество отложенных ордеров, которое естественно будет разным. Поэтому, применительно к MQL, мы будем считать функции чистыми и годными для повторного использования, даже в том случае, если они будут вызывать функции внешнего API, вроде OrdersTotal(). Это будет наше разумное послабление.
Пока продолжим про функции...
Огромное Вам спасибо, Василий, за те бесценные знания, которыми делитесь не только со мной, но и с теми начинающими программистами, которые читают или будут читать данную тему!
С таким же, огромным уважением, Владимир.
Продолжаю изучение языка программирования MQL5. Пока серьезных замечаний со стороны участников темы по алгоритму написания кода советника Trailing_Stop не было (про символ и Magic помню, позже добавлю в алгоритм!), создал входные параметры советника и написал код цикла, запускающего перебор открытых позиций.
При запуске советника в работу обнаружена проблема - во вкладке "Эксперты" торгового терминала на каждом тике выводятся сразу по 2-а одинаковых сообщения "Запущен цикл", не смотря на то, что на торговом терминале стоит график только одной валютной пары EURUSD и на нём открыта только одна позиция. Причём у этих сообщений абсолютно одинаковое время вывода.
Бился до полуночи, но так и не смог победить. Не могу никак понять, с чем связана проблема.
Код советника написан на английском языке, а комментарии к коду на русском языке, чтобы облегчить усвоение материала. В данном советнике постарался всё расписать, как ранее и обещал, в изложении доступном для ученика 1-го класса школы программирования.
С уважением, Владимир.
i равно кол-ву открытых позиций, столько и циклов будет с печатью
нужно убрать знак "=" в зачем вам проходить цикл когда кол-во открытых позиций равно 0. на этот нулевой вызов и выходила вторая печать