А куда вы торопитесь? Цена то уже от вас никуда не уйдет. Или вам жалко дополнительных милисекунд, потраченных процессором на посылку двух дополнительных запросов?
Подозреваю, что внутри это именно так и работает - в цикле посылается три запроса на закрытие. Просто в журнале отображается одним куском.
А куда вы торопитесь? Цена то уже от вас никуда не уйдет. Или вам жалко дополнительных милисекунд, потраченных процессором на посылку двух дополнительных запросов?
Подозреваю, что внутри это именно так и работает - в цикле посылается три запроса на закрытие. Просто в журнале отображается одним куском.
Для моей системы время исполнения сделок является критичным. Например если советник работает на тиковых котировках, при быстром движении цены, да если ещё и закрыть надо 5-10 таких перекрытых ордеров. Если бы сделки исполнялись милисекунды, было бы всё прекрасно, но бывает что закрытие или открытие происходит по 5 секунд. А для 10 ордеров это уже почти минута. Пока цикл шлёт эти 10 запросов на закрытие перекрытых ордеров, новые котировки советник не обрабатывает. А за минуту цена может далеко "уплясать".
Ну это как пример. А вообще появилась идея - написать скрипт закрывающий в цикле, скажем, 100 таких ордеров. Измерить время его работы и измерить время работы аналогичной функции из терминала.
И ещё вопрос: А реквоты во время закрытия перекрытых ордеров могут иметь место ? Так то изменение цены на суперпозицию не влияет...
Тоже очень интересует.
Появилась такая функция?
В советнике пишем
//--- взаимозачет при развороте if (buys > 0 && sells > 0) { closeBy_New(); return; }
Функция отдельно
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void closeBy_New() { int i, last = 0, cnt = OrdersTotal(); int tick1, tick2; datetime tm1=0, tm2=0; while (cnt > 1) { tick1 = tick2 = 0; //--- for (i=0; i<cnt; i++) { if (!OrderSelect (i, SELECT_BY_POS)) continue; if (OrderType() > OP_SELL) continue; if (OrderCloseTime() > 0) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != Magic) continue; //--- if (OrderType() == OP_BUY) { if (tick1 == 0) { tick1 = OrderTicket(); tm1 = OrderOpenTime(); if (tick2 > 0) break; } } else { if (tick2 == 0) { tick2 = OrderTicket(); tm2 = OrderOpenTime(); if (tick1 > 0) break; } } } // end for() //--- if (tick1 >0 && tick2 >0) { if (tm2 < tm1) res = OrderCloseBy(tick2, tick1); else res = OrderCloseBy(tick1, tick2); //--- if (!res) // проверим ошибку printf("closeBy_Lock(ERROR %d), tick1 %d, tick2 %d", GetLastError(), tick1, tick2); } else return; //--- RefreshRates(); cnt = OrdersTotal(); if (cnt == last) return; last = cnt; } // end while() } // end closeBy_New()
после отработки останется соответствующий ордер с остатком лота или ничего не останется, если сумма лотов равна нулю.
PS. Можно еще и пары подбирать с одинаковым лотом, но это уже на любителя ... дерзайте.
разделяйте исполнительную и аналитические части.
когда несколько зацикленных скриптов или советников работающих по таймеру получают команды на открытие\закрытие через глобалки от советника, или индикатора в котором реализована стратегия.
разделяйте исполнительную и аналитические части.
когда несколько зацикленных скриптов или советников работающих по таймеру получают команды на открытие\закрытие через глобалки от советника, или индикатора в котором реализована стратегия.
Модератор
У вас всегда очень ценные советы:)
В советнике пишем
Функция отдельно
после отработки останется соответствующий ордер с остатком лота или ничего не останется, если сумма лотов равна нулю.
PS. Можно еще и пары подбирать с одинаковым лотом, но это уже на любителя ... дерзайте.
Спасибо.
Я имел ввиду внутренюю функцию типа CloseAllBy(string symbol,int magic)
А кучу кода я сам могу написать. Тем болле что ваш код не решает проблемы. Если есть первый самый большой ордер и его надо закрыть противоположными. А не первый вторым, третий четвёртым.
Короче ещё не ввели такую функцию. А жаль.
Хотя странно. Вручную в терминале можно.
Модератор
У вас всегда очень ценные советы:)
какие вопросы, такие ответы )))
а механизм множественного встречного закрытия реализован на серверной стороне, поэтому так быстро.
какие вопросы, такие ответы )))
а механизм множественного встречного закрытия реализован на серверной стороне, поэтому так быстро.
И какой вопрос был?
Есть ли штатная функция закрытия всех перекрытых ордеров?
Вместо нет, куча умных флудильных фраз.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вопросы подобные были, но или я не внимательный, или всё-таки не было ответа на такой вопрос как у меня.
В первом случае прошу ткнуть меня носом в то место где про это написано :-).
Пусть есть buy 0.1 + buy 0.1 + buy 0.1. Необходимо это всё закрыть.
Первый вариант - просто закрыть кадый из них в отдельности. Тут проблем может много возникнуть, если цена быстро меняется. Да и времени на это требуется много.
Второй вариант - открываем sell 0.3 и, если торгуем в ручную, то делаем "Закрыть перекрытые ордеры" и тогда в журнале появляется следующее:
2009.02.06 20:23:06: multiple close by 'EURUSD' ok
2009.02.06 20:23:06: request in process
2009.02.06 20:23:06: request was accepted by server
2009.02.06 20:23:06: multiple close by 'EURUSD'
Довольно быстро, за один запрос.
Вопрос в том, КАК точно такое же повторить из кода советника. Известно что есть OrderCloseBy(...), но она закрывает два встречных ордера, то есть если у нас есть всё те же
buy 0.1 + buy 0.1 + buy 0.1 + sell 0.3, то придётся в цикле закрывать парами противоположные ордера, а это опять три запроса и опять время. Кажется что "Закрыть перекрытые ордеры" делает это быстрее. Или это не так ? Как вообще внутри она работает ?