Вс. Ноя 24th, 2024

Один ордер на одном баре

Функция один ордер на одном баре

При разработке торговых роботов в 70% случаев нужно, чтобы на одном баре было открыто не больше одного ордера. Самое оптимальное решение этой проблемы, на мой взгляд, дает уважаемый мной программист Kimiv (нажмите на одну из иконок соцсетей и функция станет доступна):
[sociallocker]

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

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}

[/sociallocker]
Для правильной работы функции, нужно вызывать ее так (передаваемые значения по Вашему усмотрению):

if(NumberOfBarOpenLastPos(Symbol(), 0, -1, Magic) != 0)
{
  Здесь требуемые операции типа открытия ордеров или еще что-то;
}

Что значит, «если позиция открыта не на 0 баре», продолжаем работать.

Вот и все. Желаю успехов!

от drivermql

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.