Оптимальный алгоритм

 
Добрый день!
Предлагаю отвлечься от mql5. 
Допустим, у нас нет клиента и пишем интерфейс с нуля.

На сервере мы подписаны на следующие события: 
тики, 
статус ордеров, 
Тип счета - Net.

Задача: как можно более компактно и надежно производить учет открытых ордеров.

Допустим, я использую переменную. Ее значение соответствует определенному состоянию ордера (new, calculated, trade etc). Однако, при внесении изменений в архитектуру алгоритма нужно быть предельно внимательным, т.к. Один пробел в цепочке состояний может быть фатальным для правильной работы.

Прошу высказаться как делали (сделали бы) вы или привести ссылки на материал, где можно ознакомиться с подходами к архитектуре учета.

 
papaklass:

Не понятно, что Вам нужно. Для учета открытых ордеров есть функция OrdersTotal().

Что за тип счета - Net?

PS: Наиболее надежный метод учета ордеров (их параметров) - это полный перебор ордеров. Вопрос в том, как часто Вам это требуется? Если на каждом тике и количество ордеров будет большим, то это будет накладно для всего алгоритма. Нужно более четкая постановка задачи.

Функции OrdersTotal, в данном вопросе, к сожалению, не подразумевается. Ее банально нет. Есть сервер и приходящие события от него.

Net = неттинговый, а-ля МТ5.

Полный преребор, думаю, не подойдет по причине того, что хранить в переменной все-же быстрее. Т.к. при наступлении события в "статусе ордеров" можно моментально изменить ее значение и моментально выполнить следующее действие.
Подразумевается высокочастотный алгоритм.

Еще один нюанс - времнной лаг. Т.е. наступает событие отправки ордера. Ордер отправлен - это нужно где-то фиксировать (опять же, на помощь приходит все та-же переменная). Иначе, т.к. до прихода события в "статусе ордеров - new" от сервера проходит достаточное время (несколько мс (иногда, десятков)), что-бы алгоритм отправил зацикленное кол-во ордеров.

 
papaklass:

... Вопрос в том, как часто Вам это требуется? ....

Heroix:
...
Задача: как можно более компактно и надежно производить учет открытых ордеров.
...
 
Heroix:

Полный преребор, думаю, не подойдет по причине того, что хранить в переменной все-же быстрее. Т.к. при наступлении события в "статусе ордеров" можно моментально изменить ее значение и моментально выполнить следующее действие.
Подразумевается высокочастотный алгоритм.

Пока нет статистики работы с контейнером говорить не о чем.

Надо процентное соотношение операций -- вставка\удаление, поиск.

 
TheXpert:

Пока нет статистики работы с контейнером говорить не о чем.

Надо процентное соотношение операций -- вставка\удаление, поиск.

Объясни на более доступном языке. Мне не очень понятен смысл.

Алгритм простой в плане ММ. Работа ведется с одним ордером, т.е. по инструменту может быть только один ордер (позиция). 
Поэтому, требуется работа только с крайним ордером в инструменте. 
 
Heroix:
...
Допустим, я использую переменную. Ее значение соответствует определенному состоянию ордера (new, calculated, trade etc). Однако, при внесении изменений в архитектуру алгоритма нужно быть предельно внимательным, т.к. Один пробел в цепочке состояний может быть фатальным для правильной работы.
...

Что значит "состояние" ордера? Что значит "calculated"?

Heroix:
...
Задача: как можно более компактно и надежно производить учет открытых ордеров.
...

И далее:

Heroix:
...
Алгритм простой в плане ММ. Работа ведется с одним ордером, т.е. по инструменту может быть только один ордер (позиция). 
...

Учет чего? Списка ордеров? Но ордер в вашей системе только один: это некий ордер-позиция. Может быть учет состояния ордера? Но это другая задача.

Извините, но формулировки очень сырые и плохо проработаны. Попробуйте сформулировать более конкретно и доступно. 

 

Спасибо за уточняющие вопросы. Действительно, несколько размыто изложил.

C-4:

Что значит "состояние" ордера? Что значит "calculated"? 

Ни для кого не секрет, что отправленный ордер не обязательно будет исполнен. У него есть свой путь жизни, который выражается в состояниях. Допустим new-->calculated-->filled
Достаточно подробно изложено на этой схеме:

 

C-4:

И далее:

