
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Задавать символ индикатора можно двумя способами: задать символ вручную или использовать символ на котором работает советник. Если разрешить пользователю задавать символ вручную (то есть во входных параметрах явно создать входной параметр "Символ индикатора", тогда возникает необходимость проверки корректности введённого имени символа. Алгоритм проверки, в таком случае, будет использоваться из #1 - при этом лучше создать для индикатора свой объект класса CSymbolInfo: в примере ниже это будет объект "m_symbol_Stochastic".
В примере даны два вида получения данных:
Необходимые приготовления: так как этот пример в котором пользователю разрешено задавать символ индикатора вручную, в "шапке" советника прописываем подключение класса CSymbolInfo,
а также входные параметры и объявляем переменную "handle_iStochastic" в которой будет храниться хендл индикатора.
Следующий шаг - подготовительная работа в OnInit(): проверка корректности заданного символа (на основе #1) и непосредственное создание хендла индикатора iStochastic:
Забегая на перед: вот две функции получения данных индикатора:
"за один запрос возврат значения индикатора на определённом бара"
Входные параметры: индекс буфера "buffer" (может принимать значения MAIN_LINE и SIGNAL_LINE) и номер бара "index" с которого нужно получить значение индикатора:
Возвращает значение индикатора на заданном номере бара или "0.0" в случае ошибки.
"за один запрос возврат значений индикатора для некого интервала баров (получение данных в массив)"
Когда может панодобиться такой метод: например нужно пройтись в цикле по нескольким значениям индикатора - в таком случае использовать метод "за один запрос возврат значения индикатора на определённом бара" будет дорого.
Входные параметры: индекс буфера "buffer" (могут принимать значения MAIN_LINE и SIGNAL_LINE), стартовая позиция "start_pos" - с какого номера бара начинать запрос данных, количество запрашиваемых данных "count" и массив "array" (передаваемый по ссылке) в который и будут складываться полученные данные:
Эта функция уже имеет тип "bool" и возвращает в случае удачного копирования (когда количество полученных данных равно количеству запрошенных) "true".
Заключительный этап - работа в OnTick() и пример обращения за данными двумя способами
Обратите внимание, что массиву "array", в который складываются данные с индикатора, устанавливается обратный порядок индексации - таки образом элемент массива array[0] на графике будет находится правее элемента array[n].
Проверка работы обоих методов получения данных с индикатора - мышка установлена на баре #0 и можно сравнить "Окно данных" и распечатанные на экране значения:
Посмотрите, как просто и понятно можно написать команду "Открыть позицию BUY объёмом 1.0 лот":
Такая сверх простота достигается при использовании торгового класса CTrade - данный класс поставляется вместе с терминалом в стандартной библиотеке. Чтобы начать использовать CTradeнужно в шапке скрипта или советника прописать этот код:
Первая строка - это подключение класса, вторая строка - создание объекта этого класса.
Весь скрипт выглядит так:
Для открытия позиции BUY используется метод CTrade::Buy.
А может разъясните людям почему при пользовании вашего "короткого" примера получается огромной ex5 (47к) ?
Тот же результат реализован обычным способом (на примере из документации) намного короче (8к) !!!
Надеюсь Вы вполне несознательно опустили ту не-маловажную деталь
Кстати разница в объеме кодов незначительна
А может разъясните людям почему при пользовании вашего "короткого" примера получается огромной код (47к) ?
Тот же результат реализован обычным способом (на примере из документации) намного короче (8к) !!!
Надеюсь Вы вполне несознательно опустили ту не-маловажную деталь
А может разъясните людям почему при пользовании вашего "короткого" примера получается огромной ex5 (47к) ?
Тот же результат реализован обычным способом (на примере из документации) намного короче (8к) !!!
Надеюсь Вы вполне несознательно опустили ту не-маловажную деталь
Кстати разница в объеме кодов незначительна
ну во первых:
Чем это деталь так значительна ? Экономите место на компьютере ?
во вторых.: скомпилируйте один и тот же код несколько раз. Обрадуйтесь, что размер файла меняется при каждой компиляции.
Ну и в третьих почитайте что обозначает #include. Это копирование файла в текст программы. Т.е. весь класс копируется, прежде чем идет вызов открытия ордера. В этом же классе проводятся проверки на корректность подачи приказа.
В этом и есть одно из основных преимуществ ООП.
Чем это деталь так значительна ? Экономите место на компьютере ?
Не уже ли не понимаете :
Больше *.ex5 == больше времени для выполнение , ето программисты учат на первом курсе.
Ведь у всех нас одна из целей, чтоб программа работала как можно быстрее (за один тик). Не так ли ?
Не уже ли не понимаете :
Больше *.ex5 == больше времени для выполнение , ето программисты учат на первом курсе.
Ведь у всех нас одна из целей, чтоб программа работала как можно быстрее (за один тик). Не так ли ?
Программа в первую очередь должна делать то, что она должна делать. И только после этого тезиса программа должна все делать как можно быстрее и как можно меньше жрать ресурсов. НО в современном мире на уровне весьма простых задач в виде торговых роботов большинство кодов вообще не проходят оптимизацию на время исполнения. А используя Стандартную библиотеку этого делать в 90% случаев ни не надо
Алгоритм данного решения для советника, который работает только в момент рождения нового бара
Данный параметр позволит в тестере стратегий выполнить перебор всех таймфреймов (провести тестирование на всех таймфреймах и сравнить результаты)
MagicNumber задаётся при помощи метода Ctrade::SetExpertMagicNumber.
Немного изменю пример 4.1. Как открыть позицию (самый минимальный код) - так как "Sert MagicNumber.mq5" - это скрипт, а не эксперт, то для отображения входных параметров нужно прописать директиву script_show_inputs. Обратите внимание, что входной параметр "magic number" должен иметь тип ulong.
Скрипт выполняет два действия: устанавливает идентификатор эксперта (magic number) и отсылает торговый приказ на открытие позиции BUY объёмом 1.0 лот.
При работе с фракталами нужно учитывать два фактора:
Фактор первый
фрактал на барах от "rates_total-5" до "rates_total-3" уже не может перерисоваться - это вытекает из конструкции индикатора "Fractals.mq5" (открытый код индикатора расположен в [data folder]\MQL5\Indicators\Examples\Fractals.mq5) - так как бары в промежутке от "rates_total-5" до "rates_total-3" уже сформировавшиеся
Рис. 1. Так работает индикатор "Fractals". Нумерация файлов с позиции индикатора "Fractals.mq5"
Это означает, что когда в советнике получаем данные с индикатора iFractals, на барах "rates_total-5", "rates_total-4" (нумерация баров с позиции индикатора "Fractals.mq5") будет фрактал, который уже гарантированно не перерисуется.
А вот момент когда фрактал формируется на баре "rates_total-5" - в момент когда появляется новый бар справа 2016 года 2 января 03:00 (нумерация файлов с позиции индикатора "Fractals.mq5") :
Рис. 2. Момент когда фрактал формируется на на баре "rates_total-5"
Фактор второй
Индикатор фрактал в качестве пустого значения использует не "0.0", а EMPTY_VALUE. Исключение - первая инициализация, когда индикаторные буфера инициализируются нулём (это делает не индикатор "Fractals.mq5", а MQL5 при создании массива и связявании его с индикаторным буфером).