Выбор из множества

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

Выбор из множества

#1 Сообщение Smile » Вс сен 03, 2006 11:15 am

Есть такой вопрос
есть множество тикетов ордеров ... мне нужно выполнить действие, если ордера нет в этом множестве, а потом его туда же добавить

делаю так:
Orderselect(i, SELECT_BY_POS,MODE_TRADES);
if (OrderTicket in [order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle]) = false then действие

- не работает хотя и компилируется, пробовал not ставить, не получается... видимо ставил его не так или не туда :(

Подскажите кто-нибудь как правильно :D
P.S. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...

Большое спасибо!

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Выбор из множества

#2 Сообщение Terranin » Вс сен 03, 2006 2:17 pm

Smile писал(а):Есть такой вопрос
есть множество тикетов ордеров ... мне нужно выполнить действие, если ордера нет в этом множестве, а потом его туда же добавить

делаю так:
Orderselect(i, SELECT_BY_POS,MODE_TRADES);
if (OrderTicket in [order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle]) = false then действие

- не работает хотя и компилируется, пробовал not ставить, не получается... видимо ставил его не так или не туда :(

Подскажите кто-нибудь как правильно :D
P.S. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...

Большое спасибо!
Мало информации чтобы что-то сказать.

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

Re: Выбор из множества

#3 Сообщение Smile » Пн сен 04, 2006 10:50 am

Мало информации чтобы что-то сказать.
Хорошо, я спрошу по-другому. Есть множество ордеров:
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle

как правильно проверить что тикета ордера нет в этом множестве?

Евгений
Сообщения: 34
Зарегистрирован: Вс авг 06, 2006 1:46 pm

Re: Выбор из множества

#4 Сообщение Евгений » Пн сен 04, 2006 1:10 pm

Smile писал(а):
Мало информации чтобы что-то сказать.
Хорошо, я спрошу по-другому. Есть множество ордеров:
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle

как правильно проверить что тикета ордера нет в этом множестве?
Слушай, вся фигня в том что судя по хелпу тикет получить не так просто если ордер уже выставлен, либо поиск по ценам либо надо заранее сохранять тикет при установке ордера.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Выбор из множества

#5 Сообщение Terranin » Пн сен 04, 2006 2:07 pm

Smile писал(а):
Мало информации чтобы что-то сказать.
Хорошо, я спрошу по-другому. Есть множество ордеров:
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle

как правильно проверить что тикета ордера нет в этом множестве?
Насколько мне помнится провека в множестве не поддерживает большие цифры вроде множество должно быть от 0 до 65535 что-то такое. А в твоем случае проще сделать перебор в цикле.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Выбор из множества

#6 Сообщение Terranin » Пн сен 04, 2006 2:10 pm

Евгений писал(а):
Smile писал(а):
Мало информации чтобы что-то сказать.
Хорошо, я спрошу по-другому. Есть множество ордеров:
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle

как правильно проверить что тикета ордера нет в этом множестве?
Слушай, вся фигня в том что судя по хелпу тикет получить не так просто если ордер уже выставлен, либо поиск по ценам либо надо заранее сохранять тикет при установке ордера.
А кто ж мешает запоминать тикет ордера при выставлении? Так и надо делать. В скором времени будет добавлен еще MagicNumber по многочисленным заявкам хотя я сам никогда его не использовал.

Евгений
Сообщения: 34
Зарегистрирован: Вс авг 06, 2006 1:46 pm

Re: Выбор из множества

#7 Сообщение Евгений » Пн сен 04, 2006 3:24 pm

Terranin писал(а): А кто ж мешает запоминать тикет ордера при выставлении?
Собсна об этом я и толкую, другое дело если стратегия пытается получить доступ к ордерам выставленным вне ее руками, но это уж к стратегиям мало относится!

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

#8 Сообщение Smile » Пн сен 04, 2006 4:08 pm

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

2 Terranin: Я и выкрутился сделав перебор в цикле, поэтому и процедура не сохранилась чтобы дать полный ее код. Просто захотел пойти по другому пути, задав выбор из множества, и заодно научиться работать с этими самыми множествами.

А о MagicNumber... будем ждать с нетерпением :D

Всем спасибо

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#9 Сообщение Terranin » Ср сен 27, 2006 3:40 am

Smile писал(а):Стратегия должна трелинговать некоторые позиции с одним шагом трейлинг-стопа, а другие с другим, ну и еще куча всего...

2 Terranin: Я и выкрутился сделав перебор в цикле, поэтому и процедура не сохранилась чтобы дать полный ее код. Просто захотел пойти по другому пути, задав выбор из множества, и заодно научиться работать с этими самыми множествами.

А о MagicNumber... будем ждать с нетерпением :D

Всем спасибо
MagicNumber уже сделан и вошел в 8 билд.

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

#10 Сообщение Smile » Ср сен 27, 2006 3:55 pm

Спасибо за MagicNumber. Было бы неплохо добавить возможность его изменять в ходе выполнения стратегии. Не обязательно функцией ModifyOrder можно и какой другой. Этой опции нет в MQL4, и это не позволяют делать ДЦ, но если использовать тестер для тестирования, и отладки стратегий, то во многих случаях это упростит:
1. Скорость написания стратегии (легче выбрать только определенные ордера из списка)
2. Алгоритмы построения этих стратегий, а значит и время на написание и отладку. (не нужно писать лишние процедуры по проверке закрытых ордеров, процедуры смены BuyStop на Buy например и т.д.)
3. Ну и популярность программы как мне кажется (если можно будет за пару часов написать стратегию и потом ее протестировать за пару часов, вместо того чтобы потратить уйму времени на написание сложных массивов ордеров и отладку. Да и проверка на каждом тике системные ресурсы забирает)

Терранину еще раз спасибо за MagicNumber :D

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#11 Сообщение Terranin » Вс окт 01, 2006 4:04 pm

Smile писал(а):Спасибо за MagicNumber. Было бы неплохо добавить возможность его изменять в ходе выполнения стратегии. Не обязательно функцией ModifyOrder можно и какой другой. Этой опции нет в MQL4, и это не позволяют делать ДЦ, но если использовать тестер для тестирования, и отладки стратегий, то во многих случаях это упростит:
1. Скорость написания стратегии (легче выбрать только определенные ордера из списка)
2. Алгоритмы построения этих стратегий, а значит и время на написание и отладку. (не нужно писать лишние процедуры по проверке закрытых ордеров, процедуры смены BuyStop на Buy например и т.д.)
3. Ну и популярность программы как мне кажется (если можно будет за пару часов написать стратегию и потом ее протестировать за пару часов, вместо того чтобы потратить уйму времени на написание сложных массивов ордеров и отладку. Да и проверка на каждом тике системные ресурсы забирает)

Терранину еще раз спасибо за MagicNumber :D
Тут дело вот в чем: мне хотелось сделать такую систему, чтобы после написания и отладки стратегии при переносе ее на реального провайдера не приходилось полностью ее переписывать. Сейчас например перенести систему на метатрейдер и обратно нет особых проблем, а если внести такие фичи то потом прийдется ломать логику системы и извращаться.
Asta la vista
Mike

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

#12 Сообщение Smile » Ср окт 04, 2006 12:25 pm

Тут дело вот в чем: мне хотелось сделать такую систему, чтобы после написания и отладки стратегии при переносе ее на реального провайдера не приходилось полностью ее переписывать. Сейчас например перенести систему на метатрейдер и обратно нет особых проблем, а если внести такие фичи то потом прийдется ломать логику системы и извращаться.
Тут твоя правда. Другое дело в том что под форекстестер стратегия переписывается по 10 раз в надежде ее оптимизировать, и найти стратегию с максимальной прибылью, а под метатрейдер легче переписать уже оптимизированную стратегию всего один раз. Ну или на худой конец когда ты понял что стратегия работает и дает прибыль, то ничего не стоит зная логику ее работы добавить некоторые процедуры, которые будут выполнять ту или иную проверку и т.д. для форекстестера с использованием функций только метатрейдера, проверить ее в тестере, и потом переписать под метатрейдер.

P.S. Спорить не буду, ты автор тебе и решать какой быть программе

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

Re: Выбор из множества

#13 Сообщение Mike » Ср апр 18, 2007 5:31 pm

Terranin писал(а):
Евгений писал(а):
Smile писал(а): Хорошо, я спрошу по-другому. Есть множество ордеров:
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle

как правильно проверить что тикета ордера нет в этом множестве?
Слушай, вся фигня в том что судя по хелпу тикет получить не так просто если ордер уже выставлен, либо поиск по ценам либо надо заранее сохранять тикет при установке ордера.
А кто ж мешает запоминать тикет ордера при выставлении? Так и надо делать. В скором времени будет добавлен еще MagicNumber по многочисленным заявкам хотя я сам никогда его не использовал.
А как его запомнить тикет ордера или магический номер?? Можно хоть пару строк для примера? А можно потом по этому тикету ну скажем удалить ордер, судя по всему да??

Спасибо

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#14 Сообщение Terranin » Ср апр 18, 2007 5:47 pm

var
OrderHandle: integer;

SendInstantOrder('USDCAD', op_Buy, 0.2, 1.2200, 1.2425, "comment", 12345, OrderHandle);

...

DeleteOrder(OrderHandle);
Asta la vista
Mike

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#15 Сообщение Mike » Ср апр 18, 2007 7:12 pm

НУ ничего не могу понять.... Короче вот:
(Решил разбираться с Хэндлами, а не с магическими номерами)

Выставляю ордер-

Код: Выделить всё

SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
Далее пишу-

Код: Выделить всё

SavedHandle:= OrderTicket;
Print(format('SavedHandle=%d', [SavedHandle]));
Реальный Handle = 206238, т.е. в журнале, после установки ордера пишется эта цифра. И тут же я пытаюсь получить именно эту цифру 206238, а показывает SavedHandle = 206237, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#16 Сообщение Terranin » Ср апр 18, 2007 7:22 pm

Mike писал(а):НУ ничего не могу понять.... Короче вот:
(Решил разбираться с Хэндлами, а не с магическими номерами)

Выставляю ордер-

Код: Выделить всё

SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
Далее пишу-

Код: Выделить всё

SavedHandle:= OrderTicket;
Print(format('SavedHandle=%d', [SavedHandle]));
Реальный Handle = 206238, т.е. в журнале, после установки ордера пишется эта цифра. И тут же я пытаюсь получить именно эту цифру 206238, а показывает SavedHandle = 206237, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?
Вообще-то ты уже получил хендл в переменную OrderHandle при выставлении ордера. Так что по-идее надо бы написать SavedHandle := OrderHandle;

Чтобы получить OrderTicket надо сначала выбрать ордер функцией OrderSelect(...)
Asta la vista
Mike

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#17 Сообщение Mike » Ср апр 18, 2007 7:53 pm

А как быть тогда с двумя ордерами:

Код: Выделить всё

SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);

SavedHandle:= OrderHandle;
Print(format('SavedHandle=%d', [SavedHandle]));

SendPendingOrder(Symbol, op_SellStop, 0.1, l + ((StopLoss-5) * point), 0, l - 5*point, OrderHandle);

Handle:= OrderHandle;
Print(format('Handle=%d', [Handle]));
В случае бая выдает все изумительно, но в случае села пишет вообще не понятно что , откуда эта цифра - 4704812?

Спасибо
Последний раз редактировалось Mike Ср апр 18, 2007 8:16 pm, всего редактировалось 2 раза.

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#18 Сообщение Mike » Ср апр 18, 2007 7:56 pm

Упс, извиняюсь просмотрел результат, в посте выше все работает, так как надо.

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#19 Сообщение Mike » Чт апр 19, 2007 11:10 am

Terranin писал(а):
Mike писал(а):НУ ничего не могу понять.... Короче вот:
(Решил разбираться с Хэндлами, а не с магическими номерами)

Выставляю ордер-

Код: Выделить всё

SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
Далее пишу-

Код: Выделить всё

SavedHandle:= OrderTicket;
Print(format('SavedHandle=%d', [SavedHandle]));
Реальный Handle = 206238, т.е. в журнале, после установки ордера пишется эта цифра. И тут же я пытаюсь получить именно эту цифру 206238, а показывает SavedHandle = 206237, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?
Вообще-то ты уже получил хендл в переменную OrderHandle при выставлении ордера. Так что по-идее надо бы написать SavedHandle := OrderHandle;

Чтобы получить OrderTicket надо сначала выбрать ордер функцией OrderSelect(...)

Код: Выделить всё

SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
SavedHandle:= OrderTicket;


SendPendingOrder(Symbol, op_SellStop, 0.1, l + ((StopLoss-5) * point), 0, l - 5*point, OrderHandle1);
Handle:= OrderTicket;
Тут я не выбирал ОрдерСелектом и все работает правильно. Т.е. данные можно получить от функции ОрдерТикет?!

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#20 Сообщение Terranin » Чт апр 19, 2007 2:42 pm

Один раз правильно, другой неправильно... Возможно старые данные сохранились в промежуточных переменных. Надо хелп читать, там четко написано что перед вызовом функции OrderTicket и еще кучи других надо этот ордер выбрать функцией OrderSelect. Эта функция если нашла нужный ордер сохраняет его данные во внутреннюю структуру и потом берет оттуда через OrderTicket, OrderOpenTime, OrderClosePrice и т.д.

А если ордер не выбрать там может быть все что угодно.
Asta la vista
Mike

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#21 Сообщение Mike » Чт апр 19, 2007 7:27 pm

Terranin писал(а):Один раз правильно, другой неправильно... Возможно старые данные сохранились в промежуточных переменных. Надо хелп читать, там четко написано что перед вызовом функции OrderTicket и еще кучи других надо этот ордер выбрать функцией OrderSelect. Эта функция если нашла нужный ордер сохраняет его данные во внутреннюю структуру и потом берет оттуда через OrderTicket, OrderOpenTime, OrderClosePrice и т.д.

А если ордер не выбрать там может быть все что угодно.
Так читаю, просто понимаю не все сразу, я же не программер, причем далеко не программер!!! Но разобраться хочется, поэтому буду стараться. В любом случае Спасибо тебе за помощь!!

VVV
Сообщения: 13
Зарегистрирован: Сб дек 09, 2006 12:50 pm

#22 Сообщение VVV » Ср май 30, 2007 8:35 pm

Добрый день! Такая вот непонятния штука.
Мне нужно проверить, был ли на текущем (дневном) баре закрыт ордер.
Но где-то ошибка...
Пока ордеров нет даже открытых функция фозвращает 2, но как только открываю ордер даже не дожидаясь закрытия ордера функция возврашает 1. Т.е. ищет не в HISTORY??? Где ошибка?

Код: Выделить всё

function CheсkLastOrder():integer;
var
i, lastticket:integer;
begin
    lastticket:=0;
for i:=0 to HistoryTotal -1 do
 begin
 if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) then
  if lastticket < OrderTicket then lastticket := OrderTicket;
 end;

   if OrderSelect(lastticket, SELECT_BY_ticket, MODE_HISTORY) then
   begin
     if DayOf(OrderCloseTime) = DayOf(Time(0)) then result:=0 else result:=1;
   end
    else
    result:=2;
