В прошлом выпуске был приведен пример эксперта, с использованием функции OrderCloseBy(). Здесь мы для начала расскажем о самой функции, а потом разберем каждую новую строчку нашего эксперта.
bool OrderCloseBy(int ticket, int opposite, color сolor=CLR_NONE)
Функция OrderCloseBy() закрывает одну позицию другой позицией по тому же самому инструменту. В случае успеха она возвращает true, а в случае ошибки - false. Код ошибки можно в дальнейшем узнать с помощью функции GetLastError().
Параметры функции OrderCloseBy():
Разберем каждую новую строчку нашего эксперта:
// попробуем найти локированную позицию по этому же инструменту 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().
Следующий выпуск будет посвящен кодам ошибок, которые могут вызывать торговые операции.
Есть что сказать? Не стесняйтесь!
Последние статьи:
Видео по теме:
УГОЛОК АДМИНИСТРАТОРА