Учет чего? Списка ордеров? Но ордер в вашей системе только один: это некий ордер-позиция. Может быть учет состояния ордера? Но это другая задача.

Извините, но формулировки очень сырые и плохо проработаны. Попробуйте сформулировать более конкретно и доступно. 

Да, ордер при filled превращается (либо добавляется) в позицию. 
Вначале я писал "учет открытых ордеров" - это несколько размыто. Задача, в конечном приближении,  состоит в том, что-бы отследить весь путь жизни ордера по, допустим, одной паре до состояния filled включительно.
Понятнее ли так?

 
Heroix:

Вначале я писал "учет открытых ордеров" - это несколько размыто. Задача, в конечном приближении,  состоит в том, что-бы отследить весь путь жизни ордера по, допустим, одной паре до состояния filled включительно.

Понятнее ли так?

Да, так понятнее. Но специфика от конкретной площадки зависит ну и конечно от конкретного терминала/библиотеки. Рассуждать об абстрактном интерфейсе взаимодействия с абстрактной торговой площадкой непродуктивно.
 
C-4:
Да, так понятнее. Но специфика от конкретной площадки зависит ну и конечно от конкретного терминала/библиотеки. Рассуждать об абстрактном интерфейсе взаимодействия с абстрактной торговой площадкой непродуктивно.

У меня сделан класс по учету ордеров, делал, в первую очередь, для разработки стратегий на матлабе. Написан на C#, для хранения ордеров использую класс, приведенный ниже. Экземпляры класса управляются другим классом, который хранит эти экземпляры (по сути ордера) в Hashtable, ключ таблицы - номер ордер. Можно вообще было обойтись структурой, это я с запасом на будущее сделал. Сделано по простому, для себя.

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

namespace MatlabLibrary
{
    public class AvMatlabOrder
    {
        public int Ticket;
        public string OrdSymbol;
        public int Magic;
        public int Cmd;
        public double OpenTime;
        public double OpenPrice;
        public double Lot;
        public double Stoploss;
        public double TakeProfit;
        public double CloseTime;
        public double ClosePrice;
        public double ProfitPoint;  // в пунктах
        public double Profit;       // в валюте депо
        public double ProfitFinal;  // Profit - Swap - Comission
        public double Swap;
        public double Comission;
        public double Expiration;
        public string Comment;
        public uint Color;

        public AvMatlabOrder() { }
        public AvMatlabOrder(int ticket, string symbol, int cmd, double volume, double price, double openTime, int magic, double stoploss,
            double takeprofit, double expiration, string comment)
        {
            SetParameters(ticket, symbol, cmd, volume, price, openTime, magic, stoploss, takeprofit, expiration, comment);
        }
        void SetParameters(int ticket, string symbol, int cmd, double volume, double price, double openTime, int magic, double stoploss,
            double takeprofit, double expiration, string comment)
        {
            Ticket = ticket;
            OrdSymbol = symbol;
            Cmd = cmd;
            Lot = volume;
            OpenPrice = price;
            OpenTime = openTime;
            Magic = magic;
            Stoploss = stoploss;
            TakeProfit = takeprofit;
            Comment = comment;
            Expiration = expiration;
            //Color = arrow_uint;
        }
    }
}
 
C-4:
Да, так понятнее. Но специфика от конкретной площадки зависит ну и конечно от конкретного терминала/библиотеки. Рассуждать об абстрактном интерфейсе взаимодействия с абстрактной торговой площадкой непродуктивно.

Отчего же? Имея свой интерфейс зачастую проще построить мост к открытому (допустим, FIX) серверу, чем писать заново.


VDev:

У меня сделан класс по учету ордеров, делал, в первую очередь, для разработки стратегий на матлабе. Написан на C#, для хранения ордеров использую класс, приведенный ниже. Экземпляры класса управляются другим классом, который хранит эти экземпляры (по сути ордера) в Hashtable, ключ таблицы - номер ордер. Можно вообще было обойтись структурой, это я с запасом на будущее сделал. Сделано по простому, для себя.

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

Для ваших целей годно. В скорости и сложности реализации это не будет близко к идеалу для более простых задач.

Пока остаюсь при своем - записываю "на лету" в переменную.

 

Я думал надо много ордеров хранить.

Короче. Думаю без кода и конкретного описания никто кроме тебя здесь ничего путного не родит