Ребята помогите подсичтать количесво ордеров!)

 

Доброго времени суток всем.

Необходимо подсчитать какой по счету ордер был открыт в сетке. Причем простой перебор текущих открытых ордеров не подходит. Допустим в сетке допускается открыть не больше 7 ордеров. Т.е. когда все 7 ордеров существуют на графике все замечательно и простой перебор работает безотказно. НО! Допустим что первый открытый ордер был закрыт пользователем вручную. Получается что в сетке в текущий период существуют 6 ордеров. Но мы то знаем что 7 ордер был уже открыт, следовательно открывать следующие сделки нельзя.

Загвоздка заключается в следующем. Как это можно реализовать? А то я себе голову сломала) Причем надо сделать так, чтобы робот сам все пересчитал даже после перезагрузки терминала. Пробовала выносить номер открытого ордера в комментарий. После забирала номер последней сделки функцией StringGetCharacter, но это нормально работает только если максимальное число ордеров однозначное число. Если максимум ордеров в сетке 10 и больше, уже начинаются танцы с бубном. Допусти в сетке 10 ордеров 1,2,3,4,5,6,7,8,9,10. Ордера 1,2,3,4 закрыли руками. Как заставить робота понимать что 10 ордер уже был открыт и существует на графике, не используя глобальные переменные. Прихожу к выводу это только выносить номер в комментарий, а потом его от туда забирать. Но как это сделать корректно??  А то я немного ракуля)))

Заранее благодарна!)

Документация по MQL5: Строковые функции / StringGetCharacter
Документация по MQL5: Строковые функции / StringGetCharacter
  • www.mql5.com
Строковые функции / StringGetCharacter - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Что вам мешает их переберать по времени открытия? В том числе и закрытые ордера в истории.
 
ABGammA:

Доброго времени суток всем.

Необходимо подсчитать какой по счету ордер был открыт в сетке. Причем простой перебор текущих открытых ордеров не подходит. Допустим в сетке допускается открыть не больше 7 ордеров. Т.е. когда все 7 ордеров существуют на графике все замечательно и простой перебор работает безотказно. НО! Допустим что первый открытый ордер был закрыт пользователем вручную. Получается что в сетке в текущий период существуют 6 ордеров. Но мы то знаем что 7 ордер был уже открыт, следовательно открывать следующие сделки нельзя.

Загвоздка заключается в следующем. Как это можно реализовать? А то я себе голову сломала) Причем надо сделать так, чтобы робот сам все пересчитал даже после перезагрузки терминала. Пробовала выносить номер открытого ордера в комментарий. После забирала номер последней сделки функцией StringGetCharacter, но это нормально работает только если максимальное число ордеров однозначное число. Если максимум ордеров в сетке 10 и больше, уже начинаются танцы с бубном. Допусти в сетке 10 ордеров 1,2,3,4,5,6,7,8,9,10. Ордера 1,2,3,4 закрыли руками. Как заставить робота понимать что 10 ордер уже был открыт и существует на графике, не используя глобальные переменные. Прихожу к выводу это только выносить номер в комментарий, а потом его от туда забирать. Но как это сделать корректно??  А то я немного ракуля)))

Заранее благодарна!)

В коммент можно хоть двух хоть трёх-значный номер запихнуть, но коммент ненадёжно, да и удалить руками можно и последний ордер. Делайте через магик 555777, 5557771....555777333 . Дальше понятно? :)

 

задача на сортировку, нужно отсортировать последние 7 ордеров по времени открытия, причем считать нужно и открытые ордера и закрытые (в истории) ордера, это довольно хлопотно

но можно использовать 2 магикномера, один магикномер для первого ордера в серии ордеров, а для последующих второй магик - тогда ищем последний по времени открытия ордер с магиком №1, запоминаем его время открытия, дальше уже проще нужно найти все ордера с магиком №2 с большим или равным временем открытия которое запомнили в предыдущем шаге

 
ABGammA:

Доброго времени суток всем.

Необходимо подсчитать какой по счету ордер был открыт в сетке. Причем простой перебор текущих открытых ордеров не подходит. Допустим в сетке допускается открыть не больше 7 ордеров. Т.е. когда все 7 ордеров существуют на графике все замечательно и простой перебор работает безотказно. НО! Допустим что первый открытый ордер был закрыт пользователем вручную. Получается что в сетке в текущий период существуют 6 ордеров. Но мы то знаем что 7 ордер был уже открыт, следовательно открывать следующие сделки нельзя.

