OrderCloseBy() - закрытие одной позиции другой (продолжение)
В прошлом выпуске я рассмотрел пример использования функции OrderCloseBy(). Вначале я расскажу о самой функции, а потом разберу каждую новую строчку нашего эксперта.
bool OrderCloseBy(int ticket, int opposite, color сolor=CLR_NONE)
Функция OrderCloseBy() закрывает одну позицию другой позицией по тому же самому инструменту. В случае успеха она возвращает true, а в случае ошибки - false. Код ошибки можно в дальнейшем узнать с помощью функции GetLastError().
Параметры функции OrderCloseBy():
- ticket - тикер первой позиции;
- opposite - тикер второй позиции;
- сolor - цвет закрывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то закрывающая стрелка не отображается на графике.
Разберем каждую новую строчку нашего эксперта:
// попробуем найти локированную позицию по этому же инструменту int ticket0; ticket0 = OrderTicket();
string symbol0; symbol0 = OrderSymbol();
int ordertype0; ordertype0 = OrderType();
int i; for (i = 1; i<OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) // в случае неудачи выйти из цикла break; if ((symbol0==OrderSymbol()) && (OrderType()==((ordertype0+1)%2)) ) { if (!OrderCloseBy(OrderTicket(), ticket0)) { Print("Ошибка ", GetLastError()," при закрытии позиции ", OrderTicket(), " позицией ", ticket0); break; } else { i = -2; break; } } } // если CloseBy успешна, то пауза и завершить итерацию цикла if (i==-2) { Sleep(10000); continue; }
// заново выделим нулевую позицию if (!OrderSelect(ticket0, SELECT_BY_TICKET)) // в случае неудачи выйти из цикла break;
Вначале запомним номер тикера, инструмент и тип операции выделенной позиции (первой в списке открытых позиций и отложенных ордеров) в переменных ticket0, symbol0 и ordertype0 соответственно:
int ticket0; ticket0 = OrderTicket();
string symbol0; symbol0 = OrderSymbol();
int ordertype0; ordertype0 = OrderType();
После этого в цикле переберем все оставшиеся позиции в поиске позиции, чтобы найти позицию по тому же инструменту, но открытую в другом направлении (OrderType()==((ordertype0+1)%2)):
int i; for (i = 1; i<OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) // в случае неудачи выйти из цикла break; if ((symbol0==OrderSymbol()) && (OrderType()==((ordertype0+1)%2)) ) { ... } }
Если такую позицию мы нашли, то закроем ее и нашу первоначально выделенную позицию с помощью функции OrderCloseBy() и в случае успеха присвоим переменной i значение -2.
Далее мы проверяем были ли закрыты локированные позиции. Если "да", то делаем паузу и переходим к следующей итерации цикла while, т.е. смотрим следующую позицию/ордер - кандидатов на закрытие/удаление:
if (i==-2) { Sleep(10000); continue; }
Если же локированные позиции были не найдены, то вновь выделяем первую позицию в списке открытых позиций и отложенных ордеров:
if (!OrderSelect(ticket0, SELECT_BY_TICKET)) // в случае неудачи выйти из цикла break;
Далее пытаемся закрыть эту позицию с помощью функции OrderClose().
В следующем выпуске я расскажу о кодах ошибок, которые могут вызывать торговые операции.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: