Эту функцию я написал после того, как обнаружил, что иногда я могу запросто во входных параметрах индикатора или советника указать неправильный таймфрейм, который равен целому количеству минут. Например, я ввёл 50 для часовок вместо 60. Ну... типа промахнулся. Так вот оказывается, функция iRSI() для неправильного таймфрейма возвращает ноль. Про другие функции ничего не скажу, ибо не проверял. И чтобы избежать досадных недоразумений из-за своих же ошибок по невнимательности, я написал эту функцию, как элементарную защиту от "дурака". Она выполняет подгонку входного параметра под "ближайший" подходящий правильный таймфрейм и возвращает его значение.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 02.03.2008 |//| Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4. |//+----------------------------------------------------------------------------+//| Параметры: |//| TimeFrame - таймфрейм (количество секунд) (0 - текущий ТФ) |//+----------------------------------------------------------------------------+int CorrectTF(int TimeFrame=0) {
if (TimeFrame==0) TimeFrame=Period();
if (TimeFrame< PERIOD_M5 ) return(PERIOD_M1);
if (TimeFrame>=PERIOD_M5 && TimeFrame<PERIOD_M15) return(PERIOD_M5);
if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
if (TimeFrame>=PERIOD_H1 && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
if (TimeFrame>=PERIOD_H4 && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
if (TimeFrame>=PERIOD_D1 && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
if (TimeFrame>=PERIOD_W1 && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
if (TimeFrame>=PERIOD_MN1 ) return(PERIOD_MN1);
}
Функция DateBeginQuarter().
Эта функция возвращает дату начала квартала по его номеру. Например, если сейчас 27.08.2008, то датой начала текущего квартала будет 01.07.2008. Функция принимает только один параметр - номер квартала относительно текущего. Например, 0 - текущий квартал, 1 - следующий, а -1 - предыдущий. То есть положительные номера кварталов запросят даты из будущего, а нулевой и отрицательные из прошлого. Возвращаемое значение - количество секунд, прошедшее с 00:00 1 января 1970 года.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.05.2008 |//| Описание : Возвращает дату начала квартала |//+----------------------------------------------------------------------------+//| Параметры: |//| (-2 - позапрошлый) |//| (-1 - прошлый) |//| nq - номер квартала ( 0 - текущий) |//| ( 1 - следующий) |//| ( 2 - последующий) |//+----------------------------------------------------------------------------+datetime DateBeginQuarter(int nq=0) {
int ye=Year()-MathFloor(nq/4);
nq=MathMod(nq, 4);
int mo=Month()-MathMod(Month()+2, 3)+3*nq;
if (mo<1) {
mo+=12;
ye--;
}
if (mo>12) {
mo-=12;
ye++;
}
return(StrToTime(ye+"."+mo+".01"));
}
Эта функция возвращает дату начала недели (дату понедельника) по её номеру. Например, если сейчас 29.08.2008, то датой начала текущей недели будет 25.08.2008. Функция принимает только один параметр - номер недели относительно текущей. Например, 0 - текущая неделя, 1 - следующая, а -1 - предыдущая. То есть положительные номера недель запросят даты из будущего, а нулевой и отрицательные из прошлого. Возвращаемое значение - количество секунд, прошедшее с 00:00 1 января 1970 года.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 13.05.2008 |//| Описание : Возвращает дату понедельника по номеру недели |//+----------------------------------------------------------------------------+//| Параметры: |//| (-2 - предпредыдущая неделя) |//| (-1 - предыдущая неделя) |//| nn - номер недели ( 0 - текущая неделя) |//| ( 1 - следующая неделя) |//| ( 2 - последующая неделя) |//+----------------------------------------------------------------------------+datetime DateOfMonday(int nn=0) {
datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
dt+=nn*7*24*60*60;
return (dt);
}
Функция Fibonacci().
Эта функция возвращает элемент ряда Фибоначчи по его порядковому номеру.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.08.2008 |//| Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| n - номер элемента ряда |//+----------------------------------------------------------------------------+int Fibonacci(int n) {
int a=0, b=0, i=1, s=0;
if (n==1) s=1;
if (n>1) {
s=1;
while (i<n) {
i++;
a=b;
b=s;
s=a+b;
}
}
return(s);
}
Эта функция возвращает наименование метода МА (Moving Averages) по его идентификатору. Данную функцию удобно использовать в комментариях, сообщениях индикаторов, советников.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает наименование метода МА. |//+----------------------------------------------------------------------------+//| Параметры: |//| mm - идентификатор метода МА |//+----------------------------------------------------------------------------+string GetNameMA(int mm) {
switch (mm) {
caseMODE_SMA : return("SMA");
caseMODE_EMA : return("EMA");
caseMODE_SMMA: return("SMMA");
caseMODE_LWMA: return("LWMA");
default : return("Unknown Method");
}
}
Эта функция возвращает ценовую разницу между двумя барами, которые задаются их номерами. Целью разработки данной функции было определение величины и направления движения курса. Функция GetPriceDiffInPoint() самостоятельно определяет, какие именно опорные точки (Open или High или Low или Close) баров брать в расчёт. Функция принимает следующие необязательные параметры:
sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
n2 - Номер левого бара. Значение по умолчанию - 2.
n1 - номер правого бара. Значение по умолчанию - 1.
Возвращаемое значение:
положительное- между барами N2 и N1 был рост курса.
отрицательное - между барами N2 и N1 было снижение курса.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает ценовую разницу в пунктах между двумя барами. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| n2 - номер левого бара ( 2 - второй бар) |//| n1 - номер правого бара ( 1 - первый бар) |//| Возвращаемое значение: |//| положительное - между барами N2 и N1 был рост курса |//| отрицательное - между барами N2 и N1 было снижение курса |//+----------------------------------------------------------------------------+int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
if (sy=="" || sy=="0") sy=Symbol();
double p=MarketInfo(sy, MODE_POINT);
int d=MarketInfo(sy, MODE_DIGITS);
int dd=0, k=iBars(sy, tf);
if (n1>k || n2>k)
Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
else {
if (n1>0 && n2>0) {
int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);
if (MathAbs(d1)>MathAbs(d2)) dd=d1;
if (MathAbs(d1)<MathAbs(d2)) dd=d2;
if (MathAbs(d1)==MathAbs(d2)) {
if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
}
}
}
return(dd);
}
Функция GetTypePrice()
Возвращает наименование типа цены. Функция принимает только один необязательный параметр. Допустимые значения: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED. Значение по умолчанию - 0 - PRICE_CLOSE.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает наименование типа цены. |//+----------------------------------------------------------------------------+//| Параметры: |//| Applied_Price - тип цены |//+----------------------------------------------------------------------------+string GetTypePrice(int Applied_Price=0) {
switch (Applied_Price) {
casePRICE_CLOSE : return("Close");
casePRICE_OPEN : return("Open");
casePRICE_HIGH : return("High");
casePRICE_LOW : return("Low");
casePRICE_MEDIAN : return("Median");
casePRICE_TYPICAL : return("Typical");
casePRICE_WEIGHTED: return("Weighted");
default : return("Unknown Type Price");
}
}
Возвращает флаг существования ордера по заданной цене установки. True - ордер существует (установлен), False - ордер отсутствует (не установлен). Ограничить перечень проверяемых ордеров можно параметрами функции:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Тип торговой операции, тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой тип ордера.
mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
pp - Ценовой уровень установки ордера. Значение по умолчанию -1 - любая цена.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.07.2008 |//| Описание : Возвращает флаг существования ордеров по цене установки |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| pp - цена (-1 - любая цена) |//+----------------------------------------------------------------------------+bool ExistOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
int d, 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 (OrderType()>1 && OrderType()<6) {
d=MarketInfo(OrderSymbol(), MODE_DIGITS);
pp=NormalizeDouble(pp, d);
if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
return(False);
}
Функция ClosePosBySelect() для тестера.
Выполняет закрытие одной предварительно выбранной позиции. Это облегчённый вариант одноимённой функции, ранее выложенной на странице 13. Ничего лишнего. Никаких наворотов. У меня в практике не было случаев, чтобы в тестере позиция не закрылась. Поэтому в данной функции нет никаких проверок. В тестере они излишни.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 13.06.2007 |//| Описание: Закрытие одной предварительно выбранной позиции |//+----------------------------------------------------------------------------+void ClosePosBySelect() {
double pp;
if (OrderType()==OP_BUY) {
pp=MarketInfo(OrderSymbol(), MODE_BID);
OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
}
if (OrderType()==OP_SELL) {
pp=MarketInfo(OrderSymbol(), MODE_ASK);
OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
}
}
В моих тестовых (предназначенных для использования исключительно в тестере МТ4) версиях советников функция CountOrders() заменяет следующие функции: ExistOrders(), ExistPositions(), NumberOfOrders() и NumberOfPositions(). То есть она может дать информацию о существовании позиции или ордера любого типа, а также сведения о количестве торговых операций каждого типа. Подобная замена имеет свои преимущества, которая выражается в однократном на один тик обращении к базе ордеров и получении всей необходимой информации за раз. А вышеупомянутые функции, особенно при использовании в комплексе, каждая самостоятельно работает с одной и той же базой ордеров и поэтому многократно выполняют одни и те же обращения. В итоге функция CountOrders() позволяет на несколько секунд уменьшить время одного прохода, что даёт часы экономии при оптимизациях.
Функция CountOrders() принимает следующие параметры:
mo - Массив количества ордеров по типам. После отработки функции массив будет иметь 6 (шесть) элементов. Нулевойэлемент - количество торговых операций типа Buy, первыйэлемент - количество Sell, второй - BuyLimit, третий - SellLimit, четвёртый - BuyStop, пятый- SellStop.
mn - Идентификатор позиции или ордеров (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 03.08.2008 |//| Описание : Рассчитывает количество ордеров по типам. |//+----------------------------------------------------------------------------+//| Параметры: |//| mo - массив количества ордеров по типам |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+void CountOrders(int& mo[], int mn=-1) {
int i, k=OrdersTotal();
if (ArraySize(mo)!=6) ArrayResize(mo, 6);
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (mn<0 || OrderMagicNumber()==mn) mo[OrderType()]++;
}
}
}
Функция ModifyOrder() для тестера.
Это облегчённый вариант функции ModifyOrder(), опубликованной на странице 7, и предназначенной для изменения абсолютных ценовых уровней одного предварительно выбранного ордера или позиции.
Функция ModifyOrder() принимает следующие параметры:
pp - Цена установки ордера. Если передать значение меньше или равное нулю, то модификация данного ценового уровня выполнена не будет. Значение по умолчанию -1.
sl - Ценовой уровень стопа. Если передать значение меньше нуля, то модификация данного ценового уровня выполнена не будет. Значение по умолчанию 0.
tp - Ценовой уровень тейка. Если передать значение меньше нуля, то модификация данного ценового уровня выполнена не будет. Значение по умолчанию 0.
ex - Дата истечения отложенного ордера. Значение по умолчанию 0.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 28.03.2008 |//| Описание : Модификация ордера. Версия функции для тестов на истории. |//+----------------------------------------------------------------------------+//| Параметры: |//| pp - цена открытия позиции, установки ордера |//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//| ex - дата истечения |//+----------------------------------------------------------------------------+void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
double op=NormalizeDouble(OrderOpenPrice() , dg);
double os=NormalizeDouble(OrderStopLoss() , dg);
double ot=NormalizeDouble(OrderTakeProfit(), dg);
color cl;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
if (pp!=op || sl!=os || tp!=ot) {
if (MathMod(OrderType(), 2)==0) cl=clModifyBuy; else cl=clModifySell;
if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
er=GetLastError();
Print("Error(",er,") modifying order: ",ErrorDescription(er));
Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
}
}
}
Очень удобная функция в плане построения развилок. Если так, то такой цвет. А если не так, то другой цвет. Функция IIFc() принимает три обязательных параметра:
ifTrue - Цвет, который будет возвращён функцией IIFc(), если выражение condition истинно.
ifFalse - Цвет, который будет возвращён функцией IIFc(), если выражение condition ложно.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 18.07.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+color IIFc(bool condition, color ifTrue, color ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
Функция IIFd().
Аналогичное удобство для вещественных чисел. Если так, то такое вещественное число. А если не так, то другое число. Функция IIFd() принимает три обязательных параметра:
condition - Логическое выражение. Оно может быть истинным или ложным.
ifTrue - Вещественное число, которое будет возвращено функцией IIFd(), если выражение condition истинно.
ifFalse - Вещественное число, которое будет возвращено функцией IIFd(), если выражение condition ложно.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+double IIFd(bool condition, double ifTrue, double ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
Функция IIFi().
Аналогичное удобство для целых чисел. Если так, то такое целое число. А если не так, то другое число. Функция IIFi() принимает три обязательных параметра:
condition - Логическое выражение. Оно может быть истинным или ложным.
ifTrue - Целое число, которое будет возвращено функцией IIFi(), если выражение condition истинно.
ifFalse - Целое число, которое будет возвращено функцией IIFi(), если выражение condition ложно.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+int IIFi(bool condition, int ifTrue, int ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
Функция IIFs().
Аналогичное удобство для строк. Если так, то такая строка. А если не так, то другая строка. Функция IIFs() принимает три обязательных параметра:
condition - Логическое выражение. Оно может быть истинным или ложным.
ifTrue - Строка, которая будет возвращена функцией IIFs(), если выражение condition истинно.
ifFalse - Строка, которая будет возвращена функцией IIFs(), если выражение condition ложно.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+string IIFs(bool condition, string ifTrue, string ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
Возвращает флаг существования в истории позиции или ордера, закрытой (удалённого) между датами. Функция ExistInHistoryCloseBetween() принимает следующие параметры:
sy - Наименование рыночного инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP. Значение по умолчанию -1 - любая операция.
mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
d1 - Время закрытия позиции (удаления отложенного отреда). Значение по умолчанию - 0 - любое время закрытия (удаления). Время d1 должно быть меньше времени d2.
d2 - Время закрытия позиции (удаления отложенного отреда). Значение по умолчанию - 0 - любое время закрытия (удаления). Время d2 должно быть больше времени d1.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 27.08.2008 |//| Описание : Возвращает флаг существования в истории позиции или ордера, |//| : закрытой (удалённого) между датами. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая операция) |//| mn - MagicNumber (-1 - любой магик) |//| d1 - время закрытия ( 0 - любое время закрытия) |//| d2 - время закрытия ( 0 - любое время закрытия) |//+----------------------------------------------------------------------------+bool ExistInHistoryCloseBetween(string sy="", int op=-1, int mn=-1,
datetime d1=0, datetime d2=0) {
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=="") && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (d1<=OrderCloseTime() && (d2==0 || d2>=OrderCloseTime())) return(True);
}
}
}
}
return(False);
}
Функция ExistInHistoryOpenBetween().
Возвращает флаг существования в истории позиции или ордера, открытой (установленного) между датами. Функция ExistInHistoryOpenBetween() принимает следующие параметры:
sy - Наименование инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP. Значение по умолчанию -1 - любая операция.
mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
d1 - Время открытия позиции (установки отложенного ордера). Значение по умолчанию - 0 - любое время открытия (установки). Время d1 должно быть меньше времени d2.
d2 - Время открытия позиции (установки отложенного ордера). Значение по умолчанию - 0 - любое время открытия (установки). Время d2 должно быть больше времени d1.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 27.08.2008 |//| Описание : Возвращает флаг существования в истории позиции или ордера, |//| : открытой (установленного) между датами. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| d1 - время открытия ( 0 - любое время открытия) |//| d2 - время открытия ( 0 - любое время открытия) |//+----------------------------------------------------------------------------+bool ExistInHistoryOpenBetween(string sy="", int op=-1, int mn=-1,
datetime d1=0, datetime d2=0) {
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=="") && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (d1<=OrderOpenTime() && (d2==0 || d2>=OrderOpenTime())) return(True);
}
}
}
}
return(False);
}
Возвращает флаг существования в истории позиции или ордера, открытой (установленного) сегодня. Функция ExistInHistoryToDay() принимает следующие параметры:
sy - Наименование инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP. Значение по умолчанию -1 - любая операция.
mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.08.2008 |//| Описание : Возвращает флаг наличия ордера или позиции в истории за сегодня|//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+bool ExistInHistoryToDay(string sy="", int op=-1, int mn=-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 (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (TimeDay (OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear (OrderOpenTime())==Year()) return(True);
}
}
}
}
}
return(False);
}
Функция TakeProfitLastPos().
Данная функция возвращает ценовой уровень TakeProfit последней открытой позиций или -1. Функция TakeProfitLastPos() принимает следующие необязательные параметры:
sy - Наименование инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL. Значение по умолчанию -1 - любая операция.
mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.08.2008 |//| Описание : Возвращает цену TakeProfit последней открытой позиций или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double TakeProfitLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
double r=-1;
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=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderTakeProfit();
}
}
}
}
}
}
}
return(r);
}
Функция CorrectTF().
Эту функцию я написал после того, как обнаружил, что иногда я могу запросто во входных параметрах индикатора или советника указать неправильный таймфрейм, который равен целому количеству минут. Например, я ввёл 50 для часовок вместо 60. Ну... типа промахнулся. Так вот оказывается, функция iRSI() для неправильного таймфрейма возвращает ноль. Про другие функции ничего не скажу, ибо не проверял. И чтобы избежать досадных недоразумений из-за своих же ошибок по невнимательности, я написал эту функцию, как элементарную защиту от "дурака". Она выполняет подгонку входного параметра под "ближайший" подходящий правильный таймфрейм и возвращает его значение.
Функция DateBeginQuarter().
Эта функция возвращает дату начала квартала по его номеру. Например, если сейчас 27.08.2008, то датой начала текущего квартала будет 01.07.2008. Функция принимает только один параметр - номер квартала относительно текущего. Например, 0 - текущий квартал, 1 - следующий, а -1 - предыдущий. То есть положительные номера кварталов запросят даты из будущего, а нулевой и отрицательные из прошлого. Возвращаемое значение - количество секунд, прошедшее с 00:00 1 января 1970 года.
Функция DateOfMonday().
Эта функция возвращает дату начала недели (дату понедельника) по её номеру. Например, если сейчас 29.08.2008, то датой начала текущей недели будет 25.08.2008. Функция принимает только один параметр - номер недели относительно текущей. Например, 0 - текущая неделя, 1 - следующая, а -1 - предыдущая. То есть положительные номера недель запросят даты из будущего, а нулевой и отрицательные из прошлого. Возвращаемое значение - количество секунд, прошедшее с 00:00 1 января 1970 года.
Функция Fibonacci().
Эта функция возвращает элемент ряда Фибоначчи по его порядковому номеру.
Функция GetNameMA().
Эта функция возвращает наименование метода МА (Moving Averages) по его идентификатору. Данную функцию удобно использовать в комментариях, сообщениях индикаторов, советников.
Функция GetPriceDiffInPoint().
Эта функция возвращает ценовую разницу между двумя барами, которые задаются их номерами. Целью разработки данной функции было определение величины и направления движения курса. Функция GetPriceDiffInPoint() самостоятельно определяет, какие именно опорные точки (Open или High или Low или Close) баров брать в расчёт. Функция принимает следующие необязательные параметры:
Возвращаемое значение:
Функция GetTypePrice()
Возвращает наименование типа цены. Функция принимает только один необязательный параметр. Допустимые значения: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED. Значение по умолчанию - 0 - PRICE_CLOSE.
Функция ArrayLR().
Эта функция формирует массив значений линейной регрессии. Функция принимает следующие обязательные параметры:
Функция ArrayMo().
Возвращает Моду - максимум кривой плотности распределения. Функция принимает следующие необязательные параметры:
Функция ExistOrdersByPrice().
Возвращает флаг существования ордера по заданной цене установки. True - ордер существует (установлен), False - ордер отсутствует (не установлен). Ограничить перечень проверяемых ордеров можно параметрами функции:
Функция ClosePosBySelect() для тестера.
Выполняет закрытие одной предварительно выбранной позиции. Это облегчённый вариант одноимённой функции, ранее выложенной на странице 13. Ничего лишнего. Никаких наворотов. У меня в практике не было случаев, чтобы в тестере позиция не закрылась. Поэтому в данной функции нет никаких проверок. В тестере они излишни.
Функция CountOrders() для тестера.
В моих тестовых (предназначенных для использования исключительно в тестере МТ4) версиях советников функция CountOrders() заменяет следующие функции: ExistOrders(), ExistPositions(), NumberOfOrders() и NumberOfPositions(). То есть она может дать информацию о существовании позиции или ордера любого типа, а также сведения о количестве торговых операций каждого типа. Подобная замена имеет свои преимущества, которая выражается в однократном на один тик обращении к базе ордеров и получении всей необходимой информации за раз. А вышеупомянутые функции, особенно при использовании в комплексе, каждая самостоятельно работает с одной и той же базой ордеров и поэтому многократно выполняют одни и те же обращения. В итоге функция CountOrders() позволяет на несколько секунд уменьшить время одного прохода, что даёт часы экономии при оптимизациях.
Функция CountOrders() принимает следующие параметры:
Функция ModifyOrder() для тестера.
Это облегчённый вариант функции ModifyOrder(), опубликованной на странице 7, и предназначенной для изменения абсолютных ценовых уровней одного предварительно выбранного ордера или позиции.
Функция ModifyOrder() принимает следующие параметры:
Функция IIFc().
Очень удобная функция в плане построения развилок. Если так, то такой цвет. А если не так, то другой цвет. Функция IIFc() принимает три обязательных параметра:
Функция IIFd().
Аналогичное удобство для вещественных чисел. Если так, то такое вещественное число. А если не так, то другое число. Функция IIFd() принимает три обязательных параметра:
Функция IIFi().
Аналогичное удобство для целых чисел. Если так, то такое целое число. А если не так, то другое число. Функция IIFi() принимает три обязательных параметра:
Функция IIFs().
Аналогичное удобство для строк. Если так, то такая строка. А если не так, то другая строка. Функция IIFs() принимает три обязательных параметра:
Функция ExistInHistoryCloseBetween().
Возвращает флаг существования в истории позиции или ордера, закрытой (удалённого) между датами. Функция ExistInHistoryCloseBetween() принимает следующие параметры:
Функция ExistInHistoryOpenBetween().
Возвращает флаг существования в истории позиции или ордера, открытой (установленного) между датами. Функция ExistInHistoryOpenBetween() принимает следующие параметры:
Функция ExistInHistoryToDay().
Возвращает флаг существования в истории позиции или ордера, открытой (установленного) сегодня. Функция ExistInHistoryToDay() принимает следующие параметры:
Функция TakeProfitLastPos().
Данная функция возвращает ценовой уровень TakeProfit последней открытой позиций или -1. Функция TakeProfitLastPos() принимает следующие необязательные параметры: