uninit reason 5 что значит
Ещё примеры использования функции SetOrder().
Для наглядности нужно выбрать инструмент с большим минимально допустимым уровнем стоп-лосса/тейк-профита в пунктах. Я выбрал AUDCAD, у которого этот уровень в выбранном мной для тестирования ДЦ равен 10 пунктам.
1. Установка ордера BuyLimit лотом 0.1 на 5 пунктов ниже текущей цены. Я специально выбрал уровень установки ордера меньше минимально допустимого уровня, чтобы получить ошибку 130 (Неправильные стопы) и показать, как функция SetOrder её отработает.
Содержимое протокола (читается снизу вверх):
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: removed
2008.03.17 09:06:24 stdlib AUDCAD,M5: removed
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: open #21616412 buy limit 0.10 AUDCAD at 0.9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): Скорректированы ценовые уровни
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limit pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: loaded successfully
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: loaded successfully
Из протокола видно, что функция попыталась поставить ордер по 0,9185 (pp=0.9185), но торговый сервер не принял такую заявку, вернул ошибку 130. Тогда функция корректирует уровень установки ордера в соответствии с минимально допустимым уровнем и предпринимает следующую торговую попытку, которая заканчивается удачно. Ордер установлен по 0,9180.
2. Установка ордера BuyStop лотом 0.3 на 6 пунктов выше текущей цены со стопом 9 пунктов
Содержимое протокола (читается снизу вверх):
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: removed
2008.03.17 09:27:36 stdlib AUDCAD,M5: removed
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: open #21617419 buy stop 0.30 AUDCAD at 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): Скорректированы ценовые уровни
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: loaded successfully
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: loaded successfully
Этот пример показывает, как произошло изменение уровня установки ордера с 0,9204 на 0,9209. При этом уровень стопа остался прежним sl=0.9195. То есть стоп в пунктах увеличился с 9 до 14.
3. Установка ордера SellLimit лотом 0.5 на 8 пунктов выше текущей цены со стопом 9 пунктов и тейком 7 пунктов
Содержимое протокола:
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: removed
2008.03.17 10:38:50 stdlib AUDCAD,M5: removed
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: open #21620553 sell limit 0.50 AUDCAD at 0.9190 sl: 0.9201 tp: 0.9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): Скорректированы ценовые уровни
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 10:38:40 stdlib AUDCAD,M5: loaded successfully
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: loaded successfully
В этом примере снова сделана попытка установить лимитный ордер слишком близко к рынку. Уровень установки ордера скорректирован вверх на 2 пункта с 0.9188 до 0.9190. Уровень стопа также подправлен, но на 4 пункта с 0.9197 до 0.9201. Неизменным остался только уровень тейка, что привело к его увеличению в пунктах с 9 до 11.
2.0 Пишем первый Индикатор
Доброго времени суток!
Мы открываем следующий раздел обучения программированию на языке MQL4. Если вы новичок и только зашли в этот блог статей, то предлагаю вам начать изучение с самого первого поста по этой тематике.
В этом уроке мы изучим из чего состоит программный код любого индикатора, какие свойства и функции в нем применяются.
Создаем свой первый индикатор
Индикатор это программа, которая используется как вспомогательный алгоритм для анализа рынка или результатов торговли. Индикатор может содержать в себе информацию о вашем счете, открытых или закрытых ордерах, или может совершать технический анализ и подавать сигналы для открытия ордеров. Т.е. он может делать все, что и Советник, кроме, непосредственно, торговли. Индикатор может отображаться как на графике, так и в отдельном окне (в подвале). Основное его отличие от скрипта в том, что он выполняет заданные действия каждый тик, пока он присутствует на графике, тогда как скрипт удаляется с графика, как только функция OnStart() закончит свою работу.
Ну что же, давайте создадим индикатор, для этого в меню «Файл» редактора Meta Editor необходимо нажать кнопку Создать, либо воспользоваться сочетанием клавиш Ctrl+N. Выбираем пункт «Пользовательский индикатор» и жмем далее. Общие параметры задаются также, как и в Скрипте — вы вводить имя вашего индикатора, имя автора, ссылку на сайт. Все индикаторы хранятся в корневой папке терминала Indicators, путь к которой выглядит так:
Внешние параметры сейчас не нужно задавать, это можно по необходимости выполнить после. Задали имя, жмем далее.
Нам предлагается выбрать необходимые функции обработки событий. По умолчанию нам всегда нужна функция OnCalculate, галочки на OnTimer и OnChartEvent ставить не нужно, мы изучим их в следующих уроках.
Галочку «Индикатор в отдельном окне» ставить не нужно, она нужна для подвальных индикаторов, их мы обязательно разберем в будущем. Раздел Отрисовка нужен для создания буферов для индикаторов. Это массивы, которые содержат в себе информацию о линиях, ценах и значениях отдельного индикатора, т.е. нужны для более сложного кода. Найти их можно в «Окне Данных» (Ctrl+D). В нашем случае буферы не нужны, поэтому пропускаем эту графу. Жмем Готово.
Поздравляю вас, товарищи, наш первый индикатор создан! Теперь давайте пройдемся по его изначальному коду.
С 1 по 5 строчку идет закомментированный код, который служит подсказкой для программиста о созданной программе, а именно наименование созданного индикатора, кому принадлежат права и вебсайт. По желанию эти строчки можно удалить, для самого кода они не нужны.
Далее в строчках 6-10 идут свойства программы. Более подробно о них было рассказано в уроке Скрипт Hello World.
Тут все просто, это изначальные данные, которые мы передаем всей программе, а именно:
Функция OnInit
Обязательной функцией, которая должна быть в каждом коде индикатора является функция обработки событий OnInit. Данная функция запускается сразу после загрузки индикатора или советника. Под загрузкой подразумевается установка программы на график, изменение настроек программы, смена таймфрейма текущего графика, либо торгового символа. Т.е. при каждом изменении пользователем параметров графика или программы — данная функция будет автоматически выполнена и код переинициализирован.
Нужна эта функция, чтобы в ней один раз перед работой основного кода сделать необходимые расчеты и проверки, вот несколько примеров:
Как видно, много чего можно сделать сразу после инициализации кода. К примеру, вам нужно проверить на какой символ установлен индикатор, и если эта пара не входит в ваш перечень, то запретить торговлю. Согласитесь, делать эту проверку каждый тик не целесообразно, это только нагрузит оперативную память компьютера. Функция OnInit же только один раз выполнит нужное действие и станет неактивной.
Тип данных этой функции по умолчанию является int, т.е. целое число. Это значит, что после завершения она должна возвращать (return) какое-то значение. Существует три предопределенных значения, которые эта функция может вернуть:
Если задать функции OnInit тип void, то оператор return прописывать не нужно, по умолчанию инициализация пройдет успешно.
Теперь попробуем на практике запустить эту функцию, запишем несколько принтов в строчку:
вот какие картинки у меня получаются:
На тестере от MT4 от FXDD делает покупку или продажу и незакрывая сделку практически сразу пишет: 2007.10.27 11:30:13 2006.01.02 02:15 Lucky1. 2: stopped because of Stop Out
на версии 1.1 при установке на демку писал: Lucky1.1 EURGBP,M1: uninit reason 5 (uninit reason 3 и т.п. взависимости от ТФ на который ставил) в версии 1.2 вроде такого нет.
на MT от Alpari тестируется и устанавливался на график без проблем но результаты очень отличаются:
2006 год ПОДРОБНЫЙ ОТЧЕТ здесь
Если брать не все тики а только конттрольные точки то результат намного лучше (я уже об этом писал раньше)
Может быть кто знает где взять все тики хотябы за полгода-год?
вот какие картинки у меня получаются:
На тестере от MT4 от FXDD делает покупку или продажу и незакрывая сделку практически сразу пишет: 2007.10.27 11:30:13 2006.01.02 02:15 Lucky1. 2: stopped because of Stop Out
на версии 1.1 при установке на демку писал: Lucky1.1 EURGBP,M1: uninit reason 5 (uninit reason 3 и т.п. взависимости от ТФ на который ставил) в версии 1.2 вроде такого нет.
на MT от Alpari тестируется и устанавливался на график без проблем но результаты очень отличаются:
2006 год ПОДРОБНЫЙ ОТЧЕТ здесь
Если брать не все тики а только конттрольные точки то результат намного лучше (я уже об этом писал раньше)
Может быть кто знает где взять все тики хотябы за полгода-год?
переменная знаешь что такое? это ячейка в памяти, с возможностью изменения. int это тип переменной
Для тестирования торговой системы в МТ4 на исторических данных, необходимо загрузить архив котировок, выбираю интересующую валютную пару, выбираю все таймфрэймы в т.ч. и минутный, загружаю. При тестировании никаких рассогласований графика не возникает, но есть проблема, существенно влияющая на результаты тестирования и оптимизации. В котировках часто встречаются разрывы по времени, к примеру на графике H1, после свечки 7 мая 2010г, идет сразу свечка относящаяся к 8 июля 2010г. т.е. разрыв в 1 месяц. и такие разрывы встречаются регулярно. Повторное скачивание архива котировок ситуацию не исправляет. Места на жестком диске для скачивания котировок более чем достаточно.
Вопрос: как корректно закачать все котировки без временных разрывов в МТ4?
Подскажите, что значит такая вот хрень в логах? Как можно этого избежать? Эксперт торгует с помощью этого индюка, после ошибки торговля замирает пока не перезагрузишь терминал так как при перезагрузке эксперта может снова вылететь.
22:39:53 Zigzag CLJ1,M5: removed
Может это из-за того, что я пользуюсь терминалом на удаленном серваке и у себя на компе одновременно?
В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?
В описании языка говорится, что этот код выводится, когда активирован другой счет.
Если в одном терминале заведены несколько счетов от разных ДЦ,
то при переключении между этими счетами должен выводиться этот код или нет?
Переключаю счета. Код не выводится. Что понимается под словосочетанием Активирован другой счет?
Так В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?
Метатрейдер билд 215.
Необходимо обратить внимание на очерёдность поступления информации. С момента переключения счёта сначала обновляются переменные окружения, а (как бы) потом происходит собственно соединение со счётом. В индикаторе и обычном эксперте, возможно, это и не видно. Я использую зацикленный эксперт, здесь эта проблема добавляет хлопот.
В описании языка говорится, что этот код выводится, когда активирован другой счет.
Если в одном терминале заведены несколько счетов от разных ДЦ,
то при переключении между этими счетами должен выводиться этот код или нет?
Переключаю счета. Код не выводится. Что понимается под словосочетанием Активирован другой счет?
Так В каких случаях код причины деинициализации = 6 (=REASON_ACCOUNT)?
Метатрейдер билд 215.
Я смотрю на вкладке Эксперты. Там эти коды выводятся:
А вот код 6 ни разу не видел, чтобы выводился.
эта конструкция не работает. При смене таймфрейма работает. При смене счета не работает.
Я смотрю на вкладке Эксперты. Там эти коды выводятся:
А вот код 6 ни разу не видел, чтобы выводился.
эта конструкция не работает. При смене таймфрейма работает. При смене счета не работает.
Попробуйте исполнить Ваш код сразу после включения терминала на счетах надёжных ДЦ.
Эта ошибка теряющаяся. Нужно немного поэкспериментировать.
Rosh, с твоим примером понятно. Попробую так сделать. О результатах напишу.
Rosh, с твоим примером понятно. Попробую так сделать. О результатах напишу.
Я так понял, что функция RefreshAccountInfo() в программе Specification.mq4 подменяет работу функции UninitializeReason() в случае, когда происходит смена счета.
То есть это говорит о том, что в функции UninitializeReason() значение 6 не работает или работает неправильно.
С помощью функций, подобных RefreshAccountInfo(), латаются ошибки языка mql4.
В таком случае из описания: