Помогите разобраться с внутренностями "Закрыть перекрытые ордеры"

 

Вопросы подобные были, но или я не внимательный, или всё-таки не было ответа на такой вопрос как у меня.

В первом случае прошу ткнуть меня носом в то место где про это написано :-).

Пусть есть 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, то придётся в цикле закрывать парами противоположные ордера, а это опять три запроса и опять время. Кажется что "Закрыть перекрытые ордеры" делает это быстрее. Или это не так ? Как вообще внутри она работает ?

 

А куда вы торопитесь? Цена то уже от вас никуда не уйдет. Или вам жалко дополнительных милисекунд, потраченных процессором на посылку двух дополнительных запросов?

Подозреваю, что внутри это именно так и работает - в цикле посылается три запроса на закрытие. Просто в журнале отображается одним куском.

 
Scriptong >>:

А куда вы торопитесь? Цена то уже от вас никуда не уйдет. Или вам жалко дополнительных милисекунд, потраченных процессором на посылку двух дополнительных запросов?

Подозреваю, что внутри это именно так и работает - в цикле посылается три запроса на закрытие. Просто в журнале отображается одним куском.

Для моей системы время исполнения сделок является критичным. Например если советник работает на тиковых котировках, при быстром движении цены, да если ещё и закрыть надо 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. Можно еще и пары подбирать с одинаковым лотом, но это уже на любителя ... дерзайте.

 

разделяйте исполнительную и аналитические части.

когда несколько зацикленных скриптов или советников работающих по таймеру получают команды на открытие\закрытие через глобалки от советника, или индикатора в котором реализована стратегия.  

 
FAQ:

разделяйте исполнительную и аналитические части.

когда несколько зацикленных скриптов или советников работающих по таймеру получают команды на открытие\закрытие через глобалки от советника, или индикатора в котором реализована стратегия.  

Модератор

У вас всегда очень ценные советы:) 

 
prorab:

В советнике пишем

 

 Функция отдельно

 

 после отработки останется соответствующий ордер с остатком лота или ничего не останется, если сумма лотов равна нулю.

 PS. Можно еще и пары подбирать с одинаковым лотом, но это уже на любителя ... дерзайте.

Спасибо.

Я имел ввиду внутренюю функцию типа CloseAllBy(string symbol,int magic) 

А кучу кода я сам могу написать. Тем болле что ваш код не решает проблемы. Если есть первый самый большой ордер и его надо закрыть противоположными. А не первый вторым, третий четвёртым.

 

Короче ещё не ввели такую функцию. А жаль. 

Хотя странно. Вручную в терминале можно.

 
eevviill:

Модератор

У вас всегда очень ценные советы:) 

  какие вопросы, такие ответы )))

  а механизм множественного встречного закрытия реализован на серверной стороне, поэтому так быстро. 

 
FAQ:

  какие вопросы, такие ответы )))

  а механизм множественного встречного закрытия реализован на серверной стороне, поэтому так быстро. 

И какой вопрос был?

Есть ли штатная функция закрытия всех перекрытых ордеров?

Вместо нет, куча умных флудильных фраз. 

Причина обращения: