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

 
KimIV:

Зато даёт возможность остановить советник отжатием кнопки "Советники" на панели инструментов.

Ну впринципе как вариант пойдет думаю, спасибо. не так много там параметром чтоб покидать советник, не сложно будет

 

Пример использования функции ClosePosBySizeProfitInCurrency()

Специально для демонстрации работы функции ClosePosBySizeProfitInCurrency() я написал советник
e-CloseByProfitPosInCurrency, который закрывает только те позиции, у которых профит в валюте депозита превысил некоторое заданное значение. Советник можно устанавливать как только на какой-то один график, так и на несколько. Уточнить перечень закрываемых позиций можно с помощью внешних параметров советника:

  • symbol="0" - Торговый инструмент. Допустимы следующие значения: "0" - любой торговый инструмент, "" - только текущий инструмент и любое значение из рыночного обзора (EURUSD, GBPUSD и т.п.).
  • Operation=-1 - Торговая операция. Допустимые значения: -1 - любая торговая операция, 0 - OP_BUY, 1 - OP_SELL.
  • Profit=50 - Профит в валюте депозита.
  • MagicNumber=0 - Идентификатор позиции.
 

Добрый день всем.

Не найдется ли у вас, Игорь, функции, которая аналогичным ClosePosBySizeProfitInCurrency() образом заКрывает убыточные позиции, по достижении заданного убытка. (Или, возможно, обьединенной, где можно задать закрытие по профиту и по убытку.)

Как я понял, можно просто задать в параметрах pr для OrderProfit() - со знаком минус и мы получим искомое.

А вот в пунктах (а не в валюте депозита) возможно задать порог ? Если - да, то как ? (тейкпрофит и стоплосс не предлагать)

 
rid писал (а):
Не найдется ли у вас, Игорь, функции, которая аналогичным ClosePosBySizeProfitInCurrency() образом заКрывает убыточные позиции, по достижении заданного убытка. (Или, возможно, обьединенной, где можно задать закрытие по профиту и по убытку.)

Нет, такой функции у меня пока нет. Впрочем, можно переделать ClosePosBySizeProfitInCurrency():


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

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}

Я сделал так, чтобы убыток можно было передавать положительным (убыток) и отрицательным (прибыль со знаком минус) числом.

rid писал (а):
Как я понял, можно просто задать в параметрах pr для OrderProfit() - со знаком минус и мы получим искомое.

А вот в пунктах (а не в валюте депозита) возможно задать порог ? Если - да, то как ? (тейкпрофит и стоплосс не предлагать)

Посмотрите код советника e-CloseByProfit.

 
Благодарю.
 

Функция ClosePositions().

Эта функция выполняет закрытие позиций, параметры которых удовлетворяют заданным значениям:

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

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
Прошу помощи!!! уже 4 дня ломаю голову над простой задачей, на первый взгляд. Нужно прописать, если значение CCI стало больше 100 то открывать позицию на покупку до того момента пока значение не станет меньше -100, а когда станет меньше -100 открывать продажи до момента пока не станет больше 100.
 

Функция ClosePosFirstProfit().

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

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

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 

Функция ClosePosWithMaxProfitInCurrency().

Эта функция выполняет закрытие одной позиции с максимальным положительным профитом в валюте депозита. То есть из пяти позиций, профит каждой из которых в данный момент составляет -34, 15, 73, -90, 41, будет закрыта позиция с профитом 73 единицы в валюте депозита. Более точный отбор закрываемых позиций задаётся внешними параметрами:

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

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  }
}
 
B_Dima:
если значение CCI стало больше 100 то открывать позицию на покупку до того момента пока значение не станет меньше -100, а когда станет меньше -100 открывать продажи до момента пока не станет больше 100.

Вам, Дима, я могу предложить такую вот функцию:

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Эта функция возвращает 1, когда нужно покупать и -1, когда нужно продавать. Условия покупки/продажи соответствуют Вашим пожеланиям. Вам теперь нужно всего лишь на каждом тике выполнять следующее:

1. Получать значение функции GetTradeSignal().

2. Если полученное значение ==0, то ничего не делать.

3. Если полученное значение >0, то закрывать все продажи и покупать.

4. Если полученное значение <0, то закрывать все покупки и продавать.

Причина обращения: