//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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()]++;
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 18.07.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+color IIFc(bool condition, color ifTrue, color ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+double IIFd(bool condition, double ifTrue, double ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+int IIFi(bool condition, int ifTrue, int ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+string IIFs(bool condition, string ifTrue, string ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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()函数。
我在发现有时可以很容易地在指标 或EA的输入参数 中指定一个不正确的时间框架,即等于整数分钟后,写了这个函数。例如,我输入的小时数是50,而不是60。嗯...样的错过。事实证明,iRSI()函数对一个不正确的时间框架返回零。我不能对其他功能说什么,因为我没有检查它们。为了避免因我自己不注意而产生的误解,我把这个函数写成一个原始的傻瓜式的函数。它将输入参数调整到最接近的适当的时间范围,并返回其值。
函数DateBeginQuarter()。
该函数按编号返回该季度的开始日期。例如,如果现在是2008年8月27日,那么本季度的开始日期将是2008年7月1日。该函数只需要一个参数--相对于当前季度的季度号。例如,0 是本季度,1 是下一季度,-1 是上一季度。也就是说,正的季度数字将要求从未来的日期,而零和负的将要求从过去的日期。返回的值是自1970年1月1日00:00起经过的秒数。
DateOfMonday()函数。
该函数通过数字返回一周的开始日期(周一)。例如,如果现在是2008年8月29日,本周开始的日期将是2008年8月25日。该函数只需要一个参数--相对于当前星期的星期数。例如,0 是本周,1 是下周,-1 是上周。也就是说,正的周数将要求从未来的日期,而零和负数将要求从过去的日期。返回值是自1970年1月1日00:00起经过的秒数。
函数Fibonacci()。
这个函数通过序列号返回斐波那契数列的一个元素。
GetNameMA()函数。
该函数通过标识符返回MA方法的名称(移动平均线)。这个功能方便在评论、指标和专家顾问信息中使用。
GetPriceDiffInPoint()函数。
该函数返回两个条形图之间的价格差异,这些条形图由其数字指定。开发这个功能的目的是为了确定价格运动的价值和方向。GetPriceDiffInPoint()函数决定要考虑的条形图的参考点(开盘或最高价或最低价或收盘价)。该函数接受以下可选参数。
返回的值。
GetTypePrice()函数
返回价格类型的名称。该函数只接受一个可选参数。有效值:PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED。 默认值是0 - PRICE_CLOSE。
ArrayLR()函数。
该函数生成一个线性回归值的数组。该函数接受以下强制性参数。
ArrayMo()函数。
返回Modu - 分布密度曲线的最大值。该函数接受以下可选参数。
函数ExistOrdersByPrice()。
返回一个标志,表明在给定的设定价格下存在一个订单。真- 秩序存在(设定),假- 秩序不存在(未设定)。你可以用函数参数限制要检查的订单列表。
测试员的ClosePosBySelect()函数。
执行单一预选位置的关闭。这是先前在第13页 描述的同名函数的简化版本。 没有多余的东西。没有额外的功能。在我的实践中,我从来没有遇到过在测试器中没有关闭的位置。这就是为什么这个函数中没有检查。它们在测试器中是不必要的。
测试员的CountOrders()函数。
在我的测试版本中(专门用于MT4的测试器),函数CountOrders() 取代了以下函数:ExistOrders(),ExistPositions(),NumberOfOrders() 和NumberOfPositions()。 因此,它可以提供关于任何头寸或订单的存在以及每种类型交易量的信息。这样的交易所有其自身的优势,表现在一次性参考一个tick的订单基础,并一次性获得所有必要的信息。而上述函数,特别是在一起使用时,它们中的每一个都是独立地与一个相同的订单基数一起工作,所以它们会重复进行相同的调用。因此,CountOrders() 函数可以将一次通过的时间减少几秒钟,从而可以节省几个小时的优化时间。
函数CountOrders()接受以下参数。
测试员的ModifyOrder()函数。
这是第7页 公布的ModifyOrder() 函数的轻量版,用于改变一个预选订单或头寸的绝对价格水平。
ModifyOrder() 函数接受以下参数。
IIFc()函数。
在构建叉子方面是一个非常方便的功能。如果是这样,这个颜色。如果不是,那就换一种颜色。函数IIFc()需要三个强制性参数。
IIFd()函数。
对实数也有类似的便利。如果是这样,它就是一个实数。如果不是这样,那就是另一个数字。IIFd()函数需要三个强制性参数。
IIFi()函数。
对整数也有类似的便利。如果是,就是一个整数。如果不是,则是另一个数字。IIFi()函数需要三个强制性参数。
IIFis()函数。
对字符串有类似的便利。如果是这样,这样的字符串。如果不是,则是另一个字符串。IIFs()函数需要三个强制性参数。
ExistInHistoryCloseBetween()函数。
返回日期之间关闭(删除)的头寸或订单在历史上存在的标志。函数ExistInHistoryCloseBetween()接受以下参数。
函数ExistInHistoryOpenBetween()。
返回日期之间打开(设置)的头寸或订单在历史上存在的标志。函数ExistInHistoryOpenBetween()接收以下参数。
函数ExistInHistoryToDay()。
返回今天打开(设置)的头寸或订单在历史上存在的标志。函数ExistInHistoryToDay() 接收以下参数。
TakeProfitLastPos()函数。
该函数返回最后开仓的TakeProfit 的价格水平或-1。TakeProfitLastPos() 函数接受以下可选参数。