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

 
grotesque:

все... немогу... пошел следующим путем... но опять что-то не так:


selord=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit,
                 "Candles",123,0,Red);
ot=OrdersTotal();
for(int cnt=0;cnt<=ot;cnt++)
  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if(OrderType()==OP_BUY) 
        // получается верным для ордеров имеющих порядковый номер '0' и '1',
        // когда ордера с номер 1 нету!

        Alert("Порядковый номер ордера: ",cnt,"   Тикет ордера:",OrderTicket(),
              "   ИЗ:",ot); 
               }

я что-то не понимаю????? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Здесь мне кажется написано неправильно условие цикла for. ОрдерсТотал дает общее количество ордеров (допустим их 10). А просматриваете вы их начиная с индекса 0. Следовательно вы хотите просмотреть не 10 а 11 ордеров. Тут нужно сделать
for (int cnt=0;cnt<ot;cnt++). И еще после алерта оператор return добавить нужно.
Попробуйте так. Знаете, я тоже чайник, поэтому тоже могу что-то неправильно понимать. Но всегда все приходится понимать методом тыка.
Сейчас перечитаю ваше предыдущее сообщение и отвечу.
 

Как чайник - чайнику. Попробуйте пойти моим путем :). Ищу прогу, а в ней кусок кода, в котором есть нужные мне действия, а не изобретаю код сам.
Результат: (похоже на Ваши вопросы) посмотрите в КодеБазе->Скрипты мои КлозеАллБайСелл, Оверкиль и Локер. Там есть перебор и поиск определенных ордеров, и действия с найденными. Кстати, если вам нужен номер конкретной позы, то отслеживают магик.

 
Aikon писал (а):

Здесь мне кажется написано неправильно условие цикла for. ОрдерсТотал дает общее количество ордеров (допустим их 10). А просматриваете вы их начиная с индекса 0. Следовательно вы хотите просмотреть не 10 а 11 ордеров. Тут нужно сделать
for (int cnt=0;cnt<ot;cnt++). И еще после алерта оператор return добавить нужно.
Попробуйте так. Знаете, я тоже чайник, поэтому тоже могу что-то неправильно понимать. Но всегда все приходится понимать методом тыка.
Сейчас перечитаю ваше предыдущее сообщение и отвечу.

Согласен, но тогда бы всего навсего условие OrderType()==OP_BUY - было неверным и Алерт ничего не выдал. 
Но, кажется понял... Условие
OrderType()==OP_BUY - ничего не дает...
Константа OP_BUY, из приведенного вашего списка в первом сообщении темы, имеет значение '0'.
Это же значение возвращает OrderType() если не выбран ордер функцией ОрдерСелект.
 
Итог, ТипОрдера нельзя узнать.
 
Bookkeeper:

Как чайник - чайнику. Попробуйте пойти моим путем :). Ищу прогу, а в ней кусок кода, в котором есть нужные мне действия, а не изобретаю код сам.
Результат: (похоже на Ваши вопросы) посмотрите в КодеБазе->Скрипты мои КлозеАллБайСелл, Оверкиль и Локер. Там есть перебор и поиск определенных ордеров, и действия с найденными. Кстати, если вам нужен номер конкретной позы, то отслеживают магик.


Что значит "конкретной позы"? - нужны все позиции...
 
А что из разработчиков никто не подскажет как организовать подобную выборку ордера? Вообще, уже столько конкретных вопросов и ни одного конкретного ответа, наталкивает на мысль что сами разработчики не знают, а MQL4 - это на самом деле не язык программирован, а попытка чего-то автоматизировать логическими операциями... еще с Сями сравнили. ..
 
grotesque:
А что из разработчиков никто не подскажет как организовать подобную выборку ордера? Вообще, уже столько конкретных вопросов и ни одного конкретного ответа, наталкивает на мысль что сами разработчики не знают, а MQL4 - это на самом деле не язык программирован, а попытка чего-то автоматизировать логическими операциями. .. еще с Сями сравнили. ..
Да просто напросто никому неинтересно каждому вновь прибывшему рассказывать в 100-ый раз про одно и то же в то время как всё уже подробно разжёвано в статьях на сайте!
'Управление ордерами – это просто'
http://www.alpari-idc.ru/ru/experts/articles/8.html
Если скажете, что там всё очень сложно и непонятно описано, то просто берите любой готовый работающий код из CodeBase и разбирайтесь с каждой строкой. Ведь всё равно за вас это никто не сделает! Вспомните как сами например учили английский язык. Пока все упражнения не разберёшь - всё равно ничего из объяснения преподавателя будет непонятно.
 
grotesque:

Издеваетесь?... извиняюсь, но OrderTicket() - "Возвращает номер тикета. .." и OrderSend() - "Возвращает номер тикета...", в чем разница, зачем использовать один вместо другого?...
................

Вообще про OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE) сказано: "ticket - Уникальный порядковый номер ордера.", т. е. НЕ номер тикета! Но опять смотрим в MACD Sample.mq4:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); - видим противоречие...

Может кто-нибудь тогда точно ответить, первая переменная в функции ОредерКлозе - это номер тикета возвращаемый сервером или номер позиции ордера в списке терминала???

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

grotesque:

пробуем:

ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,Ask-TakeProfit,"Candles", 123,0,Red);

OrderSelect(ticket[nt],SELECT_BY_TICKET,);

OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE);

selord=OrderSelect(ticket[nt],SELECT_BY_TICKET);

if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ", ticket[nt]); //Alert: Selected order: 1

другими словами, по номеру тикета (тому что возвращает сервер) невозможно определить открытый он или уже закрытый?


Тип ордера можно узнать! Тут изначально вы выбираете ордер по номеру тикета. Так нельзя определить закрыт он или открыт.Так как он выбирается и среди открытых и отложенных ордеров, и среди закрытых.
Если вам нужно выбрать только открытые ордера, как я уже отвечала вам на вопрос о том как выбрать только открытые позиции:
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 , он игнорируется.
 

Для того чтобы понять вашу ошибку, я попыталась сама протестить этот кусочек кода. ВСЕ НОРМАЛЬНО ТЕСТИРУЕТ!!!
Тестирование проводилось на котировках Daily за 5 дней с 3 по 7 января 2005 года по валюте EURGBP (модель ПО ЦЕНАМ ОТКРЫТИЯ!). То есть функция Start() запускалась раз в день, следовательно опза открывалась раз в день. Смотрите что получилось:
Код1: Здесь для ОрдерСелект я указала выбирать по тикетам среди ВСЕХ позиций : открытых, закрытых и отложенных

int start() 
  { 
   int ticket;
   int selord;
 
   ticket=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"Candles",123,0,Red);
   OrderClose(ticket,1,Ask,3,CLR_NONE);
   selord=OrderSelect(ticket,SELECT_BY_TICKET);
   if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ",ticket); 
  }

Результат теста: видим что все нормально работает. так как поза выбирается по тикетам: выбирались и закрытые позиции тоже, то срабатывал алерт.


Код2: Здесь для ОрдерСелект я указала выбирать по номерам позиций в списке СРЕДИ ОТКРЫТЫХ И ОТЛОЖЕННЫХ, и с помощью этого кусочка OrderType()<=OP_SELL мы ограничили рассмотрение только ОТКРЫТЫМИ ордерами

int start() 
  { 
   int ticket;
   int selord;
   ticket=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"Candles",123,0,Red);
   OrderClose(ticket,1,Ask,3,CLR_NONE);
   selord=OrderSelect(ticket,SELECT_BY_POS,MODE_TRADES);
   if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ",ticket); 
  }
Результат теста: так как поза выбирается по не по тикетам, а среди открытых позиций (среди баев и селлов), закрытые позиции не были выбраны, следовательно алерт не работал


ИТАК, видим, что все работает, следовательно в предложенном вами коде ошибок небыло!
Ошибка была вот в чем.....
Попробуем тестануть код 1 так: поставим модель ВСЕ ТИКИ


Видим, что 386 сделок открылось и закрылось как полагается. Дальше сделка открыться не смогла. Потому что небыло свободной маржи, то есть нехватило денег. Следовательно, нетоткрытый OrderSend вернул переменной ticket - нуль. И поэтому функция ОrderClose обозвала этот параметр неправильным.
Вся ваша ошибка в том, что ваша позиция открывается с каждым тиком, который может меняться ежесекундно. И нет никаких ограничений.
Удачи вам! Будьте внимательны!
 
solandr:
Да просто напросто никому неинтересно каждому вновь прибывшему рассказывать в 100-ый раз про одно и то же в то время как всё уже подробно разжёвано в статьях на сайте!
'Управление ордерами – это просто'
http://www.alpari-idc.ru/ru/experts/articles/8.html
Если скажете, что там всё очень сложно и непонятно описано, то просто берите любой готовый работающий код из CodeBase и разбирайтесь с каждой строкой. Ведь всё равно за вас это никто не сделает! Вспомните как сами например учили английский язык. Пока все упражнения не разберёшь - всё равно ничего из объяснения преподавателя будет непонятно.
вполне логично, ведь в терминале существует "Справка", по крайней мере пользователи ее таковой считают и руководствуются при написании программ... но видимо зря...
 
Aikon:
Нет, я и не думала издеваться. Еще раз повторюсь, что я тоже чайник, и тоже чтото могу не так понимать, хотя пытаюсь разобраться :) Действительно, по логике скорее всего вы правы насчет OrderTicket() и OrderSend(), так что ругается программа не изза этого.
Если для OrderClose написано: "ticket - Уникальный порядковый номер ордера.", то само слово УНИКАЛЬНЫЙ уже означает что это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.

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