Хранить данные в комментарии можно но лучше воздерживать или дублировать во внешней БД. Для компрессии строк можно применять base64 кодирование.
Если есть подозрения на то что сторонний скрипт или советник может поставить ордер с таким же меджиком или меджиками как у вас то можно делать вычисление контрольной суммы, например на основе CRC32 и вписывать в комментарий, например так, ставим отложку по заранее недостижимой цене, удаляем ордер, запоминаем номер ордера.
Далее, считаем CRC32 для НомерОрдераОтложки и вписываем значение в комментарий. Для компактности можно использовать hex значение.
Есть ли в истории ордера с нашим меджиком? Да, есть, проверяем комментарий. Если в комментарии нет нашего хеша то это не наш ордер. Нужно предусмотреть возможность обойти это правило в случае обнуления части истории счета.
Далее каждый следующий ордер будет получать CRC значение от предыдущего ордера, своего рода блокчейн подпись. Однако такие методики надо проверить на частичном закрытии, когда в ордере есть from #НомерОрдера и закрытии встречным ордером.
Лично я рекомендую не опираться особо на текст в комментариях, а тщательно прописывать логику работы советника, пользоваться csv файлами или внешними БД или еще лучше запросами на свой сервер с php скриптами, если прямые запросы к БД неприемлемы.
Исполнение Buy-Sell ордеров, отложек - тема для программистов📌
От garanyan1985, 24 июля, 2011 в Уголок Программиста
Длина строки комментариев к ордеру 31 или 33 символа (точно не помню, но точно больше 30). На комментарии никогда не опираюсь когда пишу советники. В основном если нужно записывать информацию, то пишу в глобальные переменные (GlobalVariableSet(name,value)). В вашем случае, если нужно советник запускать на другом терминале и при этом чтобы советник смог прочитать состояние советника с другого терминала, то лучше конечно писать информацию в файл. А еще лучше логику советника писать таким образом, чтобы при каждом новом запуске (будь то на этом же терминале или на другом терминале) в блоке инициализации советник читал информацию об открытых/закрытых ордерах, и на основе этой информации определял текущее состояние (номер колена, маджик противоположного ордера и др.).
Полностью согласен с maxstah, требуют особого учёта только данные тиковых индикаторов или данные, которые совы тянут с мухобука и биржи, имхо.
Спасибо за ответы, сделал для себя вывод: что комментарии можно использовать при разработке и тестировании на истории (неплохая скорость получается), а для реальной работы использовать файлы, или некое внешнее хранилище, в ряде случаев глобальные переменные.
В какой нибудь эксперте можно будет реализовать использование обоих методов (комментарии и что нибудь из предложенного) и вести лог- тогда можно будет судить о том, насколько комментарии надежны.
zhab3r поделитесь с форумом результатами. Глубоких исследований комментов никто не делал - Вы будете первым.
Обязательно, только пока не понятно когда будет запущена в работу появится реализация описанного выше.
Спасибо за ответы, сделал для себя вывод: что комментарии можно использовать при разработке и тестировании на истории
А в тестере комменты к файлам точно прописываются?
Как-то я их в стейтменте из тестера искал и вроде не нашел...
А в тестере комменты к файлам точно прописываются?
Как-то я их в стейтменте из тестера искал и вроде не нашел...
Возможно вы имели в виду: "...комменты к ордерам..."
В тестере комментарии к ордерам работают точно так же, как в режиме реального времени, просто комментарии в тестере нигде не посмотришь, но комментарии к ордерам можно например в журнал выводить после открытия ордера при помощи Print(comment)
А в тестере комменты к файлам точно прописываются?
Как-то я их в стейтменте из тестера искал и вроде не нашел...
100%. В моей версии "перевертыша"
Если память мне не изменяет, в старых биолдах можно было в тестере комментарии где то посмотреть, в новой сам не нашел.
Изменено 5 ноября, 2017 пользователем zhab3r
zhab3r просто интересно: зачем менять магики и потом запоминать?
Прочитал пост выше и понял что был не прав. :) Хранить тикеты.
Пример, есть конструкция: рыночный ордер и отложенный, который должен быть удален при срабатывании ТП рыночного ордера. У отложенного ордера в комментарии тикет рыночного "сигнального". Таких конструкций может быть несколько.
Пока запущен советник все прекрасно, в памяти хранятся все необходимые данные анализируем, работаем.
Когда перезапустили советник нужно все взаимосвязи восстановить, читаем из комментария тикет и всстанавливаем взаимосвязь. Как то так...
Увы комментарии похоже ненадежны. Даже в тестере, при частичном закрытии ордера комментарий переписывается. Вот простой код для демонстрации:
int OnInit()
{
int ticket=OrderSend(_Symbol,OP_BUY,0.1,Ask,2,0,0,"First",1234);
OrderClose(ticket,0.03,Bid,2);
for (int i=0; i {
OrderSelect(i,SELECT_BY_POS);
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
for (int i=0; i {
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
Print(OrderTicket(),"-",OrderComment(),"-",OrderMagicNumber());
}
//---
return(INIT_SUCCEEDED);
}
Ваш алгоритм восстановления серий ордеров, конечно, идеален, если-бы не одно НО... Я пошёл другим путём - попроще:
в каждый коммент ордера серии пишется дата начала серии, при перезапуске ищется первый коммент с датой, потом запускается от этой даты до конца, ордера с битым комментом плюсуются к текущей серии . Колени в принципе не считаю - брокер может один ордер на 3 разбить (лично наблюдал), поэтому считаю только лотность и ПЛ. Ограничение только одно - одна разнонаправленная серия на паре в ед. времени.
Еще одну печать узнал- брокер может изменить тикет при заливке отложенного ордера.
Вот это хреновая новость, а откуда узнали?
Вот на такое обсуждение наткнулся
Можно написать функцию выбора ордера по тикету. 1,2,3,4,5,... бай и 1,2,3,4,5,... селл
В уроках есть находящая последний открытый ордер. Мне же нужно например 3 первых ордера на бай или сел.
Сам писал фигня получается не могу с циклами разобраться.
Спасибо !
//+------------------------------------------------------------------+
double FindLastSellPrice()
{
int oldticket=0;
ticket = 0;
double oldopenprice = 0;
for (int cnt = OrdersTotal()-1; cnt>=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
1 час назад, Сахалинец сказал:Сам писал фигня получается не могу с циклами разобраться.
Имхо тут циклы не причём. Вы в каком виде желаете получить информацию о 3 ордерах? только цену открытия и всё?
Приведённый пример ищет самый старший ордер (по времени) среди открытых, Вы пишите о 3 "первых" - откуда считать первые?
Всем привет. Такой случай на реале. В OrderSend указан Slippage = 1. Обычно ордера по рынку открывались с проскальзыванием 0-0,5. Сегодня же ордер открылся с проскальзыванием 130 новых пунктов на спокойном рынке, пара GBPCAD 22:04 MSK, время открытия 172 мс. Так вот вопрос, этот параметр Slippage он должен работать на ECN ? Или он может игнорироваться? Самое интересное, что и цен таких не было, по которым ордер открылся. Котировки пишутся у меня.
Изменено 31 июля, 2019 пользователем atnet
20 минут назад, atnet сказал:должен работать на ECN ?
Нет.
Работает только на счетах Instant-исполнения.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем