只有“KimIV 的有用功能”。

 

所有函数均取自该线程-h ttp://forum.mql4.com/ru/11287 ,该线程包含每个函数的详细描述及其使用示例

内容

第 1 页SetOrder - 订单设置。回测的函数版本。 ExistOrders - 返回订单存在的标志ExistPositions - 返回仓位存在的标志OpenPosition - 开仓。回测的函数版本。 OpenPosition - 开仓并返还其票证。对于在线. Message - 在评论和日志中显示消息GetNameTF - 返回时间帧的名称 GetNameOP - 返回交易操作的名称ModifyOrder - 修改一个预选订单。 DeleteOrders - 删除订单。回测的函数版本。 DeleteOrders - 删除订单。对于在线. FindNearFractal - 搜索最近的分形ExistOrdersByLot - 按手数返回订单存在的标志。 GetLotLastOrder - 返回最后一个订单的手数,或 -1 GetOrderOpenPrice - 返回最后一个订单的价格,或 0。 IndexByTicket - 返回订单或订单位置的索引
第2页
NumberOfOrders - 返回订单数量。

ClosePosBySelect - 关闭一个预先选定的仓位。

ClosePosBySizeProfitInCurrency - 关闭那些以一定价值的存款货币获利的头寸

ClosePosBySizeLossInCurrency - 关闭那些存款货币损失超过一定值的头寸

ClosePositions - 以市场价格平仓

ClosePosFirstProfit - 以市场价格平仓首先获利

ClosePosWithMaxProfitInCurrency - 以存款货币的最大正利润平仓

DistMarketAndPos- 返回市场与最近头寸之间的距离(以点为单位)

ExistOPNearMarket - 返回市场附近是否存在仓位或订单的标志

ExistPosByPrice - 返回以开盘价存在头寸的标志

GetAmountLotFromOpenPos - 返回未平仓头寸的手数

第 3 页
GetIndexByTicket - 按单据返回订单或仓位的索引。

相关性 - 返回两个系列的相关性。

GetIndexLastPos - 返回最后一个未平仓头寸的索引或 -1

GetLotLastPos - 返回最后一个未平仓头寸的手数或 -1

GetMaxLotFromOpenPos - 返回未平仓头寸的最大手数

GetMinLotFromOpenPos - 返回未平仓头寸的最小手数

NumberOfPositions - 返回位置数。

GetProfitFromDateInCurrency - 返回自特定日期以来平仓的存款货币的总利润

GetProfitOpenPosInCurrency - 以存款货币返回未平仓头寸的总利润

GetProfitOpenPosInPoint - 返回未平仓头寸的总利润(以点为单位)

GetTicketLastPos - 返回最后一个开仓的票或 -1

第 4 页
GetTypeLastClosePos - 返回最后平仓的类型或 -1

GetTypeLastOpenPos - 返回最后开仓的类型或 -1

isCloseLastPosByStop - 返回通过停止关闭最后一个头寸的标志

isCloseLastPosByTake - 返回最后一个持仓平仓的标志。

isLossLastPos - 返回最后一个位置的损失标志。

isTradeToDay - 返回今天的交易标志

NumberOfBarCloseLastPos - 返回最后一个位置的收盘柱数或 -1。

NumberOfBarOpenLastPos - 返回最后一个开仓柱的编号或 -1。

NumberOfLossPosToday - 返回今天平仓的亏损头寸数量。

PriceCloseLastPos - 返回最后平仓的收盘价。


第 5 页
PriceOpenLastPos - 返回最后一个未平仓头寸的开盘价。

PriceOpenLastClosePos - 返回最后平仓的开盘价。

PriceOpenNearPos - 返回最近头寸的开盘价。

TicketNearPos - 以开盘价返回离市场最近仓位的票。

TypeNearPos - 返回最接近市场的仓位类型,或 -1。

TimeOpenLastPos - 返回最后一个开仓的开仓时间。

BubbleSort - 对数组元素执行冒泡排序。

BarsBetweenLastFractals - 返回最后两个分形之间的柱数。

SecondsAfterCloseLastPos - 返回最后一个头寸关闭后的秒数。

SecondsAfterOpenLastPos - 返回上一个仓位开仓后的秒数。

DeleteOppositeOrders - 删除相反的订单位置

ArraySearchDouble - 按值搜索数组中的元素并返回找到的元素的索引,或 -1

ArraySearchInt - 按值搜索数组中的元素并返回找到的元素的索引,或 -1。

ArraySearchString - 按值搜索数组元素并返回找到的元素的索引,或 -1

GetLotLastClosePos - 返回最后平仓的手数或 -1

ArrayMax - 返回数组中最大元素的值。


第 6 页
ArrayMin - 返回数组中最小元素的值

GetExtremumZZBar - 按其编号返回 ZigZag 极值柱数。

ArrayAvg - 返回数组元素的算术平均值。

ArrayAvGeom - 返回数组元素的几何平均值。

SetHLine - 将 OBJ_HLINE 对象设置为水平线
SetVLine - 将 OBJ_VLINE 对象设置为垂直线
SetTLine - 将 OBJ_TREND 对象设置为趋势线

SetTLineByAngle - 按角度设置趋势线的 OBJ_TRENDBYANGLE 对象

SetArrow - 设置图表上的图标,OBJ_ARROW 对象。

SetLabel - 设置一个文本标签,一个 OBJ_LABEL 对象。

CrossPointOfLines - 计算两条线的交点坐标。每条线由其点的一对坐标给出。

SetRegression - 将 OBJ_REGRESSION 对象设置为线性回归通道。

EquationDirect - 直线方程。计算 X 在与线的交点处的 Y 值。
GetArrowInterval - 返回设置信号指针的间隔
GetArrowInterval - 返回设置信号指针的间隔
FindNearFractal - 寻找最近的分形。返回价格水平。
GetExtremumZZBar - 按其编号返回 ZigZag 极值柱数。
GetExtremumZZPrice - 按其数量返回 ZigZag 极值。

GetFractalBar - 按其编号返回分形柱编号。

GetNearestDownFractal - 返回最近的向下分形的价格水平

GetNearestUpFractal - 返回最近的向上分形


第 7 页
CorrectTF - 将时间范围更正到最接近的受支持的 MT4。
DateBeginQuarter - 返回季度的开始日期
DateOfMonday - 按周数返回星期一的日期

斐波那契 - 按其序数返回斐波那契数列的元素。
GetNameMA - 返回 MA 方法的名称。
GetPriceDiffInPoint - 返回两个柱之间的价格差。

GetTypePrice - 返回价格类型名称。
ArrayLR - 生成线性回归值数组。
ArrayMo - 返回模式 - 分布密度曲线的最大值。

ExistOrdersByPrice - 返回以设定价格存在订单的标志

ClosePosBySelect - 关闭一个预先选择的仓位
CountOrders - 按类型计算订单数量。
ModifyOrder - 订单修改。回测的函数版本。

IIFc - 根据条件返回两个值之一。

IIFd - 根据条件返回两个值之一。
IIFi - 根据条件返回两个值之一。
IIFs - 根据条件返回两个值之一。
ExistInHistoryCloseBetween - 返回在日期之间关闭(删除)的仓位或订单历史记录中的存在标志。

ExistInHistoryOpenBetween - 返回在日期之间打开(设置)的仓位或订单历史中存在的标志。

ExistInHistoryToDay - 返回今天历史记录中存在订单或头寸的标志

TakeProfitLastPos - 返回最后一个未平仓头寸的止盈价格或 -1。

第 8 页
TakeProfitLastClosePos - 返回最后平仓的获利价格或 -1。

MovingInWL - 将止损位移动到盈亏平衡点

SimpleTrailing - 使用简单的拖网跟踪位置

ArrayZ - 返回数字系列的 Z 分数。
ArrayDeleteInt - 删除给定索引处的数组元素。返回新数组的大小,如果不能删除任何内容,则返回 -1。
ArrayDeleteDouble - 删除给定索引处的数组元素。返回新数组的大小,
如果不能删除任何内容,则返回 -1。
ArrayDeleteString - 删除给定索引处的数组元素。返回新数组的大小,或 -1,
如果什么都不能被删除。
ArrayInsertDouble - 在给定索引处插入一个数组元素。返回新数组的大小。
BubbleSort2 - 对二维数组的元素执行冒泡排序。
GetTypeLastDeleted - 返回最后删除订单的类型或 -1
iBarLargest - 返回最大柱的索引,或 -1。
iBarOfDayCalc - 返回从当天开始计算的柱数。条形编号从 1(一)开始
iBarOfDayReal - 返回一天开始时柱的实数。
NameDayOfWeek - 返回星期几的名称
NormalizeLot - 返回交易手数的标准化值。
NormalizePrice - 返回标准化为刻度大小的价格值。
WeekOfMonth - 返回给定日期的月份的周数
ClosePosBySortLots - 按手数按排序顺序平仓。
AddLeadingZero - 将足够多的前导零“0”添加到字符串 S 以使字符串 S 等于长度 K。

toTime - 将两个/三个整数转换为时间格式的字符串

第 9 页
StringLower - 返回一个小写字符串

StringUpper - 以大写形式返回字符串

StringToArrayDouble - 将实数从字符串传输到数组

StringToArrayInt - 将整数值从字符串传输到数组

StrSplit - 将字符串拆分为元素数组

StrTran - 子串替换

MovingInWL - 将止损位移动到盈亏平衡点

isTradeTimeString - 返回时间交易启用标志。

isTradeTimeInt - 返回时间交易许可标志。


此外:
一个档案中的所有功能。
所有函数都采用链接库的形式。


 //+----------------------------------------------------------------------------+ //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   | //+----------------------------------------------------------------------------+ //|  Версия  : 13.06.2007                                                      | //|  Описание : Установка ордера. Версия функции для тестов на истории.        | //+----------------------------------------------------------------------------+ //|  Параметры:                                                                | //|    sy - наименование инструмента   (NULL или "" - текущий символ)          | //|    op - операция                                                           | //|    ll - лот                                                                | //|    pp - цена                                                               | //|    sl - уровень стоп                                                       | //|    tp - уровень тейк                                                       | //|    mn - Magic Number                                                       | //|    ex - Срок истечения                                                     | //+----------------------------------------------------------------------------+ void SetOrder( string sy, int op, double ll, double pp,                double sl= 0 , double tp= 0 , int mn= 0 , datetime ex= 0 ) {    color clOpen;    int    err, ticket;      if (sy== "" || sy== "0" ) sy= Symbol ();    if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;   ticket= OrderSend (sy, op, ll, pp, Slippage, sl, tp, "" , mn, ex, clOpen);    if (ticket< 0 ) {     err= GetLastError ();      Print ( "Error(" ,err, ") set " ,GetNameOP(op), ": " ,ErrorDescription(err));      Print ( "Ask=" ,Ask, " Bid=" ,Bid, " sy=" ,sy, " ll=" ,ll,            " pp=" ,pp, " sl=" ,sl, " tp=" ,tp, " mn=" ,mn);   } } //+----------------------------------------------------------------------------+

ExistOrders() 函数。

返回订单存在标志。它将回答是否设置了订单的问题。使用此功能,您可以请求任何订单,以及更具体的订单。请求过滤器使用函数参数配置:

  • sy - 对工具的名称施加限制。默认情况下,参数为“”——没有限制,即任何工具。如果您传递 NULL,则订单的选择将仅限于当前工具。
  • op - 对订单类型设置限制。默认情况下,没有任何限制,即检查是否存在任何类型的订单。有效参数值为-1、OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP。
  • mn - 对订单的识别(“魔术”)编号施加限制。默认情况下,没有限制,即检查是否存在具有任何幻数的订单。
  • ot - 限制下单时间。检查。以便下单晚于该参数的值。默认情况下,没有限制,即检查是否存在任何设置时间的订单。
 //+----------------------------------------------------------------------------+ //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   | //+----------------------------------------------------------------------------+ //|  Версия   : 12.03.2008                                                     | //|  Описание : Возвращает флаг существования ордеров.                         | //+----------------------------------------------------------------------------+ //|  Параметры:                                                                | //|    sy - наименование инструмента   (""   - любой символ,                   | //|                                     NULL - текущий символ)                 | //|    op - операция                   (-1   - любой ордер)                    | //|    mn - MagicNumber                (-1   - любой магик)                    | //|    ot - время открытия             ( 0   - любое время установки)          | //+----------------------------------------------------------------------------+ bool ExistOrders( string sy= "" , int op=- 1 , int mn=- 1 , datetime ot= 0 ) {    int i, k= OrdersTotal (), ty;      if (sy== "0" ) sy= Symbol ();    for (i= 0 ; i<k; i++) {      if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {       ty=OrderType();        if (ty> 1 && ty< 6 ) {          if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || ty==op)) {            if (mn< 0 || OrderMagicNumber()==mn) {              if (ot<=OrderOpenTime()) return (True);           }         }       }     }   }    return (False); }
Полезные функции от KimIV
Полезные функции от KimIV
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 

ExistPositions()函数。

旨在检查未完成的购买或销售。类似于ExistOrders 函数。默认情况下,它检查所有位置:当前和其他工具。你可以用过滤器的组合来细化选择--功能参数。

  • sy- 对文书的名称施加限制。默认参数是"" - 不受限制,即任何乐器。如果你通过NULL,位置选择将被限制在当前仪器上。
  • op- 对头寸类型(买入/卖出)进行限制。默认情况下,没有任何约束,也就是说,任何位置类型都可以检查。这个参数的有效值是-1,OP_BUY和OP_SELL。
  • mn- 对职位的识别("魔法")号码施加限制。默认情况下,没有任何约束,也就是说,具有任何神奇数字的位置都被检查。
  • ot- 对职位开放时间 进行限制。它检查仓位的打开时间是否会晚于这个参数的值。默认情况下,没有任何约束,也就是说,有任何开放时间的职位都被选中。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  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 (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

测试器的OpenPosition()函数。


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Открытие позиции. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color  clOpen;
  double pp;
  int    err, ticket;
 
  if (sy=="") sy=Symbol();
  if (op==OP_BUY) {
    pp=MarketInfo(sy, MODE_ASK); clOpen=clOpenBuy;
  } else {
    pp=MarketInfo(sy, MODE_BID); clOpen=clOpenSell;
  }
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, 0, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") open ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
 

OpenPosition()函数用于在线。


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}
 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
} 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование таймфрейма                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  switch (TimeFrame) {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("Daily");
    case PERIOD_W1:  return("Weekly");
    case PERIOD_MN1: return("Monthly");
    default:         return("UnknownPeriod");
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("Buy Limit");
    case OP_SELLLIMIT: return("Sell Limit");
    case OP_BUYSTOP  : return("Buy Stop");
    case OP_SELLSTOP : return("Sell Stop");
    default          : return("Unknown Operation");
  }
}
 

ModifyOrder()函数。

ModifyOrder 函数是为了改变一个预选订单的一个或多个价格水平。在这里,挂单 被理解为限价 止损 ,以及市场买入卖出 单,即一个头寸。使用ModifyOrder 函数,你可以修改仓位的StopLossTakeProfit 两个价位,而对于挂单,OpenPrice 的设置价格也可以被改变。修改后的价格水平被作为参数传递给ModifyOrder 函数。如果任何一个参数为负数,相应的价格水平将不会被改变。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  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);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
 

DeleteOrders()函数。测试者版本。

函数DeleteOrders()旨在删除挂单 BuyLimit, BuyStop, SellLimit 和 SellStop。DeleteOrders()函数是通用的,即它可以用来删除所有存在的挂单,以及符合函数参数设置的选择条件的特定挂单。

sy- 仪器的名称。由于只有当前的符号可以在策略测试器中进行交易,这个参数与策略测试器版本无关,只是为了与本功能的在线版本兼容而需要。在测试器中最好使用""或NULL的值。默认值""表示任何符号。
op
- 交易操作的类型,挂单的类型。五个值中有一个是可能的。-1,OP_BUYLIMIT,OP_BUYSTOP,OP_SELLLIMIT或OP_SELLSTOP。默认值为-1意味着任何顺序。

mn- MagicNumber,待定订单的识别号码。默认值-1表示任何MagicNumber。


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 13.06.2007                                                      |
//| Описание : Удаление ордеров. Версия функции для тестов на истории.         |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//| sy - наименование инструмента   (NULL - текущий символ)                    |
//| op - операция                   ( -1  - любой ордер)                       |
//| mn - MagicNumber                ( -1  - любой магик)                       |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ot;
 
  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
        if (OrderSymbol()==sy && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            OrderDelete(OrderTicket(), clDelete);
          }
        }
      }
    }
  }
}
 

DeleteOrders()函数。在线版本。


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 28.11.2006                                                      |
//| Описание : Удаление ордеров                                                |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента   ( ""  - любой символ,                    |
//|                                    NULL - текущий символ)                  |
//|   op - операция                   (  -1 - любой ордер)                     |
//|   mn - MagicNumber                (  -1 - любой магик)                     |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int err, i, it, k=OrdersTotal(), ot;
  
  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            for (it=1; it<=NumberOfTry; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),
                      ": ",ErrorDescription(err),", try ",it);
                Sleep(1000*5);
              }
            }
          }
        }
      }
    }
  }
}
 
//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

函数ExistOrdersByLot()。

返回一个标志,表明存在一个具有指定手数的订单。True- 秩序存在(已设定),False- 秩序不存在(未设定)。你可以用函数参数限制要检查的订单列表。

  • sy- 仪器的名称。如果你设置了这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 操作,待定订单 的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP-1。默认值为-1 表示任何订单类型。
  • mn- 订单标识符(MagicNumber)。默认值为-1 意味着任何MagicNumber。
  • lo- 地段的大小,精确度为小数点后两位。默认值是0- 任何批次的大小。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

GetLotLastOrder()函数。

返回最后下单的手数或-1。你可以用函数参数限制要检查的订单列表。

  • sy- 仪器的名称。如果给出这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,""(默认)表示任何仪器。
  • op- 操作,待定订单 的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP-1。默认值为-1 意味着任何顺序。
  • mn- 订单标识符(MagicNumber)。默认值-1 表示任何MagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-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()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

GetOrderOpenPrice()函数。

返回最后打开的订单的设置价格或0。你可以用函数参数限制要检查的订单列表。

  • sy- 仪器的名称。如果给出这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,""(默认)表示任何仪器。
  • op- 操作,待定订单 的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP-1。默认值为-1 表示任何顺序。
  • mn- 订单标识符(MagicNumber)。默认值-1 表示任何MagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  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()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

IndexByTicket()函数。

返回票据上的订单或头寸的索引(在已设订单或未结头寸的总列表中的序号)。如果IndexByTicket() 不能找到一个具有所需票据的订单或头寸,它将返回-1。我们可以用函数参数限制要检查的订单或头寸的列表。

  • sy- 仪器的名称。如果你指定这个参数,函数将只检查指定工具的订单和头寸。NULL 表示当前的仪器,""(默认)表示任何仪器。
  • op-交易操作,挂单或头寸的类型。有效值:OP_BUY,OP_BUYLIMIT,OP_BUYSTOP,OP_SELL,OP_SELLLIMIT,OP_SELLSTOP-1。默认值为-1,表示任何顺序或位置。
  • mn- 一个订单或头寸的标识符(MagicNumber)。默认值-1 表示任何MagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-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=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
原因: