//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 10.10.2008 |//| Описание : Перенос вещественных чисел из строки в массив |//+----------------------------------------------------------------------------+//| Параметры: |//| st - строка вещественных чисел через точку с запятой |//| ad - массив вещественных чисел |//+----------------------------------------------------------------------------+//| Возврат: |//| Количество элементов в массиве |//+----------------------------------------------------------------------------+int StringToArrayDouble(string st, double& ad[]) {
int i=0, np;
string stp;
ArrayResize(ad, 0);
while (StringLen(st)>0) {
np=StringFind(st, ";");
if (np<0) {
stp=st;
st="";
} else {
stp=StringSubstr(st, 0, np);
st=StringSubstr(st, np+1);
}
i++;
ArrayResize(ad, i);
ad[i-1]=StrToDouble(stp);
}
return(ArraySize(ad));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Перенос целочисленных значений из строки в массив |//+----------------------------------------------------------------------------+//| Параметры: |//| st - строка целочисленных значений через запятую |//| ai - целочисленный массив |//+----------------------------------------------------------------------------+//| Возврат: |//| Количество элементов в массиве |//+----------------------------------------------------------------------------+int StringToArrayInt(string st, int& ai[]) {
int i=0, np;
string stp;
ArrayResize(ai, 0);
while (StringLen(st)>0) {
np=StringFind(st, ",");
if (np<0) {
stp=st;
st="";
} else {
stp=StringSubstr(st, 0, np);
st=StringSubstr(st, np+1);
}
i++;
ArrayResize(ai, i);
ai[i-1]=StrToInteger(stp);
}
return(ArraySize(ai));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 23.06.2008 |//| Описание : Разбиение строки на массив элементов |//+----------------------------------------------------------------------------+//| Возврат: |//| Количество элементов в массиве |//| Параметры: |//| st - строка с разделителями |//| as - строковый массив |//| de - разделитель |//+----------------------------------------------------------------------------+int StrSplit(string st, string& as[], string de=",") {
int i=0, np;
string stp;
ArrayResize(as, 0);
while (StringLen(st)>0) {
np=StringFind(st, ",");
if (np<0) {
stp=st;
st="";
} else {
stp=StringSubstr(st, 0, np);
st=StringSubstr(st, np+1);
}
i++;
ArrayResize(as, i);
as[i-1]=stp;
}
return(ArraySize(as));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| описание : Замена подстроки |//+----------------------------------------------------------------------------+//| Параметры: |//| str - текстовая строка, в которой производится замена |//| strFrom - заменяемая подстрока |//| strTo - заменяющая подстрока |//+----------------------------------------------------------------------------+string StrTran(string str, string strFrom, string strTo) {
int n;
string strOut="", strTemp;
for (n=0; n<StringLen(str); n++) {
strTemp=StringSubstr(str, n, StringLen(strFrom));
if (strTemp==strFrom) {
strOut=StringConcatenate(strOut, strTo);
n=n+StringLen(strFrom)-1;
} else strOut=StringConcatenate(strOut, StringSubstr(str, n, 1));
}
return(strOut);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 23.04.2009 |//| Описание : Перенос уровня стопа в безубыток |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();
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 (mn<0 || OrderMagicNumber()==mn) {
po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
}
}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 29.04.2009 |//| Описание : Возвращает флаг разрешения торговли по времени. |//+----------------------------------------------------------------------------+//| Параметры: |//| TimeBegin - время начала торговли (ЧЧ:ММ) |//| TimeEnd - время окончания торговли (ЧЧ:ММ) |//+----------------------------------------------------------------------------+bool isTradeTimeString(string TimeBegin="00:00", string TimeEnd="00:00") {
datetime dtBegin, dtEnd; // Время начала и окончания работыint hc, he; // Часы текущего времени и окончания работы
dtBegin=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeBegin);
dtEnd =StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeEnd);
hc =TimeHour(TimeCurrent());
he =TimeHour(dtEnd);
if (dtBegin>=dtEnd) {
if (hc>=he) dtEnd+=24*60*60; else dtBegin-=24*60*60;
}
if (TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd) return(True);
elsereturn(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.04.2009 |//| Описание : Возвращает флаг разрешения торговли по времени. |//+----------------------------------------------------------------------------+//| Параметры: |//| hb - часы времени начала торговли |//| mb - минуты времени начала торговли |//| he - часы времени окончания торговли |//| me - минуты времени окончания торговли |//+----------------------------------------------------------------------------+bool isTradeTimeInt(int hb=0, int mb=0, int he=0, int me=0) {
datetime db, de; // Время начала и окончания работыint hc; // Часы текущего времени торгового сервера
db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+hb+":"+mb);
de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+me);
hc=TimeHour(TimeCurrent());
if (db>=de) {
if (hc>=he) de+=24*60*60; else db-=24*60*60;
}
if (TimeCurrent()>=db && TimeCurrent()<=de) return(True);
elsereturn(False);
}
Igor Kim 在这里和他的网站上都以 "函数集 "的形式发布了他的函数,在一个文件中。以这种形式使用这些集合作为插件库是不可能的。然而,特别是在开发EA时,使用库来简化和减少EA的代码是非常方便的。此外,这消除了所有关于正确使用交易操作的问题,使你能够专注于策略,这对具有初级编程技能的交易者来说特别有价值。 所附文件包含相同的函数集合,以库的形式设计。这些库只需放在.../experts/include目录下,它们不需要被编译,下面是它们的连接例子。 在它们连接之后,只需从EA代码中调用所需的函数即可。
#include <b-Positions_include.mqh> // Библиотека функций для работы с позициями #include <b-KimIV_include.mqh> // Библиотека дополнительных функций#include <b-Orders_include.mqh> // Библиотека функций для работы с ордерами
StringLower()函数。
该函数将一个字符串转换 为小写。所有重要的(大)字符都变成小写(小)。StringLower() 函数只接受一个强制性参数,即传入的字符串。
StringUpper()函数。
该函数将字符串转换 为大写字母。所有小写(小)字符变成大写(大)。StringUpper() 函数只接受一个强制性参数,即输入字符串。
StringToArrayDouble()函数。
这个函数将字符串分割成其组成的实数,每个数字作为一个单独的元素被添加到数组中。字符串中出现多少个实数,就会有相同数量的元素被添加到数组中。分号被认为是一个分隔符。StringToArrayDouble() 函数返回数组元素的数量,并接受以下强制性参数。
StringToArrayInt()函数。
这个函数将字符串分割成其组成的整数,每个数字作为一个单独的元素被添加到数组中。字符串中有多少个整数,就会有多少个元素被添加到数组中。逗号被认为是一个分隔符。StringToArrayDouble() 函数返回数组元素的 数量,并接受以下强制性参数。
StrSplit()函数。
这个函数将一个字符串分割成它的子串,使每个子串成为数组中的一个独立元素。分隔符由一个参数指定,可以是任意的。StrSplit() 函数返回数组元素的数量并接受以下参数。
StrTran()函数。
这个函数替换了一个子串。所有出现的它都被替换。例如,你可以将所有逗号替换为点,或者反之亦然,一举两得。StrSplit()函数返回生成的字符串,并接受以下强制性参数。
函数isTradeTimeString()。
这个函数返回允许你按时间交易的标志。 实际上,它实际上是检查交易服务器的当前时间是否在某个时间区间内。如果是在里面,isTradeTimeString()函数返回真,否则返回假。 这个函数的特点是可以指定一天之内和之外的时间间隔。这将在使用实例中详细说明。isTradeTimeString()函数接受以下可选参数。
函数isTradeTimeInt()。
该函数返回允许按时间交易的标志。 返回值为真或假。函数isTradeTimeInt()与函数isTradeTimeString() 的原理相似,都是通过时间间隔的识别,即交易开始时间既可以较大(一天内的时间间隔),也可以较小(不同天的时间间隔)。函数isTradeTimeInt()接受以下可选参数。
所附文件包含相同的函数集合,以库的形式设计。这些库只需放在.../experts/include目录下,它们不需要被编译,下面是它们的连接例子。
在它们连接之后,只需从EA代码中调用所需的函数即可。
亲爱的,在哪里排队。
isCloseLastPosByStop()函数。
该函数返回一个标志,即通过停止关闭最后一个位置。旗帜升起 -真- 触发了StopLoss。Flag lowered -False- 职位已因其他原因被关闭。使用外部参数对需要考虑的位置进行更精确的选择。
我知道这些函数是在还没有5位数的时候写的。日元作为一种比较的例子。
增加一个并不难!