end;
ЗЫ, может есть более грамотный вариант?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#23 Сообщение Terranin » Ср май 30, 2007 8:44 pm

VVV писал(а):Добрый день! Такая вот непонятния штука.
Мне нужно проверить, был ли на текущем (дневном) баре закрыт ордер.
Но где-то ошибка...
Пока ордеров нет даже открытых функция фозвращает 2, но как только открываю ордер даже не дожидаясь закрытия ордера функция возврашает 1. Т.е. ищет не в HISTORY??? Где ошибка?

Код: Выделить всё

function CheсkLastOrder():integer;
var
i, lastticket:integer;
begin
    lastticket:=0;
for i:=0 to HistoryTotal -1 do
 begin
 if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) then
  if lastticket < OrderTicket then lastticket := OrderTicket;
 end;

   if OrderSelect(lastticket, SELECT_BY_ticket, MODE_HISTORY) then
   begin
     if DayOf(OrderCloseTime) = DayOf(Time(0)) then result:=0 else result:=1;
   end
    else
    result:=2;
end;
ЗЫ, может есть более грамотный вариант?

Код: Выделить всё

for i:=0 to HistoryTotal - 1 do
  if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) then 
    if trunc(OrderCloseTime) = trunc(Time(0)) then 
      begin
        result := 1;
        exit;
      end;

result := 0;
функция проходит по истории и смотрит если у какого-то ордера тот же день (trunc возвращает целую часть = день) то функция вернет 1, иначе вернет 0.
Asta la vista
Mike

Ответить