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

 

Спасибо за ответ, Игорь, разобрался. Я использую Ваши функции и отдельно, но хотелось воспользоваться преимуществами библиотеки на этапе разработки эксперта.

Посмотрел, как сделана у komposter'а библиотека trade_lib&info_lib и произвел некоторые изменения в Ваших для собственного пользования.

1. Удалил во всех библиотеках #property library и перекрестные подключения библиотек #include, переименовал библиотеки, чтобы не путать.

2. Вставил в советник блок прямых вызовов всех библиотек.

#include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

Теперь доступны все функции всех библиотек, нет ошибок и криминальных сообщений при компилировании, кроме нормального "is not referenced..".

Все extern советника доступны, проблем нет.

Пишите еще, будем подсоединять и использовать. В первую очередь хотелось бы увидеть функцию трейлинга по суммарному профиту.

 

Функция WeekOfMonth().

Данная функция возвращает номер недели месяца по дате. Принимает только один необязательный параметр:

  • dt - Дата, время. Значение по умолчанию - 0 - текущие дата и время торгового сервера.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if (dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay(dt), nn=1;

  for (i=2; i<=kd; i++) {
    d=StrToTime(TimeYear(dt)+"."+TimeMonth(dt)+"."+i);
    if (TimeDayOfWeek(d)==1) nn++;
  }
  return(nn);
}

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

Файлы:
 
Игорь, а нет ли функции, которая бы закрывала все позиции начиная с позиций имеющих больший лот?
 

Здорова, Игорь! спасибо большое за твои полезные функции! пользуюсь ими как только можно! сам недавно только этим увлекся, поэтому вопросик к тебе... вчера периодически вылитал инет, после этого мой советник не хочет работать блин... крест ставит вместо довольной рожицы! использую твою функцию OpenPosition, может так он на ошибку обработанную какую нить отреагировал?? вот лог вчерашнего дня, до этого все отлично было! тестирую его на демо-счете... нигде не могу найти про ошибку 220........

07:47:28 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
07:47:28 Expert open prob USDJPY EURUSD,M1: loaded successfully
07:47:32 '1262868': login
07:47:44 '1262868': login
07:49:40 '1262868': login
07:49:46 '1262868': login
07:54:44 '1262868': connect failed [Нет связи]
11:38:16 Expert open prob USDJPY EURUSD,M1: removed
11:38:18 MetaTrader 4.00 build 220 stopped
14:05:05 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
14:05:05 Expert open prob USDJPY EURUSD,M1: loaded successfully
14:05:10 '1262868': login
14:05:31 '1262868': login
14:06:39 '1262868': login
14:06:46 '1262868': login
15:57:06 '1262868': connect failed [Нет связи]
18:30:46 Expert open prob USDJPY EURUSD,M5: removed
18:30:49 Main pumping: timeout on stop
18:30:52 Main pumping: timeout on stop
18:30:55 Main pumping: timeout on stop
18:30:58 Main pumping: timeout on stop
18:31:01 Main pumping: timeout on stop
18:31:01 Main pumping: terminated
18:31:02 MetaTrader 4.00 build 220 stopped
18:31:02 MetaTrader 4.00 build 220 stopped because system shutdown
18:47:57 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
18:47:58 Expert open prob USDJPY EURUSD,M5: loaded successfully
18:48:01 '1262868': connect failed [Нет связи]
18:48:10 '1262868': login
18:48:20 '1262868': login
20:19:00 '1262868': login
20:19:07 '1262868': login
20:20:05 '1262868': login
20:20:13 '1262868': login
20:59:29 '1262868': login
20:59:39 '1262868': login
21:02:16 '1262868': login
21:02:41 '1262868': DataCenter connecting failed [6]
22:08:40 '1262868': ping failed
22:08:43 '1262868': login
22:08:49 '1262868': DataCenter connecting failed [6]
22:10:01 '1262868': login
22:10:05 '1262868': DataCenter connecting failed [6]
22:14:59 '1262868': login
22:15:13 '1262868': login
22:15:22 '1262868': DataCenter connecting failed [6]
22:37:16 '1262868': login
22:37:27 '1262868': DataCenter connecting failed [6]
22:40:51 '1262868': login
22:41:04 '1262868': DataCenter connecting failed [6]
23:17:14 Expert open prob USDJPY EURUSD,M5: removed
23:17:16 Expert open prob USDJPY EURUSD,M5: loaded successfully
23:25:52 Expert open prob USDJPY EURUSD,M5: removed
23:25:55 MetaTrader 4.00 build 220 stopped
23:25:59 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
23:26:05 '1262868': login
23:26:05 Expert open prob USDJPY EURUSD,M5: loaded successfully
23:26:15 '1262868': login
23:27:19 '1262868': login
23:27:34 '1262868': login
23:28:20 Expert open prob USDJPY EURUSD,M5: removed
23:28:25 Expert open prob USDJPY USDCHF,H4: loaded successfully
23:28:33 Expert open prob USDJPY USDCHF,H4: removed

ЗЫ заранее огромное спасибо!

 
khorosh писал(а) >>
Игорь, а нет ли функции, которая бы закрывала все позиции начиная с позиций имеющих больший лот?

не было... написал...

Функция ClosePosBySortLots().

Данная функция выполняет закрытие позиций в порядке сортировки по размерам лотов. То есть с помощью данной функции можно закрывать позиции в порядке возрастания или убывания размера лота. Функция ClosePosBySortLots() принимает следующие необязательные параметры:

  • sy - Наименование торгового инструмента. "" - любой инструмент, NULL - текущий инструмент. Значение по умолчанию - "".
  • op - Тип торговой операции. Допустимые значения -1 - любая позиция, OP_BUY - покупки, OP_SELL - продажи. Значение по умолчанию -1.
  • mn - MagicNumber, уникальный идентификатор торговой оперции. Значение по умолчанию -1 - любой магик.
  • sd - Направление сортировки размеров лотов. Допустимые значения MODE_ASCEND - по возрастанию, MODE_DESCEND - по убыванию. Значение по умолчанию - MODE_DESCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd=MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=0;                     // Количество позиций

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; 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) {
            p++;
            ArrayResize(a, p);
            a[p-1][0]=OrderLots();
            a[p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if (p>0) {
    ArraySort(a, WHOLE_ARRAY, 0, sd);
    for (i=0; i<p; i++) {
      if (OrderSelect(a[i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}

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

Файлы:
 

Функция AddLeadingZero().

Данная функция добавляет к строке столько лидирующих (слева) нулей "0", чтобы длина строки стала равной некоторому заданному значению. Функция AddLeadingZero() принимает следующие обязательные параметры:

  • s - Строка, к которой нужно добавить лидирующие нули.
  • k - Длина результирующей строки S.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen(s)<k) s=StringConcatenate("0", s);
  return(s);
}

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

Файлы:
 

Функция toTime().

Данная функция преобразует два/три целых числа в строку в формате времени. Если в функцию передать два числа, то первое из них будет использовано в качестве часов, а второе - в качестве минут. Возвращена будет строка формата "ЧЧ:ММ". В случае трёх чисел третье будет поставлено на место секунд и функция вернёт строку формата "ЧЧ:ММ:СС". Функция toTime() принимает следующие необязательные параметры:

  • h - Часы. Значение по умолчанию 0.
  • m - Минуты. Значение по умолчанию 0.
  • s - Секунды. 0 - не использовать. Значение по умолчанию 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if (h==0) st="00:";
  else      st=StringConcatenate(AddLeadingZero(h, 2), ":");

  if (m==0) st=StringConcatenate(st, "00");
  else      st=StringConcatenate(st, AddLeadingZero(m, 2));

  if (s!=0) st=StringConcatenate(st, ":", AddLeadingZero(s, 2));

  return(st);
}

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

Файлы:
 

Игорь подскажите если не трудно функцию которая при совпадении цены с одной из переменных давала бы соответствующий сигнал допустим b=1.2400, s=1.2300;

Если b=цене sig=1, если s=цене sig=-1.

Прошу прощения за корявость.)

 
Prival >>:
Извинаясь, я не Игорь. Но может это поможет.

Тоже извиняюсь. Корректней будет

//+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign(double b, double s)
   {
   double var,e; var=Close[0];e=0.000001;
   if(var<b+e && var>b-e) return( 1);
   if(var<s+e && var>s-e) return(-1); 
   return(0);
   }
 
Prival >>:

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

Нэ надо. Полезно будет поглядывать, будит мысль о том, что точное значение цены стабильно не ловится.

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