Загвоздка заключается в следующем. Как это можно реализовать? А то я себе голову сломала) Причем надо сделать так, чтобы робот сам все пересчитал даже после перезагрузки терминала. Пробовала выносить номер открытого ордера в комментарий. После забирала номер последней сделки функцией StringGetCharacter, но это нормально работает только если максимальное число ордеров однозначное число. Если максимум ордеров в сетке 10 и больше, уже начинаются танцы с бубном. Допусти в сетке 10 ордеров 1,2,3,4,5,6,7,8,9,10. Ордера 1,2,3,4 закрыли руками. Как заставить робота понимать что 10 ордер уже был открыт и существует на графике, не используя глобальные переменные. Прихожу к выводу это только выносить номер в комментарий, а потом его от туда забирать. Но как это сделать корректно??  А то я немного ракуля)))

Заранее благодарна!)

Подключите немного разума и сделайте, чтобы и с неоднозначным номером работало. 

Например, в конец добавляйте какой-нибудь знак-разделитель, потом находите его позицию и отделяйте соответствующее количество знаков (цифр).

 
ABGammA:

Доброго времени суток всем.

Необходимо подсчитать какой по счету ордер был открыт в сетке. Причем простой перебор текущих открытых ордеров не подходит. Допустим в сетке допускается открыть не больше 7 ордеров. Т.е. когда все 7 ордеров существуют на графике все замечательно и простой перебор работает безотказно. НО! Допустим что первый открытый ордер был закрыт пользователем вручную. Получается что в сетке в текущий период существуют 6 ордеров. Но мы то знаем что 7 ордер был уже открыт, следовательно открывать следующие сделки нельзя.

Загвоздка заключается в следующем. Как это можно реализовать? А то я себе голову сломала) Причем надо сделать так, чтобы робот сам все пересчитал даже после перезагрузки терминала. Пробовала выносить номер открытого ордера в комментарий. После забирала номер последней сделки функцией StringGetCharacter, но это нормально работает только если максимальное число ордеров однозначное число. Если максимум ордеров в сетке 10 и больше, уже начинаются танцы с бубном. Допусти в сетке 10 ордеров 1,2,3,4,5,6,7,8,9,10. Ордера 1,2,3,4 закрыли руками. Как заставить робота понимать что 10 ордер уже был открыт и существует на графике, не используя глобальные переменные. Прихожу к выводу это только выносить номер в комментарий, а потом его от туда забирать. Но как это сделать корректно??  А то я немного ракуля)))

Заранее благодарна!)

в 4-ке: в коммент (или magic) всем ордерам кроме начального пишется тикет самого первого ордера в сетке. Это так делаются не только сетки, но вообще группы. ID группы = тикет первого ордера.

 
Maxim Kuznetsov:

в 4-ке: в коммент (или magic) всем ордерам кроме начального пишется тикет самого первого ордера в сетке. Это так делаются не только сетки, но вообще группы. ID группы = тикет первого ордера.

идея интересная, но не соображу как будете после перезагрузки терминала восстанавливать все это

Все что могу придумать это :  ищем ордер с самым большим временем открытия и с нашим магиком (первый же ордер может и закрыться), потом уже применяем Ваше кодирование информации

так?

 
Igor Makanu:

идея интересная, но не соображу как будете после перезагрузки терминала восстанавливать все это

Все что могу придумать это :  ищем ордер с самым большим временем открытия и с нашим магиком (первый же ордер может и закрыться), потом уже применяем Ваше кодирование информации

так?

перебираем ордера выявляем все группы в рынке, с ними и работаем.

Вот если группа закрыта полностью пока робот был офф-лайн, но с ней всё ещё надо работать, тут конечно гимор

 
Сделайте тру- фалс. Если сетка полностью открыта, тру. И пока она тру, не открывается никакой больше. Ну а фалсе сами потом делайте, когда надо
 
Maxim Kuznetsov:

перебираем ордера выявляем все группы в рынке, с ними и работаем.

Вот если группа закрыта полностью пока робот был офф-лайн, но с ней всё ещё надо работать, тут конечно гимор

Понятно

В принципе из предложенных решений, все свелось к работе с несколькими магик-номерами, какой именно способ реализует ТС не важно



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


ЗЫ: Да и не факт, что ТС не открывает серию ордеров на одном тике, там вообще время открытия может на секунду отличаться или не отличаться, причем порядок обработки такой серии ордеров (на одном тике) на сервере тоже не определен, т.е. не факт что первый отправленный ордер будет иметь наименьший тикет или время

 
Igor Makanu:

Понятно

В принципе из предложенных решений, все свелось к работе с несколькими магик-номерами, какой именно способ реализует ТС не важно



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


ЗЫ: Да и не факт, что ТС не открывает серию ордеров на одном тике, там вообще время открытия может на секунду отличаться или не отличаться, причем порядок обработки такой серии ордеров (на одном тике) на сервере тоже не определен, т.е. не факт что первый отправленный ордер будет иметь наименьший тикет или время

предоставили же отличнейшую штуку - SQLite. Остаётся в советнике создать в памяти и поддерживать в актуальном виде оперативную базу.

SELECT * FROM Orders WHERE groupid=xx ORDER BY openTime

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