#include <b-Positions#.mqh> // Библиотека функций для работы с позициями #include <b-KimIV#.mqh> // Библиотека дополнительных функций#include <b-Orders#.mqh> // Библиотека функций для работы с ордерами#include <stdlib.mqh> // Стандартная библиотека#include <WinUser32.mqh> // Стандартная библиотека
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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();}}}}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);}
谢谢你的回答,伊戈尔,我已经想明白了。我也单独使用你的函数,但我想在EA的开发阶段利用库的优势。
我看了看komposter的 trade_lib&info_lib 库是怎么做的,并在你的库里做了一些修改,供我自己使用。
1.我已经删除了所有库中的#属性库 和交叉连接库的#include,重新命名了库,以避免混淆。
2.我做了一个直接调用所有库的块。
现在,所有库的所有功能都可用,在编译过程中没有错误和犯罪信息,除了正常的 "没有被引用......"。
所有外部 EA都可以使用,没有问题。
多写点,我们会联系和使用。首先,我希望看到按总利润计算的尾随功能。
WeekOfMonth()函数。
该函数按日期返回本月的周数。只接受一个可选参数。
附上一个测试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
非常感谢你的帮助!
伊戈尔,有没有一种功能可以从那些手数较多的头寸开始关闭所有头寸?
不是......写了......。
ClosePosBySortLots()函数。
该功能按手数排序关闭头寸。也就是说,使用这个函数,你可以按照手数的升序或降序来平仓。函数ClosePosBySortLots() 接受以下可选参数。
附上一个测试ClosePosBySortLots()函数的脚本。
AddLeadingZero()函数。
该函数在字符串中加入尽可能多的前导(左)零 "0",使字符串的长度等于某个给定值。AddLeadingZero() 函数需要以下强制性参数。
附上一个测试AddLeadingZero()函数的脚本。
toTime()函数。
该函数将两个/三个整数转换为时间格式的字符串。如果两个数字被传入函数,第一个数字将被用作小时,第二个数字将被用作分钟。返回的格式字符串将是 "HH:MM"。如果有三个数字,第三个数字将被替换为秒,该函数将返回 "HH:MM:SS "字符串。toTime() 函数接受以下可选参数。
附上一个测试toTime()函数的脚本。
伊戈尔,你能否建议一个函数,当价格与其中一个变量相匹配时给出相应的信号,例如b=1.2400,s=1.2300。
如果b=价格sig=1,如果s=价格sig=-1。
我为自己的草率表示歉意)。
对不起,我不是伊戈尔。但也许这将有所帮助。
我也很抱歉。>>这更准确。
......我将在今晚之前删除我的帖子,以便不至于使这个主题变得混乱......。
不需要。看一看会很有帮助,它会让你清醒地认识到,准确的价格价值并没有被一贯地抓住。