Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Запустили испанскую и португальскую версии сайта. Оцени сам!
Andres
48
Andres 2009.02.06 20:00 

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

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

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

Ihor Herasko
8635
Ihor Herasko 2009.02.06 22:24  

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

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

Andres
48
Andres 2009.02.06 23:48  
Scriptong >>:

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

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

Для моей системы время исполнения сделок является критичным. Например если советник работает на тиковых котировках, при быстром движении цены, да если ещё и закрыть надо 5-10 таких перекрытых ордеров. Если бы сделки исполнялись милисекунды, было бы всё прекрасно, но бывает что закрытие или открытие происходит по 5 секунд. А для 10 ордеров это уже почти минута. Пока цикл шлёт эти 10 запросов на закрытие перекрытых ордеров, новые котировки советник не обрабатывает. А за минуту цена может далеко "уплясать".

Ну это как пример. А вообще появилась идея - написать скрипт закрывающий в цикле, скажем, 100 таких ордеров. Измерить время его работы и измерить время работы аналогичной функции из терминала.

И ещё вопрос: А реквоты во время закрытия перекрытых ордеров могут иметь место ? Так то изменение цены на суперпозицию не влияет...

Vasyl Nosal
18339
Vasyl Nosal 2015.09.19 09:36  

Тоже очень интересует.

Появилась такая функция? 

Viktor
228
Viktor 2015.09.19 10:13  

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

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

Рустам
3597
Рустам 2015.09.19 11:29  

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

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

Vasyl Nosal
18339
Vasyl Nosal 2015.09.19 13:50  
FAQ:

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

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

Модератор

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

Vasyl Nosal
18339
Vasyl Nosal 2015.09.19 13:52  
prorab:

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

 

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

 

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

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

Спасибо.

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

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

Vasyl Nosal
18339
Vasyl Nosal 2015.09.19 13:56  

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

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

Рустам
3597
Рустам 2015.09.19 16:07  
eevviill:

Модератор

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

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

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

Vasyl Nosal
18339
Vasyl Nosal 2015.09.20 07:06  
FAQ:

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

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

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

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

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

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий