Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Тип ордера можно узнать! Тут изначально вы выбираете ордер по номеру тикета. Так нельзя определить закрыт он или открыт.Так как он выбирается и среди открытых и отложенных ордеров, и среди закрытых.
Если вам нужно выбрать только открытые ордера, как я уже отвечала вам на вопрос о том как выбрать только открытые позиции:
То есть использовать SELECT_BY_POS, и указать что ордер из открытых и отложенных- MODE_TRADES. И потом ставить условие "отсечения" отложенных - (OrderType()<=OP_SELL), чтоб выбранные ордера были ТОЛЬКО открытыми
В этом случае ваш ОрдерСелект (если его так оформить), который стоит после закрытия позы будет равен false (потому что он не сможет выбрать ни одной позиции среди открытых - так как их нет. И алерт не должен сработать вообще.
grotesque писал (а):
Вот еще косяк в справке (или MACD Sample.mq4?) обнаружил: bool OrderSelect (int index, int select, int pool=MODE_TRADES): pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Смотрим MACD Sample.mq4: OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES) - Спрашивается нафиг?
Да-да, понял свою ошибку... забыл проверить что орден выбран перед определением его типа...
А согласитесь, если функция при разных аргументах возвращает одинаковое значение, то нельзя сказать точно что этот результат означает и вообще то ли она сделала что нам нужно было. Как это получается в случае с функцией OrderType(), - возвращает '0' если ордер установлен на покупку или ордер не установлен, т.е. обычно в таких случаях передаваемый функции аргумент равен 'NULL'. Это не ошибка, это результат работы функции, почему-то не описанной в справке.. ?
Видим, что 386 сделок открылось и закрылось как полагается. Дальше сделка открыться не смогла. Потому что небыло свободной маржи, то есть нехватило денег. Следовательно, нетоткрытый OrderSend вернул переменной ticket - нуль. И поэтому функция ОrderClose обозвала этот параметр неправильным.
Маржа и тп., вообще ничего лишнего, не могло повлиять, точно.. .
и возвращаясь к MACD Sample.mq4, становится непонятно почему там используется фонкция с такими аргументами: OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)...
Нет, я и не думала издеваться. Еще раз повторюсь, что я тоже чайник, и тоже чтото могу не так понимать, хотя пытаюсь разобраться :) Действительно, по логике скорее всего вы правы насчет OrderTicket() и OrderSend(), так что ругается программа не изза этого.
Если для OrderClose написано: "ticket - Уникальный порядковый номер ордера.", то само слово УНИКАЛЬНЫЙ уже означает что это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.
Уникальный - означает всего лишь 'неповторяющийся', т.е. не может быть несколько тикетов, например, с номером 2... тоже самое с позициями, они тоже уникальны на данный момент времени.
Уникальный, да это неповторяющийся.Но все равно не соглашусь с вами. Исходя из того что позиция может закрываться по ОрдерКлоуз не только сразу после ее открытия ( как в вашем коде),но и в любой другой части программы, использование в этой функции уникального ВРЕМЕННОГО порядкового номера ордера просто ненужно и не логично. Допустим, у нас в списке 4 позиции, треться закрылась по каким то правилам, и четвертая стала третьей. Все. ...номер поменялся. ...а если нам теперь ее надо закрыть?
Уверена, что ticket - это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.
Уверена, что ticket - это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.
и возвращаясь к MACD Sample.mq4, становится непонятно почему там используется фонкция с такими аргументами: OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)...
MODE_TRADES - (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров.
Если вы долго мучаетесь и у вас ничего не получается - попробуйте почитать документацию! - https://docs.mql4.com/ru/trading/OrderSelect
А согласитесь, если функция при разных аргументах возвращает одинаковое значение, то нельзя сказать точно что этот результат означает и вообще то ли она сделала что нам нужно было. Как это получается в случае с функцией OrderType(), - возвращает '0' если ордер установлен на покупку или ордер не установлен, т.е. обычно в таких случаях передаваемый функции аргумент равен 'NULL'. Это не ошибка, это результат работы функции, почему-то не описанной в справке.. ?
OP_BUY - позиция на покупку,
OP_SELL - позиция на продажу,
OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
Ордер должен быть предварительно выбран с помощью функции OrderSelect(). Для того, чтобы небыло таких утверждений: "возвращает '0' если ордер установлен на покупку или ордер не установлен", в справке написано, что перед использованием функции ОrderType, Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Таким образом, если ордер не был установлен, то он не сможет выбраться функцией ОрдерСелект(ее тоже надо правильно оформить, чтобы небыло заморочек где именно искать позу- только среди MODE_TRADES или среди всех поз)! А следовательно, OrderType ничего не возвращает. А значит, что если OrderType вам все-таки вернул ноль - то это только единственный вариант - выбранный ордер БАЙ.
Предлагаю прикрепить эту тему для небольших конкретных вопросов, дабы не создавались новые темы на каждый вопрос.
Что выдаст конструкция double val=Low[iLowest(NULL,0,MODE_LOW,1,1)] минимум 1-го бара или все-таки минимум 2-го бара?
это я читал но не очень понял, этот start bar входит в обсчет или обсчет начинается со следующего за ним бара?
и коректно ли использование double val=Low[iLowest(NULL,0,MODE_LOW,1,0)]?
Спасибо.
Смотрите 28. Поиск экстремумов цены
Как всегда исчерпывающе:) Спасибо еще раз.