Выбор из множества
-
- Сообщения: 27
- Зарегистрирован: Вт авг 08, 2006 1:06 pm
Выбор из множества
Есть такой вопрос
есть множество тикетов ордеров ... мне нужно выполнить действие, если ордера нет в этом множестве, а потом его туда же добавить
делаю так:
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 ставить, не получается... видимо ставил его не так или не туда
Подскажите кто-нибудь как правильно
P.S. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...
Большое спасибо!
есть множество тикетов ордеров ... мне нужно выполнить действие, если ордера нет в этом множестве, а потом его туда же добавить
делаю так:
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 ставить, не получается... видимо ставил его не так или не туда
Подскажите кто-нибудь как правильно
P.S. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...
Большое спасибо!
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Выбор из множества
Мало информации чтобы что-то сказать.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 ставить, не получается... видимо ставил его не так или не туда
Подскажите кто-нибудь как правильно
P.S. Я то выкрутился в этот раз, но чтобы в следующий раз не мучаться...
Большое спасибо!
-
- Сообщения: 27
- Зарегистрирован: Вт авг 08, 2006 1:06 pm
Re: Выбор из множества
Хорошо, я спрошу по-другому. Есть множество ордеров:Мало информации чтобы что-то сказать.
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle
как правильно проверить что тикета ордера нет в этом множестве?
-
- Сообщения: 34
- Зарегистрирован: Вс авг 06, 2006 1:46 pm
Re: Выбор из множества
Слушай, вся фигня в том что судя по хелпу тикет получить не так просто если ордер уже выставлен, либо поиск по ценам либо надо заранее сохранять тикет при установке ордера.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: Выбор из множества
Насколько мне помнится провека в множестве не поддерживает большие цифры вроде множество должно быть от 0 до 65535 что-то такое. А в твоем случае проще сделать перебор в цикле.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: Выбор из множества
А кто ж мешает запоминать тикет ордера при выставлении? Так и надо делать. В скором времени будет добавлен еще MagicNumber по многочисленным заявкам хотя я сам никогда его не использовал.Евгений писал(а):Слушай, вся фигня в том что судя по хелпу тикет получить не так просто если ордер уже выставлен, либо поиск по ценам либо надо заранее сохранять тикет при установке ордера.Smile писал(а):Хорошо, я спрошу по-другому. Есть множество ордеров:Мало информации чтобы что-то сказать.
order[1].handle,order[2].handle,order[3].handle,order[4].handle,order[5].handle
как правильно проверить что тикета ордера нет в этом множестве?
-
- Сообщения: 34
- Зарегистрирован: Вс авг 06, 2006 1:46 pm
Re: Выбор из множества
Собсна об этом я и толкую, другое дело если стратегия пытается получить доступ к ордерам выставленным вне ее руками, но это уж к стратегиям мало относится!Terranin писал(а): А кто ж мешает запоминать тикет ордера при выставлении?
-
- Сообщения: 27
- Зарегистрирован: Вт авг 08, 2006 1:06 pm
Стратегия должна трелинговать некоторые позиции с одним шагом трейлинг-стопа, а другие с другим, ну и еще куча всего...
2 Terranin: Я и выкрутился сделав перебор в цикле, поэтому и процедура не сохранилась чтобы дать полный ее код. Просто захотел пойти по другому пути, задав выбор из множества, и заодно научиться работать с этими самыми множествами.
А о MagicNumber... будем ждать с нетерпением
Всем спасибо
2 Terranin: Я и выкрутился сделав перебор в цикле, поэтому и процедура не сохранилась чтобы дать полный ее код. Просто захотел пойти по другому пути, задав выбор из множества, и заодно научиться работать с этими самыми множествами.
А о MagicNumber... будем ждать с нетерпением
Всем спасибо
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
MagicNumber уже сделан и вошел в 8 билд.Smile писал(а):Стратегия должна трелинговать некоторые позиции с одним шагом трейлинг-стопа, а другие с другим, ну и еще куча всего...
2 Terranin: Я и выкрутился сделав перебор в цикле, поэтому и процедура не сохранилась чтобы дать полный ее код. Просто захотел пойти по другому пути, задав выбор из множества, и заодно научиться работать с этими самыми множествами.
А о MagicNumber... будем ждать с нетерпением
Всем спасибо
-
- Сообщения: 27
- Зарегистрирован: Вт авг 08, 2006 1:06 pm
Спасибо за MagicNumber. Было бы неплохо добавить возможность его изменять в ходе выполнения стратегии. Не обязательно функцией ModifyOrder можно и какой другой. Этой опции нет в MQL4, и это не позволяют делать ДЦ, но если использовать тестер для тестирования, и отладки стратегий, то во многих случаях это упростит:
1. Скорость написания стратегии (легче выбрать только определенные ордера из списка)
2. Алгоритмы построения этих стратегий, а значит и время на написание и отладку. (не нужно писать лишние процедуры по проверке закрытых ордеров, процедуры смены BuyStop на Buy например и т.д.)
3. Ну и популярность программы как мне кажется (если можно будет за пару часов написать стратегию и потом ее протестировать за пару часов, вместо того чтобы потратить уйму времени на написание сложных массивов ордеров и отладку. Да и проверка на каждом тике системные ресурсы забирает)
Терранину еще раз спасибо за MagicNumber
1. Скорость написания стратегии (легче выбрать только определенные ордера из списка)
2. Алгоритмы построения этих стратегий, а значит и время на написание и отладку. (не нужно писать лишние процедуры по проверке закрытых ордеров, процедуры смены BuyStop на Buy например и т.д.)
3. Ну и популярность программы как мне кажется (если можно будет за пару часов написать стратегию и потом ее протестировать за пару часов, вместо того чтобы потратить уйму времени на написание сложных массивов ордеров и отладку. Да и проверка на каждом тике системные ресурсы забирает)
Терранину еще раз спасибо за MagicNumber
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Тут дело вот в чем: мне хотелось сделать такую систему, чтобы после написания и отладки стратегии при переносе ее на реального провайдера не приходилось полностью ее переписывать. Сейчас например перенести систему на метатрейдер и обратно нет особых проблем, а если внести такие фичи то потом прийдется ломать логику системы и извращаться.Smile писал(а):Спасибо за MagicNumber. Было бы неплохо добавить возможность его изменять в ходе выполнения стратегии. Не обязательно функцией ModifyOrder можно и какой другой. Этой опции нет в MQL4, и это не позволяют делать ДЦ, но если использовать тестер для тестирования, и отладки стратегий, то во многих случаях это упростит:
1. Скорость написания стратегии (легче выбрать только определенные ордера из списка)
2. Алгоритмы построения этих стратегий, а значит и время на написание и отладку. (не нужно писать лишние процедуры по проверке закрытых ордеров, процедуры смены BuyStop на Buy например и т.д.)
3. Ну и популярность программы как мне кажется (если можно будет за пару часов написать стратегию и потом ее протестировать за пару часов, вместо того чтобы потратить уйму времени на написание сложных массивов ордеров и отладку. Да и проверка на каждом тике системные ресурсы забирает)
Терранину еще раз спасибо за MagicNumber
Asta la vista
Mike
Mike
-
- Сообщения: 27
- Зарегистрирован: Вт авг 08, 2006 1:06 pm
Тут твоя правда. Другое дело в том что под форекстестер стратегия переписывается по 10 раз в надежде ее оптимизировать, и найти стратегию с максимальной прибылью, а под метатрейдер легче переписать уже оптимизированную стратегию всего один раз. Ну или на худой конец когда ты понял что стратегия работает и дает прибыль, то ничего не стоит зная логику ее работы добавить некоторые процедуры, которые будут выполнять ту или иную проверку и т.д. для форекстестера с использованием функций только метатрейдера, проверить ее в тестере, и потом переписать под метатрейдер.Тут дело вот в чем: мне хотелось сделать такую систему, чтобы после написания и отладки стратегии при переносе ее на реального провайдера не приходилось полностью ее переписывать. Сейчас например перенести систему на метатрейдер и обратно нет особых проблем, а если внести такие фичи то потом прийдется ломать логику системы и извращаться.
P.S. Спорить не буду, ты автор тебе и решать какой быть программе
-
- Сообщения: 38
- Зарегистрирован: Пт мар 16, 2007 2:03 pm
Re: Выбор из множества
А как его запомнить тикет ордера или магический номер?? Можно хоть пару строк для примера? А можно потом по этому тикету ну скажем удалить ордер, судя по всему да??Terranin писал(а):А кто ж мешает запоминать тикет ордера при выставлении? Так и надо делать. В скором времени будет добавлен еще MagicNumber по многочисленным заявкам хотя я сам никогда его не использовал.Евгений писал(а):Слушай, вся фигня в том что судя по хелпу тикет получить не так просто если ордер уже выставлен, либо поиск по ценам либо надо заранее сохранять тикет при установке ордера.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
-
- Сообщения: 38
- Зарегистрирован: Пт мар 16, 2007 2:03 pm
НУ ничего не могу понять.... Короче вот:
(Решил разбираться с Хэндлами, а не с магическими номерами)
Выставляю ордер-
Далее пишу-
Реальный Handle = 206238, т.е. в журнале, после установки ордера пишется эта цифра. И тут же я пытаюсь получить именно эту цифру 206238, а показывает SavedHandle = 206237, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?
(Решил разбираться с Хэндлами, а не с магическими номерами)
Выставляю ордер-
Код: Выделить всё
SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
Код: Выделить всё
SavedHandle:= OrderTicket;
Print(format('SavedHandle=%d', [SavedHandle]));
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Вообще-то ты уже получил хендл в переменную OrderHandle при выставлении ордера. Так что по-идее надо бы написать SavedHandle := OrderHandle;Mike писал(а):НУ ничего не могу понять.... Короче вот:
(Решил разбираться с Хэндлами, а не с магическими номерами)
Выставляю ордер-Далее пишу-Код: Выделить всё
SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
Реальный Handle = 206238, т.е. в журнале, после установки ордера пишется эта цифра. И тут же я пытаюсь получить именно эту цифру 206238, а показывает SavedHandle = 206237, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?Код: Выделить всё
SavedHandle:= OrderTicket; Print(format('SavedHandle=%d', [SavedHandle]));
Чтобы получить OrderTicket надо сначала выбрать ордер функцией OrderSelect(...)
Asta la vista
Mike
Mike
-
- Сообщения: 38
- Зарегистрирован: Пт мар 16, 2007 2:03 pm
А как быть тогда с двумя ордерами:
В случае бая выдает все изумительно, но в случае села пишет вообще не понятно что , откуда эта цифра - 4704812?
Спасибо
Код: Выделить всё
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]));
Спасибо
Последний раз редактировалось Mike Ср апр 18, 2007 8:16 pm, всего редактировалось 2 раза.
-
- Сообщения: 38
- Зарегистрирован: Пт мар 16, 2007 2:03 pm
-
- Сообщения: 38
- Зарегистрирован: Пт мар 16, 2007 2:03 pm
Terranin писал(а):Вообще-то ты уже получил хендл в переменную OrderHandle при выставлении ордера. Так что по-идее надо бы написать SavedHandle := OrderHandle;Mike писал(а):НУ ничего не могу понять.... Короче вот:
(Решил разбираться с Хэндлами, а не с магическими номерами)
Выставляю ордер-Далее пишу-Код: Выделить всё
SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
Реальный Handle = 206238, т.е. в журнале, после установки ордера пишется эта цифра. И тут же я пытаюсь получить именно эту цифру 206238, а показывает SavedHandle = 206237, в чем ошибка?? Почему значение разное? В моем понимании должно быть одинаковые значения или я не прав?Код: Выделить всё
SavedHandle:= OrderTicket; Print(format('SavedHandle=%d', [SavedHandle]));
Чтобы получить 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
Один раз правильно, другой неправильно... Возможно старые данные сохранились в промежуточных переменных. Надо хелп читать, там четко написано что перед вызовом функции OrderTicket и еще кучи других надо этот ордер выбрать функцией OrderSelect. Эта функция если нашла нужный ордер сохраняет его данные во внутреннюю структуру и потом берет оттуда через OrderTicket, OrderOpenTime, OrderClosePrice и т.д.
А если ордер не выбрать там может быть все что угодно.
А если ордер не выбрать там может быть все что угодно.
Asta la vista
Mike
Mike
-
- Сообщения: 38
- Зарегистрирован: Пт мар 16, 2007 2:03 pm
Так читаю, просто понимаю не все сразу, я же не программер, причем далеко не программер!!! Но разобраться хочется, поэтому буду стараться. В любом случае Спасибо тебе за помощь!!Terranin писал(а):Один раз правильно, другой неправильно... Возможно старые данные сохранились в промежуточных переменных. Надо хелп читать, там четко написано что перед вызовом функции OrderTicket и еще кучи других надо этот ордер выбрать функцией OrderSelect. Эта функция если нашла нужный ордер сохраняет его данные во внутреннюю структуру и потом берет оттуда через OrderTicket, OrderOpenTime, OrderClosePrice и т.д.
А если ордер не выбрать там может быть все что угодно.
-
- Сообщения: 13
- Зарегистрирован: Сб дек 09, 2006 12:50 pm
Добрый день! Такая вот непонятния штука.
Мне нужно проверить, был ли на текущем (дневном) баре закрыт ордер.
Но где-то ошибка...
Пока ордеров нет даже открытых функция фозвращает 2, но как только открываю ордер даже не дожидаясь закрытия ордера функция возврашает 1. Т.е. ищет не в HISTORY??? Где ошибка?
ЗЫ, может есть более грамотный вариант?
Мне нужно проверить, был ли на текущем (дневном) баре закрыт ордер.
Но где-то ошибка...
Пока ордеров нет даже открытых функция фозвращает 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
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;
Asta la vista
Mike
Mike