Страница 1 из 1

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

Добавлено: Вс сен 03, 2006 11:15 am
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. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...

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

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

Добавлено: Вс сен 03, 2006 2:17 pm
Terranin
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. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: Пн сен 04, 2006 3:24 pm
Евгений
Terranin писал(а): А кто ж мешает запоминать тикет ордера при выставлении?
Собсна об этом я и толкую, другое дело если стратегия пытается получить доступ к ордерам выставленным вне ее руками, но это уж к стратегиям мало относится!

Добавлено: Пн сен 04, 2006 4:08 pm
Smile
Стратегия должна трелинговать некоторые позиции с одним шагом трейлинг-стопа, а другие с другим, ну и еще куча всего...

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

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

Всем спасибо

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо

Добавлено: Ср апр 18, 2007 5:47 pm
Terranin
var
OrderHandle: integer;

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

...

DeleteOrder(OrderHandle);

Добавлено: Ср апр 18, 2007 7:12 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, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?

Добавлено: Ср апр 18, 2007 7:22 pm
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(...)

Добавлено: Ср апр 18, 2007 7:53 pm
Mike
А как быть тогда с двумя ордерами:

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

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?

Спасибо

Добавлено: Ср апр 18, 2007 7:56 pm
Mike
Упс, извиняюсь просмотрел результат, в посте выше все работает, так как надо.

Добавлено: Чт апр 19, 2007 11:10 am
Mike
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;
Тут я не выбирал ОрдерСелектом и все работает правильно. Т.е. данные можно получить от функции ОрдерТикет?!

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

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

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

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

Добавлено: Ср май 30, 2007 8:35 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;
ЗЫ, может есть более грамотный вариант?

Добавлено: Ср май 30, 2007 8:44 pm
Terranin
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.