Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Параметр sy зря в автозаполнение поставили - при нем результат будет заведомо отрицательный.
Вообще код лучше вот так переделать - быстрее работать будет:
Urain:
Опятьже для меня остался непонятным момент что произойдёт если выставленны одновременно несколько ордеров,
как будет это отрабатываться в OnTrade()?
OrdersTotal() будет > 1, также и HistoryDealsTotal() при последовательных вызовах QnTrade() может меняться на на величину > 1.
Без учёта отложников.
Вы неправильно поняли таймаут в параметре функции PositionSelect. Там не задержка, а именно таймаут ожидания разблокировки/обновления торговой базы.
Лучше всего после совершения сделки явным образом сохранять время последней операции и следующие N секунд ничего не предпринимать.
А если это займет N+1 секунду?
Может лучше дождаться хоть какого то ответа на первый запрос (принят\не принят, установлен\не установлен) и уж потом, либо повторять либо нет.
Выбрать что то конкретное из этого
А если это займет N+1 секунду?
Может лучше дождаться хоть какого то ответа на первый запрос (принят\не принят, установлен\не установлен) и уж потом, либо повторять либо нет.
Выбрать что то конкретное из этого
очень непонятно тогда справка написана, прочитав её, считал, что я задерживаю все опрерации на 100 милисекунд, т.е. жду это время и пытаюсь выбрать позицию, не появилась позиция в течении этого времени, значит её нет.
Когда Вы запрашиваете состояние позиции, торговая база терминала может быть в необновленном состоянии (например, при раннем старте или реконнекте к счету) и тогда значение таймаута даст вам время подождать обновления данных.
Значение в 100 миллисекунд конечно мало, разумно ставить секунды 3. В 99.9% случаев ответ будет выдаваться мгновенно без задержек, но при реконнектах подождать 3 (в максимуме) имеет смысл.
дожидаться вроде не вариант. событие void OnTick() прервет его и вроде еще ограничение есть в 2.5 секунды, больше выполняться не может. будет прерывание. хотя я в этом неуверен. но что то такое было
Ну не знаю... Все же верным решением было бы обрабатывать MqlTradeResult
Пока в справке про поведение void OnTick() подробно не расписано, но вот аналог из MQL4 функции start()
А про 99,9% думаю так)
Профессионализм людей, совершенные технологии и выверенные инструкции делают столкновения самолетов в воздухе практически невозможными. На уровне 1 на сто миллионов.
Однако тот же человек с пресловутым человечиским фактором, копеешные радиодетальки и фатальное стечение обстоятельств рисует статистику на несколько порядков хуже теоретически расчитанных.
Параметр sy зря в автозаполнение поставили - при нем результат будет заведомо отрицательный.
Вообще код лучше вот так переделать - быстрее работать будет:
Имеется ввиду, что для случаев op == -1 и mn == -1 PositionGetInteger() вызываться не будет?
А в документации сказано, что Логические выражения вычисляются полностью, т.е., к ним не применяется схема так называемой "короткой оценки".
Это торговый блок.
т.е. если есть открытая позиция бай, я удваиваю лот и переворачиваюсь в селл (для бай логика наоборот). если есть уже открытая позиция то я ничего не делаю. По идее в рынке должна быть позиция только 0.1 лота.
но однажды у меня появился лот 0.2 (просто висел на демо счете советник, не в тестере). я долго анализировал и пришол к выводу, что сервер принял команду, но её еще не успел выполнить польностью, как пришол новый тик, и раз открытых позиций нет пошла команда открыть позицию, и эти приказы выполнились последовательно.
на чемпионате это дисквалификация
поэтому я решил сделать задержку, но до сих пор все равно не уверен, что исключил эту ситуацию
З.Ы. спасибо за замечания и правку кодаОднако, функция WhetherIsPosition() возвращает false не только в случае отсутствия позиции, но и в случае ошибки при вызове функции PositionSelect().
Теперь, учитывая вышесказанное, предположим, что открыта позиция SELL 0.1 лота. Далее, предположим также, что приходит тик, логика эксперта вызывает торговый блок, однако, при вызове PositionSelect() из WhetherIsPosition() всё время возникает ошибка, и поэтому последняя всё время возвращает false.
Тогда при выполнении
удвоения переменной Lots не произойдёт. А при последующем выполнении
тип позиции ошибочно будет определён как "НЕ являющаяся SELL" (хотя она по условиям вначале рассуждений - как раз SELL), и будет произведена "доливка" к позиции ещё 0.1 лота. В результате общий объём позиции станет 0.2 лота.
Также могут возникнуть ошибки логики работы эксперта, связанные с тем, что один раз функция WhetherIsPosition() может вернуть одно, а при другом её вызове - другое. Поэтому имеет смысл вызывать функцию один раз, запоминать возвращённое значение в переменной и использовать в дальнейшей обработке лишь эту переменную (в логически связном блоке, а не вообще; то есть, чтобы логика блока, рассчитанная на непротиворечивость значений, возвращаемых функцией, не "рвалась").
Имеет смысл изменить "дизайн" функции, чтобы можно было обрабатывать ошибки в стиле C (для стиля C++ нужен механизм исключений, но в MQL5 он отсутствует). Например:
Замена типа возвращаемого значения с bool на тип пользовательского перечисления позволяет закодировать не только штатные случаи, но и случаи ошибочных ситуаций и отсутствия позиций.
Очень важно запрограммировать все возможные ситуации, формируя логику работы и для нештатных случаев явно, а не "как получится".
Имеется ввиду, что для случаев op == -1 и mn == -1 PositionGetInteger() вызываться не будет?
А в документации сказано, что Логические выражения вычисляются полностью, т.е., к ним не применяется схема так называемой "короткой оценки".
В MQL5 документацию по ошибке перекочевала фраза из MQL4 - обязательно исправим.
В MQL5 выражения вычисляются правильно - по короткой схеме.
Имеется ввиду, что для случаев op == -1 и mn == -1 PositionGetInteger() вызываться не будет?
А в документации сказано, что Логические выражения вычисляются полностью, т.е., к ним не применяется схема так называемой "короткой оценки".