Только "Полезные функции от KimIV".

 

Все функции взяты из этой ветки - http://forum.mql4.com/ru/11287, в ветке есть подробное описание каждой функции и примеры их использования

Содержание

Страница №1 SetOrder - Установка ордера. Версия функции для тестов на истории. ExistOrders - Возвращает флаг существования ордеров ExistPositions - Возвращает флаг существования позиций OpenPosition - Открытие позиции. Версия функции для тестов на истории. OpenPosition - Открывает позицию и возвращает её тикет. Для online. Message - Вывод сообщения в коммент и в журнал  GetNameTF - Возвращает наименование таймфрейма GetNameOP - Возвращает наименование торговой операции  ModifyOrder - Модификация одного предварительно выбранного ордера. DeleteOrders - Удаление ордеров. Версия функции для тестов на истории. DeleteOrders - Удаление ордеров . Для online. FindNearFractal - Поиск ближайшего фрактала ExistOrdersByLot - Возвращает флаг существования ордера по размеру лота.  GetLotLastOrder - Возвращает размер лота последнего выставленного ордера или -1 GetOrderOpenPrice - Возвращает цену установки последнего ордера или 0. IndexByTicket - Возвращает индекс ордера или позиции по тикету 
Страница №2
NumberOfOrders - Возвращает количество ордеров.

ClosePosBySelect - Закрывает одну предварительно выбранную позицию.

ClosePosBySizeProfitInCurrency - Закрытие тех позиций, у которых профит в валюте депозита некоторое значение

ClosePosBySizeLossInCurrency - Закрытие тех позиций, у которых убыток в валюте депозита превысил некоторое значение

ClosePositions - Закрытие позиций по рыночной цене

ClosePosFirstProfit - Закрытие позиций по рыночной цене сначала прибыльных

ClosePosWithMaxProfitInCurrency - Закрытие одной позиции с максимальным положительным профитом валюте депозита

DistMarketAndPos - Возвращает расстояние в пунктах между рынком и ближайшей позицией

ExistOPNearMarket - Возвращает флаг существования позиции или ордера около рынка

ExistPosByPrice - Возвращает флаг существования позиций по цене открытия

GetAmountLotFromOpenPos - Возвращает сумму лотов открытых позиций

Страница №3
GetIndexByTicket - Возвращает индекс ордера или позиции по тикету.

Correlation - Возвращает корреляцию двух рядов.

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 - Возвращает номер бара экстремума ЗигЗага по его номеру.

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 - Уравнение прямой. Вычисляет значение Y для X в точке пересечения с прямой.
GetArrowInterval - Возвращает интервал установки сигнальных указателей
GetArrowInterval - Возвращает интервал установки сигнальных указателей
FindNearFractal - Поиск ближайшего фрактала. Возвращает ценовой уровень.
GetExtremumZZBar - Возвращает номер бара экстремума ЗигЗага по его номеру.
GetExtremumZZPrice - Возвращает экстремум ЗигЗага по его номеру.

GetFractalBar - Возвращает номер бара фрактала по его номеру.

GetNearestDownFractal - Возвращает ценовой уровень ближайшего нижнего фрактала

GetNearestUpFractal - Возвращает ближайший верхний фрактал


Страница №7
CorrectTF - Корректирует таймфрейм под ближайший поддерживаемый МТ4.
DateBeginQuarter - Возвращает дату начала квартала
DateOfMonday - Возвращает дату понедельника по номеру недели

Fibonacci - Возвращает элемент ряда Фибоначчи по его порядковому номеру.
GetNameMA - Возвращает наименование метода МА.
GetPriceDiffInPoint - Возвращает ценовую разницу в пунктах между двумя барами.

GetTypePrice - Возвращает наименование типа цены.
ArrayLR - Формирует массив значений линейной регрессии.
ArrayMo - Возвращает Моду - максимум кривой плотности распределения.

ExistOrdersByPrice - Возвращает флаг существования ордеров по цене установки

ClosePosBySelect - Закрытие одной предварительно выбранной позиции
CountOrders - Рассчитывает количество ордеров по типам.
ModifyOrder - Модификация ордера. Версия функции для тестов на истории.

IIFc - Возвращает одно из двух значений в зависимости от условия.

IIFd - Возвращает одно из двух значений в зависимости от условия.
IIFi - Возвращает одно из двух значений взависимости от условия.
IIFs - Возвращает одно из двух значений взависимости от условия.
ExistInHistoryCloseBetween - Возвращает флаг существования в истории позиции или ордера, закрытой (удалённого) между датами.

ExistInHistoryOpenBetween - Возвращает флаг существования в истории позиции или ордера, открытой (установленного) между датами.

ExistInHistoryToDay - Возвращает флаг наличия ордера или позиции в истории за сегодня

TakeProfitLastPos - Возвращает цену TakeProfit последней открытой позиций или -1.

Страница №8
TakeProfitLastClosePos - Возвращает цену TakeProfit последней закрытой позиций или -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 - Добавляет к строке S столько лидирующих нулей "0", чтобы длина строки 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 - Накладывает ограничение на тип позиции (Buy/Sell). По умолчанию ограничение отсутствует, то есть проверяется наличие позиции любого типа. Допустимые значения параметра -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() для online.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 предназначена для изменения одного или нескольких ценовых уровней одного предварительно выбранного ордера. Здесь под ордером понимается как отложенный ордер Limit или Stop, так и рыночный ордер Buy или Sell, то есть позиция. У позиции с помощью функции ModifyOrder можно изменить два ценовых уровня StopLoss и TakeProfit, а у отложенного ордера дополнительно к этим ещё и цену установки 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 - означает любой магик.


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. 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 - любой магик.
  • 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 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
Причина обращения: