Система управления ордерами - накидайте печенек ))

 

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

так что ... МОЧИИИ!!!

--------------------

Если в вашей стретегии ордера закрываются по изначально установленным стоп-лоссам и тейк-профитам, вы счастливый человек, не читайте эту статью, она не для вас.
А вот если у вас в работе одновременно до 50 ордеров на разных инструментах и разного объема, которые должны закрываться по определенным сигналам, возможно, мои соображения окажутся полезны.Но для начала я вкратце обрисую проблемы, которые возникают при программировании таких задач на MQL4. Например, у вас 10 валютных пар и нужно отсортировать все ордера по профиту, но только для пар EURUSD и GBRUSD. Ок, считали данные в многомерный массив, профит кладем в нулевое измерение, ведь массивы сортируются только по нему. Отсортировали, потом в цикле выбрали только EURUSD и GBRUSD. Опс, цена пошла вниз, надо трейлинги подтягивать (к примеру). Значит, надо уже сортировку по трейлингам делать, чтобы начать с самого дальнего. Начинается жонглирование с массивами.

Итак, имеем вводную по максимуму: N ордеров на M валютных парах, N<231, M<231. Это я не выкаблучиваюсь с таким огромным количеством, просто лучше заранее не ставить ограничений, тогда часто находятся более оптимальные и гибкие решения. Вдруг завтра мне позвонит Джордж Сорос и закажет систему управления ордерами для всех его счетов? А мы ему скажем, - Жора, так все уже давно готово, завернуть? Помечтал, продолжаю, лотность с шагом 0.01 от 0.01 до 100, на каждый ордер выставляются защитные стопы и тейки на случай пропадания связи. В нормальном режиме ордера закрываются через OrderClose или OrderCloseBy. Требуется разработать простенькую систему управления ордерами, которая, исходя из вышеперечисленных требований, выполняла бы следующие функции (кстати, очень прошу включить вашу фантазию и дополнить функции в комментариях):

Добавление открытого ордера функцией
bool AddOrder(int ticket, string symbol, int oper, double volume, double openPrice, double stopLoss, double takeProfit, string comment, datetime 
openTime,  double commission, int expiration, int magicNumber);Удаление закрытого ордера. Закрытый ордер переносится в базу данных.
bool DeleteOrder(int ticket, int magic, double closePrice, double profit, datetime closeTime); // magic нужен для возможности проверки изменения тикета
Проверка "мертвых душ", в систему передается массив тикетов открытых ордеров и если в системе есть лишние, они удаляются и переносятся в БД закрытых ордеров.
int CheckForPresent(int orders[]);

**** А теперь печеньки, ради которых все и затевалось )) ****

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

int FindMinimumByField(int field, string symbols[], int symbolCount);
/*
field -  поле для поиска, это один из параметров ордера, например цена, профит, время открытия и т.д. Каждое поле имеет свой уникальный
 номер и имя, заданное через дефайн. Например,
#define TICKET  0
#define SYMBOL 1
string symbols[]: массив инструментов, в которых ведется поиск, например string symbols[]={"EURUSD", "USDJPY","GBRUSD"};
int symbolCount: количество инструментов в массиве (чтобы массив все время не ресайзить)
*/

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

int FindMaximumByField(int field, string symbols[], int symbolCount);

Отсортировать ордера по возрастанию по заданному полю для набора инструментов. Для всех операций сортировки и выборки заводится 1...16 (число может задаваться пользователем) внутренних областей для хранения ордеров со всеми параметрами. Исходная область всегда имеет имеет индекс 0 и в ней хранятся ордера в неизменном порядке, как в терминале. В других областях могут храниться различные выборки из ордеров, отсортированные по всем полям. При приходе новых котировок, удалении ордеров, добавлении новых все области автоматически пересчитываются и обновляются. Для повышения быстродействия надо сделать возможность отключения автопересчета и пересчет по требованию.

int SortUpByField(int field, string symbols[], int symbolCount, int numSortArea);
// numSortArea - номер области, куда будут помещены результаты
// возвращается количество ордеров в области

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

int SortDownByField(int field, string symbols[], int symbolCount, int numSortArea);

Сделать выборку по одной области и поместить результаты в другую. Используя команду в виде строки с особым синтаксисом, сделать сложную выборку среди области. Например, выбрать все ордера на BUY с датой открытия не позднее ***, ценой не менее *** и стоплоссом больше *** и меньше ***. Формат команды пока в разработке. Хотелось бы сделать в виде произвольной строки, но возможно, первый вариант для простоты будет выглядеть как-то так:

int SelectOrders(int areaIn, int areaOut, int param0, string condition0, double value0, int param1, string condition1, 
double value1, int param2, string condition2, double value2, int param3, string condition3, double value3);
// пример
int count =  SelectOrders(2, 5, OPERATION, "==", BUY, OPEN_TIME, "<=", D'1212.05.28 12:30:27', STOPLOSS, ">", 1.12345,
 STOPLOSS, "<", 1.13); // хотя в этом варианте отсутствует && в условии для стоплосса, надо продумать..
Узнать количество ордеров в области
int GetOrderCount(int area);

Чтение всех полей ордера из области

bool GetAllFields(int area, int &ticket, string& symbol, int& oper, double& volume, double& openPrice... и далее все 
параметры ордера  )

Выборка одного поля ордера из области

int GetIntField(int area, int ordIndex, int field)
double GetDoubleField(int area, int ordIndex, int field)
string GetStringField(int area, int ordIndex, int field)

Что еще добавить? Делать буду в DLL на LINQ to Object, так что сложность запросов не ограничена, не стесняйтесь ))
 

Вопрос -- а зачем? Вопрос №2 кому нужны эти плюшки?

Наверное хотите повторения судьбы блю дрима ) есть движок с кучей "плюшек", но нафек никому не нужен.

То что вы сами не можете придумать плюшек, лишнее этому подтверждение.

Формат тоже.

Как это вы снизошли до общения с "убогими"?

 
Идея этой темы: mql4- не объектно-ориентированный.

Поэтому когда можно закачать объекты в таблицу
и по таблице делать выборку- это круто и правильно.

Проблема только одна- это тупая инженерная задача
и понятна для тех кто "в теме"- но они сделают сами.
 
jartmailru:
Проблема только одна- это тупая инженерная задача
и понятна для тех кто "в теме"- но они сделают сами.

...но скорее всего - оно им не нужно. :)
 
jartmailru:
Идея этой темы: mql4- не объектно-ориентированный.

Поэтому когда можно закачать объекты в таблицу
и по таблице делать выборку- это круто и правильно.

Проблема только одна- это тупая инженерная задача
и понятна для тех кто "в теме"- но они сделают сами.


Я же четко написал - я делаю длл и отдаю бесплатно в массы. Исходники туда же, не жалко. Просто я переделываю свою систему учета ордеров, хотелось услышать мнения умных и опытных в трейдинге людей. А получил, поначалу, истерики от кликушь. То ли галоперидол у них закончился, то ли ПМС начался ))))

Так, чисто по делу, кто что может добавить к печенькам?

 
Обновлено 17.12.2011 18:05
Автор: Алексей Волчанский
VDev


16.12.2011 20:57

... я довольно активно работаю с MQL4 и это не может не вызывать мое раздражение.
Чтобы компенсировать моральный ущерб от общения с убогими, я решил сделать отдельный пост,
куда буду вываливать все кривости и несуразности, которыми богат этот т.н. "язык программирования".

no comments


 

Да, MQL4 ограниченный язык. Подмножество Си, есть положительные моменты в работе со строками и массивами, но трудно на нем сделать что-то серьезное. Нет смысла заводить войны, я сравниваю с тем, чем активно пользуюсь, это С#, Matlab, С++. Но какое отношение это мое мнение имеет к программистам этого форума? Да у меня люди приходят обучаться, вообще ничего не зная даже о циклах, а потом пишут роботов на MQL4, а через пол-года некоторые уходят выше, на другие языки. То, что люди начинают с MQL4, как с простейшей и доступной платформы - это в плюс. А вот бесконечные глюки - явно в минус.

Теперь по делу. По моим наблюдениям, человек может обучиться c нуля MQL4 примерно за месяц. У меня был рекордсмен - две недели, но это был крайне умный студент на каникулах. А так, месяц-два. И это отличный порог вхождения, в принципе, MQL4 втянул в программирование больше людей, чем все модеры этого сайта ))

Ну а что касается моих фраз - вы не в курсе, что народ надо будить ото сна провакациями? :))))))))))))

 
VDev:

Ну а что касается моих фраз - вы не в курсе, что народ надо будить ото сна провакациями? :))))))))))))

в курсе, но провокаторы заканчивают плохо.
 
VDev: в принципе, MQL4 втянул в программирование больше людей, чем все модеры этого сайта ))

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