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

 
rid писал (а):
МА. Пост. буду держать ровно сутки - потом удалю!

Не нужно удалять! Пусть остаётся...

 

Игорь, прежде всего спасибо вам за ваши функции и за данную ветку, они многим непрофессиональным программистам помогают. Но я бы хотел задать вам вопрос по поводу функции NumberOfOrders(). Никак не могу заставить её работать. Для примера того, как я её использую, я вписал её в стандартный MACD эксперт. Код прилогаю:

Если описать кратко, то изменено там:

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
Естественно, что не работает. Не могли бы вы обьяснить, что не так? За ранее благодарен.
Файлы:
 
seifer писал (а):
Не могли бы вы обьяснить, что не так? За ранее благодарен.

Два замечания:

1. Я бы сделал вот так:

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2. Функция NumberOfOrders() возвращает количество ордеров - торговых операций типа BuyLimit, BuyStop, SellLimit и SellStop. Эксперт, который Вы модифицировали с ордерами не работает. Он открывает позиции по рыночным ценам, то есть совершает торговые операции типа Buy и Sell. Вам нужно использовать функцию NumberOfPositions(), которую я выложу в следующем посте.
 

Функция NumberOfPositions().

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

  • 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

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

Ух ты! Я то думал, что эта конструкция:

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
переберёт все позиции (в том числе и OP_SELL и OP_BUY). Теперь всё заработало. Ещё раз спасибо!
 

Функция GetProfitFromDateInCurrency().

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

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

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

ЗЫ. Во вложении скрипт для тестирования функции GetProfitFromDateInCurrency().

Более практично освоить использование данной функции можно на примере индикатора i-Profit, который показывает абсолютные и процентные значения прибыли за разные периоды времени.

 

Здравствуйте Игорь.

Хотел бы сказать спасибо за ф-ию по корреляции. у меня были некоторые варианты, хотелось просто уточнить их)

Тут есть еще такой вопрос. Очень часто на тесте да и на тестировании советника в режиме реального времени сталкиваюсь с ошибкой 130 - неверный стоп. Как я не анализировал ее никак не пойму почему имено она возникает в той или иной ситуации. Стал использовать конструкцию такую

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

так сказать для нормализации значений стопа и тейка, но это ситуацию не решило. Может вы сталкивались с подобным. подскажите как боротся с этим) и как лучше анализировать

Уточнение: очень часто такое у меня бывает когда я пытаюсь установить стоп в +1 п от цены открытия

 
scorpionk писал (а):
сталкиваюсь с ошибкой 131 - неверный стоп.

131 - Неправильный объем, ошибка в грануляции объема. Это размер торгуемого лота.

 
KimIV:
scorpionk писал (а):
сталкиваюсь с ошибкой 131 - неверный стоп.

131 - Неправильный объем, ошибка в грануляции объема. Это размер торгуемого лота.

ошибся с кодом, не 131 а 130

 
scorpionk:

ошибся с кодом, не 131 а 130

понятно...

Попробуйте нормализовать следующим образом:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Я так делаю и с ошибкой 130 не сталкиваюсь.
Причина обращения: