//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 20.10.2008 |//| Описание : Возвращает цену TakeProfit последней закрытой позиций или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) {
datetime t;
double r=-1;
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=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
r=OrderTakeProfit();
}
}
}
}
}
}
}
return(r);
}
int LevelProfit - 以点为单位的利润水平,一个头寸必须达到这个水平才能将其止损点移至Breakeven水平。
int LevelWLoss - 以点为单位的收支平衡水平,在其利润达到以点为单位的LevelProfit水平后,停止将被转移到该水平。
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 11.09.2008 |//| Описание : Перенос уровня стопа в безубыток |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
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 |//+----------------------------------------------------------------------------+//| Версия : 31.10.2008 |//| Описание : Выполняет удаление элемента массива с заданным индексом. |//| Возвращает размер нового массива или -1, |//| если не удалось ничего удалить. |//+----------------------------------------------------------------------------+//| Параметры: |//| m - массив элементов |//| i - индекс элемента |//+----------------------------------------------------------------------------+int ArrayDeleteInt(int& m[], int i) {
int j, k=ArraySize(m);
if (i>=0 && i<k) {
for (j=i; j<k; j++) m[j]=m[j+1];
k=ArrayResize(m, k-1);
return(k);
} elsePrint("ArrayDeleteInt(): Неверный индекс элемента массива! i=", i);
return(-1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 31.10.2008 |//| Описание : Выполняет удаление элемента массива с заданным индексом. |//| Возвращает размер нового массива или -1, |//| если не удалось ничего удалить. |//+----------------------------------------------------------------------------+//| Параметры: |//| m - массив элементов |//| i - индекс элемента |//+----------------------------------------------------------------------------+int ArrayDeleteDouble(double& m[], int i) {
int j, k=ArraySize(m);
if (i>=0 && i<k) {
for (j=i; j<k; j++) m[j]=m[j+1];
k=ArrayResize(m, k-1);
return(k);
} elsePrint("ArrayDeleteDouble(): Неверный индекс элемента массива! i=", i);
return(-1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 31.10.2008 |//| Описание : Выполняет удаление элемента массива с заданным индексом. |//| Возвращает размер нового массива или -1, |//| если не удалось ничего удалить. |//+----------------------------------------------------------------------------+//| Параметры: |//| m - массив элементов |//| i - индекс элемента |//+----------------------------------------------------------------------------+int ArrayDeleteString(string& m[], int i) {
int j, k=ArraySize(m);
if (i>=0 && i<k) {
for (j=i; j<k; j++) m[j]=m[j+1];
k=ArrayResize(m, k-1);
return(k);
} elsePrint("ArrayDeleteString(): Неверный индекс элемента массива! i=", i);
return(-1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 31.10.2008 |//| Описание : Выполняет вставку элемента массива с заданным индексом. |//| Возвращает размер нового массива. |//+----------------------------------------------------------------------------+//| Параметры: |//| m - массив элементов типа double |//| e - значение элемента |//| i - индекс элемента (-1 - добавить в конец массива) |//+----------------------------------------------------------------------------+int ArrayInsertDouble(double& m[], double e, int i=-1) {
int j, k=ArraySize(m);
ArrayResize(m, k+1);
if (i>=0 && i<k) {
for (j=k; j>i; j--) m[j]=m[j-1];
m[i]=e;
} else m[k]=e;
return(k+1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 04.11.2008 |//| Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |//+----------------------------------------------------------------------------+//| Параметры: |//| a - массив элементов |//| r - колонка сортировки ( 0 - первая (с индексом 0)) |//| m - направление сортировки (MODE_ASCEND - по возрастанию, |//| MODE_DESCEND - по убыванию) |//+----------------------------------------------------------------------------+void BubbleSort2(double& a[][], int r=0, int m=MODE_ASCEND) {
double t;
int e, i, j;
int k=ArrayRange(a, 1); // Количество колонокint n=ArrayRange(a, 0); // Количество строкif (r<0) r=0;
if (r>k) r=k;
for (i=n-1; i>0; i--) {
for (j=0; j<i; j++) {
if (m==MODE_ASCEND) {
// по возрастаниюif (a[j][r]>a[j+1][r]) {
for (e=0; e<k; e++) {
t=a[j][e];
a[j][e]=a[j+1][e];
a[j+1][e]=t;
}
}
} else {
// по убываниюif (a[j][r]<a[j+1][r]) {
for (e=0; e<k; e++) {
t=a[j][e];
a[j][e]=a[j+1][e];
a[j+1][e]=t;
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 13.10.2008 |//| Описание : Возвращает тип последнего удалённого ордера или -1 |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int GetTypeLastDeleted(string sy="", int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), r=-1;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
t=OrderCloseTime();
r=OrderType();
}
}
}
}
return(r);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 28.03.2008 |//| Описание : Возвращает индекс наибольшего бара или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| ty - тип элементов поиска ( 0 - H-L, 1 - O-C) |//| co - число элементов таймсерии ( 0 - все элементы) |//| in - индекс начального бара ( 0 - текущий бар) |//+----------------------------------------------------------------------------+int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, intin=0) {
if (sy=="" || sy=="0") sy=Symbol();
if (tf<=0) tf=Period();
if (in< 0) in=0;
if (co<=0) co=iBars(sy, tf)-in;
double r, rb=0; // размер бараint i, nb=-1; // счётчик и номер бараfor (i=co+in; i>=in; i--) {
if (ty>0) r=MathAbs(iOpen(sy, tf, i)-iClose(sy, tf, i));
else r=iHigh(sy, tf, i)-iLow(sy, tf, i);
if (rb<r) {
rb=r;
nb=i;
}
}
return(nb);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 26.02.2008 |//| Описание : Возвращает расчётный номер бара от начала суток. |//| : Нумерация баров начинается с 1 (единица). |//+----------------------------------------------------------------------------+//| Параметры: |//| tf - таймфрейм (0 - текущий таймфрейм) |//| dt - дата и время открытия бара (0 - текущее время) |//+----------------------------------------------------------------------------+int iBarOfDayCalc(int tf=0, datetime dt=0) {
if (tf<=0) tf=Period();
if (dt<=0) dt=TimeCurrent();
if (tf>PERIOD_D1) {
Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
return(0);
}
double ms=MathMod(dt/60, 1440); // количество минут от начала сутокint bd=MathFloor(ms/tf)+1; // номер бара от начала сутокreturn(bd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 26.02.2008 |//| Описание : Возвращает реальный номер бара от начала суток. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| dt - дата и время открытия бара ( 0 - текущее время) |//+----------------------------------------------------------------------------+int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
if (sy=="" || sy=="0") sy=Symbol();
if (tf<=0) tf=Period();
if (dt<=0) dt=TimeCurrent();
if (tf>PERIOD_D1) {
Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
return(0);
}
int cd=TimeDay(dt); // текущий день месяцаint nb=iBarShift(sy, tf, dt, False); // номер текущего бараint bd=0; // номер бара от начала сутокwhile(TimeDay(iTime(sy, tf, nb))==cd) {
nb++;
bd++;
}
return(bd);
}
NameDayOfWeek()函数
返回由作为参数传递的数字组成的星期的名称。
ndw - 星期的编号。必要的参数。
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает наименование дня недели |//+----------------------------------------------------------------------------+//| Параметры: |//| ndw - номер дня недели |//+----------------------------------------------------------------------------+string NameDayOfWeek(int ndw) {
if (ndw==0) return("Воскресенье");
if (ndw==1) return("Понедельник");
if (ndw==2) return("Вторник");
if (ndw==3) return("Среда");
if (ndw==4) return("Четверг");
if (ndw==5) return("Пятница");
if (ndw==6) return("Суббота");
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 16.05.2008 |//| Описание : Возвращает нормализованное значение торгуемого лота. |//+----------------------------------------------------------------------------+//| Параметры: |//| lo - нормализуемое значение лота. |//| ro - способ округления ( False - в меньшую, |//| True - в большую сторону) |//| sy - наименование инструмента ("" или NULL - текущий символ) |//+----------------------------------------------------------------------------+double NormalizeLot(double lo, bool ro=False, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 21.08.2008 |//| Описание : Возвращает нормализованное под размер тика значение цены. |//+----------------------------------------------------------------------------+//| Параметры: |//| np - нормализуемое значение цены. |//| sy - наименование инструмента ("" или NULL - текущий символ) |//+----------------------------------------------------------------------------+double NormalizePrice(double np, string sy="") {
if (sy=="" || sy=="0") sy=Symbol();
double pp, ts=MarketInfo(Symbol(), MODE_TICKSIZE);
int di=MarketInfo(Symbol(), MODE_DIGITS);
if (ts>0) pp=NormalizeDouble(np/ts, 0)*ts;
else {
if (di>0) pp=NormalizeDouble(np*di, 0)/di; else pp=np;
}
return(pp);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
TakeProfitLastClosePos()函数。
返回最后一次平仓的TakeProfit 价格水平或-1。TakeProfitLastClosePos() 函数接受以下可选参数。
函数MovingInWL()。
将未结头寸的止损 价位移至盈亏平衡点。MovingInWL() 函数接受以下可选参数。
此外,MovingInWL() 函数意味着全局变量(脚本或EA的外部参数)。
SimpleTrailing()函数。
使用TrailingStop 算法移动未结头寸的StopLoss 价格水平。函数SimpleTrailing() 接受以下可选参数。
此外,SimpleTrailing() 函数还意味着全局变量(脚本或专家顾问的外部参数)。
ArrayZ()函数。
该函数计算并返回数组中通过引用传递的数字系列的Z值。
ArrayDeleteInt()函数
执行删除一个 具有给定索引的数组元素 的操作。返回新数组的大小,如果没有移除任何东西,则返回-1。ArrayDeleteInt()函数接受以下强制性参数。
ArrayDeleteDouble()函数
删除数组中具有给定索引的元素。它返回新数组的大小或-1,如果没有什么可以被删除。ArrayDeleteDouble()函数接受以下强制性参数。
ArrayDeleteString()函数
执行删除一个 具有给定索引的数组元素 的操作。返回新数组的大小,如果没有东西可以被移除,则返回-1。ArrayDeleteString()函数接受以下强制性参数。
ArrayInsertDouble()函数
在数组中插入一个具有指定索引的元素。它返回新数组的元素数(大小)。插入的过程如下。首先,阵列的大小增加了一个。然后,所有索引大于或等于要插入的元素被逐一移到数组的末端,为要插入的元素腾出空间。最后,该值被写入所需的单元格中。ArrayInsertDouble()函数需要以下参数。
BubbleSort2()函数。
该函数将一个二维数组的元素冒泡成一个任意的列。你还可以指定排序方向。BubbleSort2()函数接受以下参数。
GetTypeLastDeleted()函数。
这个函数返回最后删除的订单的类型,或-1。 有些情况下,我们需要将EA操作逻辑与刚刚删除的订单的类型联系起来。例如,如果你刚刚删除了BuyStop,你应该这样做,但如果BuyLimit,你应该做其他事情,等等。GetTypeLastDeleted()函数接受以下可选参数。
iBarLargest()函数。
该函数返回最大条的索引或-1。栏的大小由函数以两种方式之一测量,由输入参数ty 决定--搜索项目的类型。要么只是身体尺寸,要么和阴影一起。iBarLargest()函数接受以下可选参数。
iBarOfDayCalc()函数。
该函数返回从一天的开始计算的条数。酒吧的编号从一开始,也就是说,在给定的一天中,开盘时间最短的酒吧将是第一号,下一个酒吧将是第二号,等等。这个功能对于优化进入/退出时间很有用。如果有人对细节感兴趣,可以提出问题。我将尽我所能回答他们。iBarOfDayCalc() 函数接受以下可选参数。
函数iBarOfDayReal()。
该函数返回从一天开始的实际条数。酒吧的编号从一开始,也就是说,在某一天,开盘时间最短的酒吧将有一号,下一个酒吧将有二号,等等。我还没有发现这个功能的任何实际用途。但我已经写好了它:-)与函数iBarOfDayCalc() 一起。iBarOfDayReal() 函数接受以下可选参数。
NameDayOfWeek()函数
返回由作为参数传递的数字组成的星期的名称。
功能NormalizeLot()。
该函数返回正在交易的手数的归一化值,除了归一化外,它还将手数适合于交易中心设置的限制(检查最小和最大手数以及手数变化步骤)。函数NormalizeLot()接受以下参数。
NormalizePrice()函数。
该函数返回归一化的价格值。 归一化是通过应用MarketInfo(MODE_TICKSIZE || MODE_DIGITS)函数的值进行的。NormalizePrice()函数接受以下参数。
WeekOfMonth()函数。
该函数按日期返回本月的周数。只接受一个可选参数。
函数 ClosePosBySortLots()。
该功能按手数排序的顺序关闭头寸。也就是说,使用这个函数,你可以按照手数的升序或降序来平仓。函数ClosePosBySortLots() 接受以下可选参数。
AddLeadingZero()函数。
该函数在字符串中加入尽可能多的前导(左)零 "0",使字符串的长度等于某个给定值。AddLeadingZero() 函数需要以下强制性参数。
函数toTime()。
该函数将两个/三个整数 转换为 时间格式的字符串。如果你在函数中传递两个数字,第一个将被用作小时,第二个将被用作分钟。返回的格式字符串将是 "HH:MM"。如果有三个数字,第三个数字将被替换为秒,该函数将返回 "HH:MM:SS "字符串。toTime() 函数接受以下可选参数。