Вопрос по OrderType(). - страница 3

 
Aikon:
Тип ордера можно узнать! Тут изначально вы выбираете ордер по номеру тикета. Так нельзя определить закрыт он или открыт.Так как он выбирается и среди открытых и отложенных ордеров, и среди закрытых.
Если вам нужно выбрать только открытые ордера, как я уже отвечала вам на вопрос о том как выбрать только открытые позиции:
for(cnt=0;cnt<OrdersTotal();cnt++)               
  {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //выбираем ордер
    if (OrderType()<=OP_SELL)                    // если тип ордера бай или селл..
      {
       ...                    
      }
  
  }
То есть использовать 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) - Спрашивается нафиг?

Почему косяк? В справке написано: Параметр pool игнорируется, если ордер выбирается по номеру тикета. Так что даже если его написали при SELECT_BY_TICKET , он игнорируется.
Это я и хотел выяснить, но как когда вы заговорили про ветвление с OrderType()<=OP_SELL, мне показалось что вы хотите сказать что оно отсеивает закрытые ордера... от чего сильно запутался... А нужно было всего лишь смотреть время его закрытия, т. к. если оно равно 0 значит орден открыт и выбран из списка открытых...

Да-да, понял свою ошибку... забыл проверить что орден выбран перед определением его типа...
А согласитесь, если функция при разных аргументах возвращает одинаковое значение, то нельзя сказать точно что этот результат означает и вообще то ли она сделала что нам нужно было. Как это получается в случае с функцией OrderType(), - возвращает '0' если ордер установлен на покупку или ордер не установлен, т.е. обычно в таких случаях передаваемый функции аргумент равен 'NULL'. Это не ошибка, это результат работы функции, почему-то не описанной в справке.. ?
 
Aikon:
Видим, что 386 сделок открылось и закрылось как полагается. Дальше сделка открыться не смогла. Потому что небыло свободной маржи, то есть нехватило денег. Следовательно, нетоткрытый OrderSend вернул переменной ticket - нуль. И поэтому функция ОrderClose обозвала этот параметр неправильным.
Все написано верно.
Маржа и тп., вообще ничего лишнего, не могло повлиять, точно.. .



и возвращаясь к MACD Sample.mq4, становится непонятно почему там используется фонкция с такими аргументами: OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)...
 
grotesque:
Aikon писал (а):
Нет, я и не думала издеваться. Еще раз повторюсь, что я тоже чайник, и тоже чтото могу не так понимать, хотя пытаюсь разобраться :) Действительно, по логике скорее всего вы правы насчет OrderTicket() и OrderSend(), так что ругается программа не изза этого.
Если для OrderClose написано: "ticket - Уникальный порядковый номер ордера.", то само слово УНИКАЛЬНЫЙ уже означает что это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.

Уникальный - означает всего лишь 'неповторяющийся', т.е. не может быть несколько тикетов, например, с номером 2... тоже самое с позициями, они тоже уникальны на данный момент времени.

Уникальный, да это неповторяющийся.Но все равно не соглашусь с вами. Исходя из того что позиция может закрываться по ОрдерКлоуз не только сразу после ее открытия ( как в вашем коде),но и в любой другой части программы, использование в этой функции уникального ВРЕМЕННОГО порядкового номера ордера просто ненужно и не логично. Допустим, у нас в списке 4 позиции, треться закрылась по каким то правилам, и четвертая стала третьей. Все. ...номер поменялся. ...а если нам теперь ее надо закрыть?
Уверена, что ticket - это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.
 
Aikon писал (а):
Уверена, что ticket - это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.

Так и есть
 
grotesque:

и возвращаясь к MACD Sample.mq4, становится непонятно почему там используется фонкция с такими аргументами: OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)...
Знаете, я сама когда пишу эксперт, чтобы заново не писать какую либо функцию, часто пользуюсь копированием того, что уже написано. Возможно, и здесь так было, функцию скопировали, заменили нужный параметр, а этот оставили. Это ведь тоже люди создают.. ..тем более, что использование MODE_TRADES в данном случае НЕ является ошибкой, так как он тут проигнорируется программой (что описано в справке). Поэтому вполне можно и так оставить код.
 

MODE_TRADES - (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров.
Если вы долго мучаетесь и у вас ничего не получается - попробуйте почитать документацию! - https://docs.mql4.com/ru/trading/OrderSelect

 
grotesque:

А согласитесь, если функция при разных аргументах возвращает одинаковое значение, то нельзя сказать точно что этот результат означает и вообще то ли она сделала что нам нужно было. Как это получается в случае с функцией OrderType(), - возвращает '0' если ордер установлен на покупку или ордер не установлен, т.е. обычно в таких случаях передаваемый функции аргумент равен 'NULL'. Это не ошибка, это результат работы функции, почему-то не описанной в справке.. ?
Почему же? в справке все написано. Давайте посмотрим справку:

int OrderType( )
Возвращает тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:
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-го бара?

Parameters:

symbol - Symbol the data of which should be used to calculate indicator. NULL means the current symbol.
timeframe - Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe.
type - Series array identifier. It can be any of Series array identifier enumeration values.
count - Number of periods (in direction from the start bar to the back one) on which the calculation is carried out.
start - Shift showing the bar, relative to the current bar, that the data should be taken from.

это я читал но не очень понял, этот start bar входит в обсчет или обсчет начинается со следующего за ним бара?
и коректно ли использование double val=Low[iLowest(NULL,0,MODE_LOW,1,0)]?

Спасибо.

 
Эта конструкция выдаст минимум бара с индексом 1
Смотрите
28. Поиск экстремумов цены
 

Как всегда исчерпывающе:) Спасибо еще раз.

Причина обращения: