Отправлено: 14.04.14 09:56. Заголовок: Я в шоке! Подскажите.
Всем привет! Я в шоке! Выпал из рынка на 3,5 месяца, а тут такие перемены. Игорь подскажи, где можно ознакомиться с изменениями в MQL4? Хотел перенести все данные на новый комп, но некоторые индикаторы после компиляции перестают работать. Вот один из них. http://gfile.ru/a8cCP Хотя не перекомпилированные файлы работают. Компиляция ошибок в коде не выявляет. Но при отладке выдается ошибка формирования массива стр.67. Но в чем ошибка не пойму. Буду благодарен, если найдешь время исправить.
ордер не успевал обрабатываться сервером до следующего тика
Если так, то советник никогда не узнает о приходе этого пропущенного тика. Пропущенные тики для советников теряются безвозвратно. Обработка тика советником происходит только в том случае, если советник закончил обработку предыдущего тика.
Если так, то советник никогда не узнает о приходе этого пропущенного тика. Пропущенные тики для советников теряются безвозвратно. Обработка тика советником происходит только в том случае, если советник закончил обработку предыдущего тика.
Здесь имелось ввиду, что по приходу следующего тика информация об ордере не поменялась. В результате идет повторная команда на модификацию ордера. И выдается ошибка 139 или 0.
Здесь имелось ввиду, что по приходу следующего тика информация об ордере не поменялась.
Это более, чем странно. Никогда такого в МТ4 не замечал, т. к. в нем все команды синхронные. Такое может быть только в МТ5, но там для контроля есть соответствующие события. В МТ4, если советник отправляет торговый приказ, то эксперт будет бездействовать до момента получения ответа от сервера. За это время советником не будут восприниматься какие-либо тики, т. к. советник "висит". Если же ответ получен, то вместе с этим будет получено новое состояние ордеров, если они изменились. Ошибка 139 может быть получена, если отправляется приказ на модификацию/удаление/закрытие ордера, который в данный момент обрабатывается сервером в результате достижения ценой уровня его открытия (если отложенный ордер) или уровня Stop Loss/Take Profit. Еще такое может быть, если брокер использует уровень заморозки. Но тогда это брокер-динозавр, т. к. я уже давно не встречал, чтобы Freeze Level отличался от нуля.
Отправлено: 22.04.16 21:00. Заголовок: Scriptong пишет: В ..
Scriptong пишет:
цитата:
В МТ4, если советник отправляет торговый приказ, то эксперт будет бездействовать до момента получения ответа от сервера. За это время советником не будут восприниматься какие-либо тики, т. к. советник "висит". Если же ответ получен, то вместе с этим будет получено новое состояние ордеров, если они изменились.
Вот и я так думал. И нормального объяснения этому у меня пока нет. Времени прошло много, всего точно не упомнишь. Знаю, что когда исключил ошибку 139, стала появляться ошибка 0 (модификация по тем же параметрам SL и TP). Причем, если исключить Alert, в журнале ошибка не проходит. Думаю, в свете тех рекомендаций, которые ты дал выше, причина может скрываться в сортировке ордеров. Модификация сделана в цикле перебора всех ордеров. А советник допускает наличие нескольких ордеров одновременно. Придется заменить простой перебор функцией слежения за ордерами.
Отправлено: 03.05.16 18:09. Заголовок: Столкнулся с непонят..
Столкнулся с непонятной ситуацией. Вот Журнал модификации ордера... .. из которого следует, что отправлено две заявки на модификацию ордера. Причем конечные значения модификации по ТР на 40 тиков отличаются от расчетных. Ошибок не выдается. Я поставил метки на количество расчетов ТР и модификаций, которые показали, что расчет и заявка на модификацию выполняются, как положено,один раз. У кого нибудь есть разумные объяснения?
Немного подробнее про ситуацию. Речь идет об общем журнале или о журнале экспертов? Также желательно видеть всю строку сообщения (можно обрезать название эксперта, если речь об автоторговле).
Нудно посчитать 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(); Или после закрытия нужно заново вытаскивать ордер уже из истории и лишь затем подсчитывать профит.
Нудно посчитать 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(); }
Также непонятно, для чего представленный цикл нужен, если постоянно идет обращение к одному и тому же ордеру с тикетом 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();
Отправлено: 12.05.16 10:42. Заголовок: Sergey пишет: или в..
Sergey пишет:
цитата:
или все же так if (OrderClose(OrderTicket(), OrderLots(), NT(Ask), 3)) if (OrderSelect(OrderTicket(), SELECT_BY_TICKET,, MODE_HISTORY) Profit +=OrderProfit() + OrderSwap() + OrderComission();
Конечно же, так. Ведь в первом случае получаем данные непонятно какого ордера, т. к. перед обращением к функциям OrderXXX обязательно требуется выбор ордера при помощи OrderSelect.
Все даты в формате GMT
2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет