« Предыдущий пост | На главную страницу | Следующий пост »

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".

« Предыдущий пост | На главную страницу | Следующий пост »

Подписаться на мою рассылку



Размещение статьи "OrderCloseBy() - закрытие одной позиции другой (продолжение)" на Вашем сайте

Размещение статьи "OrderCloseBy() - закрытие одной позиции другой (продолжение)" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "OrderCloseBy() - закрытие одной позиции другой (продолжение)" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 5.04