KimIV的有用功能 - 页 62

 

谢谢你的回答,伊戈尔,我已经想明白了。我也单独使用你的函数,但我想在EA的开发阶段利用库的优势。

我看了看komposter的 trade_lib&info_lib 库是怎么做的,并在你的库里做了一些修改,供我自己使用。

1.我已经删除了所有库中的#属性库 和交叉连接库的#include,重新命名了库,以避免混淆。

2.我做了一个直接调用所有库的块。

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

现在,所有库的所有功能都可用,在编译过程中没有错误和犯罪信息,除了正常的 "没有被引用......"。

所有外部 EA都可以使用,没有问题。

多写点,我们会联系和使用。首先,我希望看到按总利润计算的尾随功能。

 

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启动(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 [No connection]
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 [No connection]
18:30:46 Expert open prob USDJPY EURUSD,M5:删除
18:30:49 主泵:停止时超时
18:30:52 主泵:停止时超时
18:30:55 主泵:停止时超时
18:30:58 主泵:停止时超时
18:31:01 主泵:停止时超时
18:31:01 主泵:终止
18:31:02 MetaTrader 4。00 build 220停止
18:31:02 MetaTrader 4.00 build 220因系统关闭而停止
18:47:57 MetaTrader 4.00 build 220开始(MetaQuotes Software Corp.)
18:47:58 Expert open prob USDJPY EURUSD,M5: loaded successfully
18:48:01 '1262868': connect failed [No connection]
18:48:10 '1262868': login
18:48:20 '1262868': login
20:19:00 '1262868': login
20:19:07 '1262868': login
20:20:05 '1272868': login
20:20:13 '1262868': 登录
20:59:29 '1262868': 登录
20:59:39 '1262868': 登录
21:02:16 '1262868': 登录
21:02:41 '1262868': 数据中心连接失败 [6]
22:08:40 '1262868': ping失败
22:08:43 '1262868': 登录
22:08:49 '1272868': 数据中心连接失败 [6]
22:1001 '1262868': 登录
22:10:05 '1262868': 数据中心连接失败 [6]
22:14:59 '1262868': 登录
22:15:13 '1262868': 登录
22:15:22 '1262868': 数据中心连接失败 [6]
22:37:16 '1262868': 登录
22:37:27 '1262868': 数据中心连接失败 [6]
22:4051 '1262868': 登录
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': 登录
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 USCHF,H4: loaded successfully
23:28:33 Expert open prob USDJPY USCHF,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()函数。

该函数将两个/三个整数转换为时间格式的字符串。如果两个数字被传入函数,第一个数字将被用作小时,第二个数字将被用作分钟。返回的格式字符串将是 "HH:MM"。如果有三个数字,第三个数字将被替换为秒,该函数将返回 "HH:MM:SS "字符串。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 >> :

......我将在今晚之前删除我的帖子,以便不至于使这个主题变得混乱......。

不需要。看一看会很有帮助,它会让你清醒地认识到,准确的价格价值并没有被一贯地抓住。