Мы как раз примерно такую идею собираемся реализовать для окна работы с ордерами: автоматически писать в определенный файл (HTML формат) все торговые транзакции, произведенные с терминала.
Не уверен, что хорошо будет вести автоматический лог всех изменений ордеров - придется городить целую базу по сохранению состояния всех когда-либо обслуживаемых ордеров для отслеживания состояний.
Не уверен, что хорошо будет вести автоматический лог всех изменений ордеров - придется городить целую базу по сохранению состояния всех когда-либо обслуживаемых ордеров для отслеживания состояний.
Мы как раз примерно такую идею собираемся реализовать для окна работы с ордерами: автоматически писать в определенный файл (HTML формат) все торговые транзакции, произведенные с терминала.
Не уверен, что хорошо будет вести автоматический лог всех изменений ордеров - придется городить целую базу по сохранению состояния всех когда-либо обслуживаемых ордеров для отслеживания состояний.
Не уверен, что хорошо будет вести автоматический лог всех изменений ордеров - придется городить целую базу по сохранению состояния всех когда-либо обслуживаемых ордеров для отслеживания состояний.
А зачем база, если по каждому работающему ордеру отслеживать наличие файла, а по истории уже не надо (один раз сохранили). Все дело в том, на мой взгляд, что насколько долго хранить информацию о конкретном ордере, дело каждого пользователя. Если он снес файл (ручками) с историей еще живого ордера, то, предпологается, что история ордера до этого момента ему уже не нужна, а процедура создает новый файл и пищет изменения с текущего момента. То есть задача в чем, не перегружать сервер хранимой информацией, пусть все пишется на локальный компьютер. Лишь бы для каждого ордера отдельный файл (HTML-это тоже не плохо, главное, чтобы в виде таблицы, и легко можно было перетащить в эксел или еще куда) который можно посмотреть по правой мышке.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Исхожу из того, что MT4 написан на ООП.
Второе предположение по поступлению информации в терминал (я пишу то, как сделал бы я, если ошибся - поправте, подумаю над другим алгоритмом)
Итак, информация в терминал о состоянии ордеров поступет в одном из двух случев:
1) При конекте - поступает вся информация о состоянии счета, втч состоянии ордеров, вероятно запрашивает сам терминал.
2) При изменении данных по ордеру S/L, T/P, Close - сервер посылает соответствующее сообщение на терминал.
Основная мысль такова. Все изменения хронятся в файле с именем, совпадающем с тикетом ордера, если ордер уже история, то в имени файла после (или до) тикета дописывается символ "h". Информация в файле:
TimeModifi, OpenTime, Type ,OpenPrice, Lots, SL, TP, CloseTime ,ClosePrice.
АЛГОРИТМ №1
После обновления терминала смотрим есть ли открытые позиции, если да то:
вызывается процедура сверки состояния ордеров с их историей:
Создаем MemoryTable с колонками: Tiket, Type ,SL,TP
Записываем туда соответствующие данные из файлов (последняя строка) без символа "h".
Запускаем цикл от 1 до TotalTrades
Берем позицию N, ищем ее в MemoryTable, если не находим, то создаем новый файл (при этом TimeModifi := OpenTime), если находим, то
Если Type , SL,TP совпадают, то удоляем соответствующую строку из MemoryTable, если не совпадают, то пишем в конеце файла новою строку с данными, при этом если изминился Type, то TimeModifi := OpenTime, иначе TimeModifi := CurTime, а затем удоляем соответствующую строку из MemoryTable
После окончания цикла проверяем, пуста ли MemoryTable, если пуста, то Return, иначе (вероятно эти позиции стали историей) запускаем цикл от 1 до TotalTableColumn
Берем позицию N ищем соответствующий Тикет в истории ордеров, если находим, то пишем в конеце файла новою строку с данными TimeModifi:=CloseTime, добавляем в имя файла симол "h", если не находим, то игнорируем (вообще-то это исключительная ситуация и я мало представляю как такое может случиться, если ордер был, а теперь его нет ни где, только одно, кто-то ручками постарался)
После оконяания цикла Return.
Если нет открытых позиций, проверяем есть ли файлы без символа "h", если есть то Создаем MemoryTable с колонками: Tiket, Type ,SL,TP
Записываем туда соответствующие данные из файлов (последняя строка) без символа "h".
запускаем цикл от 1 до TotalTableColumn
Берем позицию N ищем соответствующий Тикет в истории ордеров, если находим, то пишем в конеце файла новою строку с данными TimeModifi:=CloseTime, добавляем в имя файла симол "h", если не находим, то игнорируем (вообще-то это исключительная ситуация и я мало представляю как такое может случиться, если ордер был, а теперь его нет ни где, только одно, кто-то ручками постарался)
После оконяания цикла Return.
Если ли файлы без символа "h" нет, то Return.
АЛГОРИТМ №2
При поступлении с сервера новых данных о состоянии ордера.
Проверяем есть ли файл с именем тика, если нет, то создаем
Пишем в конец файла информацию о новом состоянии ордера.
если ордер созался или изминился тип ордера, то TimeModifi:= OpenTime
если ордер закрылся, то TimeModifi:=CloseTime, дописываем в имя фала символ "h".
иначе TimeModifi := CurTime
Ну вот, где-то так. Возможно что-то упустил, поправте.
И еще. Открытие файла с историей внести в меню правой мыши в терминале