Форум » Консультации по программированию » Я в шоке! Подскажите. » Ответить

Я в шоке! Подскажите.

Sergey: Всем привет! Я в шоке! Выпал из рынка на 3,5 месяца, а тут такие перемены. Игорь подскажи, где можно ознакомиться с изменениями в MQL4? Хотел перенести все данные на новый комп, но некоторые индикаторы после компиляции перестают работать. Вот один из них. http://gfile.ru/a8cCP Хотя не перекомпилированные файлы работают. Компиляция ошибок в коде не выявляет. Но при отладке выдается ошибка формирования массива стр.67. Но в чем ошибка не пойму. Буду благодарен, если найдешь время исправить.

Ответов - 204, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All

Scriptong: Sergey пишет: ордер не успевал обрабатываться сервером до следующего тика Если так, то советник никогда не узнает о приходе этого пропущенного тика. Пропущенные тики для советников теряются безвозвратно. Обработка тика советником происходит только в том случае, если советник закончил обработку предыдущего тика.

Sergey: Scriptong пишет: Если так, то советник никогда не узнает о приходе этого пропущенного тика. Пропущенные тики для советников теряются безвозвратно. Обработка тика советником происходит только в том случае, если советник закончил обработку предыдущего тика. Здесь имелось ввиду, что по приходу следующего тика информация об ордере не поменялась. В результате идет повторная команда на модификацию ордера. И выдается ошибка 139 или 0.

Scriptong: Sergey пишет: Здесь имелось ввиду, что по приходу следующего тика информация об ордере не поменялась. Это более, чем странно. Никогда такого в МТ4 не замечал, т. к. в нем все команды синхронные. Такое может быть только в МТ5, но там для контроля есть соответствующие события. В МТ4, если советник отправляет торговый приказ, то эксперт будет бездействовать до момента получения ответа от сервера. За это время советником не будут восприниматься какие-либо тики, т. к. советник "висит". Если же ответ получен, то вместе с этим будет получено новое состояние ордеров, если они изменились. Ошибка 139 может быть получена, если отправляется приказ на модификацию/удаление/закрытие ордера, который в данный момент обрабатывается сервером в результате достижения ценой уровня его открытия (если отложенный ордер) или уровня Stop Loss/Take Profit. Еще такое может быть, если брокер использует уровень заморозки. Но тогда это брокер-динозавр, т. к. я уже давно не встречал, чтобы Freeze Level отличался от нуля.


Sergey: Scriptong пишет: В МТ4, если советник отправляет торговый приказ, то эксперт будет бездействовать до момента получения ответа от сервера. За это время советником не будут восприниматься какие-либо тики, т. к. советник "висит". Если же ответ получен, то вместе с этим будет получено новое состояние ордеров, если они изменились. Вот и я так думал. И нормального объяснения этому у меня пока нет. Времени прошло много, всего точно не упомнишь. Знаю, что когда исключил ошибку 139, стала появляться ошибка 0 (модификация по тем же параметрам SL и TP). Причем, если исключить Alert, в журнале ошибка не проходит. Думаю, в свете тех рекомендаций, которые ты дал выше, причина может скрываться в сортировке ордеров. Модификация сделана в цикле перебора всех ордеров. А советник допускает наличие нескольких ордеров одновременно. Придется заменить простой перебор функцией слежения за ордерами.

Scriptong: Sergey пишет: стала появляться ошибка 0 Так ведь ошибка 0 - это отсутствие ошибки. Значит, все нормально .

Sergey: Scriptong пишет: Так ведь ошибка 0 - это отсутствие ошибки. Значит, все нормально Не совсем. При модификации 0 означает и модификацию ордера по тем же параметрам. Ошибки с точки зрения торговли нет, а в алгоритме, скорее всего да.

Scriptong: Sergey пишет: При модификации 0 означает и модификацию ордера по тем же параметрам. Ошибки с точки зрения торговли нет, а в алгоритме, скорее всего да. В таком случае получите ошибку 1.

Sergey: Scriptong пишет: В таком случае получите ошибку 1. Учту.

Sergey: Столкнулся с непонятной ситуацией. Вот Журнал модификации ордера... .. из которого следует, что отправлено две заявки на модификацию ордера. Причем конечные значения модификации по ТР на 40 тиков отличаются от расчетных. Ошибок не выдается. Я поставил метки на количество расчетов ТР и модификаций, которые показали, что расчет и заявка на модификацию выполняются, как положено,один раз. У кого нибудь есть разумные объяснения?

Scriptong: Sergey пишет: Столкнулся с непонятной ситуацией. Немного подробнее про ситуацию. Речь идет об общем журнале или о журнале экспертов? Также желательно видеть всю строку сообщения (можно обрезать название эксперта, если речь об автоторговле).

Sergey: Спасибо всем .... разобрался. Оказалось все просто.....Одновременно работали 2 робота на одной паре и с одинаковыми идентификаторами.

Sergey: Нудно посчитать Profit при закрытии нескольких Sell ордеров. На сколько корректен такой алгоритм. for (int i = SellCount-1; i >= 0; i--) if (OrderSelect(SellTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0) if (OrderClose(OrderTicket(), OrderLots(), NT(Ask), 3)) Profit +=OrderProfit(); Или после закрытия нужно заново вытаскивать ордер уже из истории и лишь затем подсчитывать профит.

Scriptong: Sergey пишет: Нудно посчитать Profit при закрытии нескольких Sell ордеров. На сколько корректен такой алгоритм. for (int i = SellCount-1; i >= 0; i--) if (OrderSelect(SellTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0) if (OrderClose(OrderTicket(), OrderLots(), NT(Ask), 3)) Profit +=OrderProfit(); Или после закрытия нужно заново вытаскивать ордер уже из истории и лишь затем подсчитывать профит. Нет, неправильно. Ведь SellCount уже было откуда-то взято. Значит, был цикл, который посчитал количество закрытых ордеров. Зачем тогда второй цикл, если все это можно было посчитать в одном цикле? Также непонятно, для чего представленный цикл нужен, если постоянно идет обращение к одному и тому же ордеру с тикетом SellTicket? Подсчет прибыли/убытка некоторых закрытых ордеров осуществляется следующим образом: double profit = 0.0; for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; if (OrderType() != OP_SELL) continue; profit += OrderProfit() + OrderSwap() + OrderComission(); }

Sergey: Scriptong пишет: Также непонятно, для чего представленный цикл нужен, если постоянно идет обращение к одному и тому же ордеру с тикетом SellTicket? SellTicket|i| это массив тикетов Sell-ордеров отобранных для закрытия, не заметил, что квадратные скобки удалились. Меня интересует корректность такой последовательности if (OrderClose(OrderTicket(), OrderLots(), NT(Ask), 3)) Profit +=OrderProfit() + OrderSwap() + OrderComission(); или все же так if (OrderClose(OrderTicket(), OrderLots(), NT(Ask), 3)) if (OrderSelect(OrderTicket(), SELECT_BY_TICKET,, MODE_HISTORY) Profit +=OrderProfit() + OrderSwap() + OrderComission();

Scriptong: Sergey пишет: или все же так if (OrderClose(OrderTicket(), OrderLots(), NT(Ask), 3)) if (OrderSelect(OrderTicket(), SELECT_BY_TICKET,, MODE_HISTORY) Profit +=OrderProfit() + OrderSwap() + OrderComission(); Конечно же, так. Ведь в первом случае получаем данные непонятно какого ордера, т. к. перед обращением к функциям OrderXXX обязательно требуется выбор ордера при помощи OrderSelect.



полная версия страницы