Полезные функции от KimIV - страница 20

 

Функция GetTypeLastClosePos().

Эта функция возвращает тип последней закрытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней закрытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastClosePos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderType();
          }
        }
      }
    }
  }
  return(r);
}
ЗЫ. Во вложении скрипт для тестирования функции GetTypeLastClosePos().
Файлы:
 

Функция GetTypeLastOpenPos().

Эта функция возвращает тип последней открытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastOpenPos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderOpenTime()) {
            t=OrderOpenTime();
            r=OrderType();
          }
        }
      }
    }
  }
  return(r);
}
ЗЫ. Во вложении скрипт для тестирования функции GetTypeLastOpenPos().
Файлы:
 
KimIV:

Функция OpenPosition() для online.

      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      

Что означают коды ошибок 142 и 143.

Спасибо.

 
zennon:

Что означают коды ошибок 142 и 143.

142 - Ордер поставлен в очередь.

143 - Ордер принят дилером к сиполнению.

Подробнее см. здесь

 

В доке совет обрабатывать их как ошибку 128

если возможно, пару слов об этом с Вашей точки зрения или позиции...

 
kombat:

В доке совет обрабатывать их как ошибку 128

если возможно, пару слов об этом с Вашей точки зрения или позиции...

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

 

Сорри... видел конечно...

П р о с т о чуток непонятно в моём понимании.

Sleep(1000*66.666);

кроме этого, и ежу понятно... спим...

А вот если и если дальнейшие, не очень.

т.е. спим, потом если существует позиция, если играем марш.

-

Ладно, если вопрос ламерский, то ещё раз простите, и можно без ответа.

 
kombat писал (а):
Ладно, если вопрос ламерский, то ещё раз простите, и можно без ответа.

не-е... давайте разберёмся... разборки углубляют понимание... Просто я не понимаю, что Вам непонятно. Сформулируйте вопрос попроще и в общепринятых терминах. Вас интервал спячки смущает? Почему именно 66 секунд?

 
KimIV:
Почему именно 66 секунд?

Нет, не это! с этим то и нет вопросов... абсолютно!

А вот дальнейшее логико-последовательное действо в этом фрагменте не очень.

Допустим получили код ошибки, спим, потом ифим на наличие болучаем булт, играет вальс Шпоена если включена эта функция...

-

(блин, пропадают хвосты сообщений, приходится повторяться :(((

-

Гораздо больше интересуют вопросы как продолжить начатое!

т.е. дальнейшие торговые телодвижения: либо функция будет долбить

пока не откроет, либо передаст управление другой...

В первом случае непонятно как "зациклить", вызывать "саму себя" или как?

 

хм... Я всё-равно ничё не понял. Буду стрелять наугад. Всё нижесказанное будет относиться к ошибкам 128, 142 и 143.

Если никак не обработать ошибку 128, то появляется риск получить две одинаковые открытые позиции вместо одной. За два года торговли на двух реальных счетах у меня такой случай был всего один раз. Дублирование позиции происходит потому, что торговый сервер по каким-то причинам вернул терминалу сообщение об истечении срока ожидания исполнения сделки. Терминалу не было отказано в обслуживании. И сделка может быть ещё исполнена. Просто её исполнение задержалось на "непозволительно" длительное время. Если после такого сообщения отправить ещё один запрос на исполнение, то могут исполниться оба запроса: тот, который задержался и новый. Чтобы избежать такой ситуации нужно, по рекомендации разработчиков, сделать паузу не менее одной минуты и проверить, а не исполнился ли запрос, по поводу которого торговый сервер присылал сообщение, что мол исполнение задерживается. Если ДА, то цель достигнута - позиция открыта, если НЕТ, то можно повторить торговый запрос. Вот такую логику обработки ошибок 128, 142 и 143 реализует мой код.