Solo "Características útiles de KimIV".

 

Todas las funciones se toman de este hilo - h ttp://forum.mql4.com/ru/11287 , el hilo contiene una descripción detallada de cada función y ejemplos de su uso

Contenido

 Página #1 SetOrder - Configuración de pedidos. Versión de función para backtests. ExistOrders - Devuelve la bandera de existencia de órdenes ExistPositions - Devuelve la bandera de existencia de posiciones OpenPosition - Apertura de una posición. Versión de función para backtests. OpenPosition: abre una posición y devuelve su ticket. Para en línea . Mensaje: muestra un mensaje en los comentarios y en el registro . GetNameTF: devuelve el nombre del marco de tiempo . GetNameOP: devuelve el nombre de la operación comercial . ModifyOrder: modificación de una orden preseleccionada. DeleteOrders - Eliminar pedidos. Versión de función para backtests. DeleteOrders: elimina pedidos . Para en línea . FindNearFractal: busca el fractal más cercano . ExistOrdersByLot: devuelve el indicador de existencia de una orden por tamaño de lote. GetLotLastOrder: devuelve el tamaño del lote de la última orden realizada, o -1 GetOrderOpenPrice: devuelve el precio de la última orden, o 0. IndexByTicket: devuelve el índice de la orden o posición en el ticket
Página 2
NumberOfOrders: devuelve el número de pedidos.

ClosePosBySelect: cierra una posición preseleccionada.

ClosePosBySizeProfitInCurrency - Cierra aquellas posiciones que tienen una ganancia en la moneda de depósito de un valor determinado

ClosePosBySizeLossInCurrency - Cerrar aquellas posiciones cuya pérdida en la moneda de depósito superó un cierto valor

ClosePositions - Cerrar posiciones a precio de mercado

ClosePosFirstProfit - Cerrar posiciones al precio de mercado primero rentable

ClosePosWithMaxProfitInCurrency - Cierra una posición con la máxima ganancia positiva en la divisa del depósito

DistMarketAndPos- Devuelve la distancia en puntos entre el mercado y la posición más cercana

ExistOPNearMarket: devuelve la bandera de existencia de una posición u orden cerca del mercado

ExistPosByPrice: devuelve el indicador de existencia de posiciones al precio de apertura

GetAmountLotFromOpenPos - Devuelve la cantidad de lotes de posiciones abiertas

Página 3
GetIndexByTicket - Devuelve el índice de la orden o posición por ticket.

Correlación: devuelve la correlación de dos series.

GetIndexLastPos - Devuelve el índice de la última posición abierta o -1

GetLotLastPos: devuelve el tamaño del lote de la última posición abierta o -1

GetMaxLotFromOpenPos: devuelve el tamaño de lote máximo de las posiciones abiertas

GetMinLotFromOpenPos: devuelve el tamaño de lote mínimo de las posiciones abiertas

NumberOfPositions: devuelve el número de posiciones.

GetProfitFromDateInCurrency: devuelve el beneficio total en la moneda de depósito de las posiciones cerradas desde una fecha determinada

GetProfitOpenPosInCurrency: devuelve el beneficio total de las posiciones abiertas en la divisa del depósito

GetProfitOpenPosInPoint: devuelve el beneficio total de las posiciones abiertas en puntos

GetTicketLastPos - Devuelve el ticket de la última posición abierta o -1

Página 4
GetTypeLastClosePos - Devuelve el tipo de la última posición cerrada o -1

GetTypeLastOpenPos: devuelve el tipo de la última posición abierta o -1

isCloseLastPosByStop - Devuelve la bandera para cerrar la última posición por parada

isCloseLastPosByTake: devuelve el indicador para cerrar la última posición por toma.

isLossLastPos: devuelve el indicador de pérdida de la última posición.

isTradeToDay - Devuelve la bandera comercial para hoy

NumberOfBarCloseLastPos - Devuelve el número de la barra de cierre de la última posición o -1.

NumberOfBarOpenLastPos - Devuelve el número de la barra abierta de la última posición o -1.

NumberOfLossPosToday: devuelve el número de posiciones perdedoras cerradas hoy.

PriceCloseLastPos: devuelve el precio de cierre de la última posición cerrada.


Página #5
PriceOpenLastPos: devuelve el precio de apertura de la última posición abierta.

PriceOpenLastClosePos: devuelve el precio de apertura de la última posición cerrada.

PriceOpenNearPos: devuelve el precio de apertura de la posición más cercana.

TicketNearPos - Devuelve el ticket de la posición más cercana al mercado al precio de apertura.

TypeNearPos: devuelve el tipo de posición más cercana al mercado, o -1.

TimeOpenLastPos: devuelve la hora de apertura de la última posición abierta.

BubbleSort: realiza una clasificación de burbujas en los elementos de una matriz.

BarsBetweenLastFractals: devuelve el número de barras entre los dos últimos fractales.

SecondsAfterCloseLastPos: devuelve el número de segundos después de que se cerró la última posición.

SecondsAfterOpenLastPos: devuelve el número de segundos después de que se abrió la última posición.

DeleteOppositeOrders - Elimina la posición de orden opuesta

ArraySearchDouble: busca un elemento en una matriz por valor y devuelve el índice del elemento encontrado, o -1

ArraySearchInt: busca un elemento en una matriz por valor y devuelve el índice del elemento encontrado, o -1.

ArraySearchString: busca un elemento de matriz por valor y devuelve el índice del elemento encontrado, o -1

GetLotLastClosePos: devuelve el tamaño del lote de la última posición cerrada o -1

ArrayMax: devuelve el valor del elemento máximo en una matriz.


Página #6
ArrayMin: devuelve el valor del elemento mínimo en una matriz

GetExtremumZZBar: devuelve el número de la barra del extremo de ZigZag por su número.

ArrayAvg: devuelve la media aritmética de los elementos de la matriz.

ArrayAvGeom: devuelve la media geométrica de los elementos de la matriz.

SetHLine - Establece el objeto OBJ_HLINE en una línea horizontal
SetVLine - Establece el objeto OBJ_VLINE en una línea vertical
SetTLine: establece el objeto OBJ_TREND en la línea de tendencia

SetTLineByAngle - Establecer el objeto OBJ_TRENDBYANGLE de la línea de tendencia por ángulo

SetArrow - Configuración del icono en el gráfico, el objeto OBJ_ARROW.

SetLabel: establece una etiqueta de texto, un objeto OBJ_LABEL.

CrossPointOfLines - Calcula las coordenadas del punto de intersección de dos líneas.Cada línea está dada por un par de coordenadas de sus puntos.

SetRegression: establece el objeto OBJ_REGRESSION en el canal de regresión lineal.

EquationDirect - Ecuación de una línea recta. Calcula el valor de Y para X en el punto de intersección con la línea.
GetArrowInterval: devuelve el intervalo para establecer punteros de señal
GetArrowInterval: devuelve el intervalo para establecer punteros de señal
FindNearFractal - Encontrar el fractal más cercano. Devuelve el nivel de precios.
GetExtremumZZBar: devuelve el número de la barra del extremo de ZigZag por su número.
GetExtremumZZPrice: devuelve el extremo de ZigZag por su número.

GetFractalBar - Devuelve el número de la barra fractal por su número.

GetNearestDownFractal - Devuelve el nivel de precio del fractal descendente más cercano

GetNearestUpFractal - Devuelve el fractal ascendente más cercano


Página #7
CorrectTF: corrige el período de tiempo al MT4 compatible más cercano.
DateBeginQuarter: devuelve la fecha de inicio del trimestre.
DateOfMonday - Devuelve la fecha del lunes por número de semana

Fibonacci - Devuelve el elemento de la serie de Fibonacci por su número ordinal.
GetNameMA: devuelve el nombre del método MA.
GetPriceDiffInPoint: devuelve la diferencia de precio en puntos entre dos barras.

GetTypePrice: devuelve el nombre del tipo de precio.
ArrayLR: genera una matriz de valores de regresión lineal.
ArrayMo : devuelve el modo: el máximo de la curva de densidad de distribución.

ExistOrdersByPrice: devuelve el indicador de existencia de pedidos al precio establecido

ClosePosBySelect - Cerrar una posición preseleccionada
CountOrders - Calcula el número de pedidos por tipo.
ModifyOrder - Modificación del pedido. Versión de función para backtests.

IIFc: devuelve uno de dos valores según la condición.

IIFd: devuelve uno de dos valores según la condición.
IIFi: devuelve uno de dos valores según la condición.
IIF: devuelve uno de dos valores según la condición.
ExistInHistoryCloseBetween: devuelve la bandera de existencia en el historial de una posición u orden cerrada (eliminada) entre fechas.

ExistInHistoryOpenBetween: devuelve la bandera de existencia en el historial de una posición u orden abierta (establecida) entre fechas.

ExistInHistoryToDay: devuelve el indicador de presencia de una orden o posición en el historial para hoy

TakeProfitLastPos: devuelve el precio TakeProfit de la última posición abierta o -1.

Página #8
TakeProfitLastClosePos: devuelve el precio TakeProfit de la última posición cerrada o -1.

MovingInWL - Mover el nivel de parada al punto de equilibrio

SimpleTrailing - Seguimiento de posiciones con una simple red de arrastre

ArrayZ: devuelve la puntuación Z de una serie de números.
ArrayDeleteInt: elimina el elemento de la matriz en el índice dado. Devuelve el tamaño de la nueva matriz, o -1 si no se pudo eliminar nada.
ArrayDeleteDouble: elimina el elemento de la matriz en el índice dado. Devuelve el tamaño de la nueva matriz, o -1
si no se pudo eliminar nada.
ArrayDeleteString: elimina el elemento de la matriz en el índice dado. Devuelve el tamaño de la nueva matriz, o -1,
si no se pudiera quitar nada.
ArrayInsertDouble: inserta un elemento de matriz en el índice dado. Devuelve el tamaño de la nueva matriz.
BubbleSort2: realiza una clasificación de burbujas en los elementos de una matriz bidimensional.
GetTypeLastDeleted: devuelve el tipo del último pedido eliminado o -1
iBarLargest: devuelve el índice de la barra más grande, o -1.
iBarOfDayCalc: devuelve el número de barra calculado desde el comienzo del día. La numeración de barras comienza desde 1 (uno)
iBarOfDayReal - Devuelve el número real de la barra desde el comienzo del día.
NameDayOfWeek - Devuelve el nombre del día de la semana
NormalizeLot: devuelve el valor normalizado del lote negociado.
NormalizePrice: devuelve el valor del precio normalizado al tamaño del tick.
WeekOfMonth: devuelve el número de semana del mes dada la fecha
ClosePosBySortLots: cerrar posiciones en orden de clasificación por tamaño de lote.
AddLeadingZero: agrega suficientes ceros iniciales "0" a la cadena S para hacer que la cadena S sea igual a la longitud K.

toTime - Convierte dos o tres enteros a una cadena en formato de tiempo

Página #9
StringLower - Devuelve una cadena en minúsculas

StringUpper - Devuelve una cadena en MAYÚSCULAS

StringToArrayDouble - Transfiere números reales de una cadena a una matriz

StringToArrayInt - Transfiere valores enteros de una cadena a una matriz

StrSplit - Dividir una cadena en una matriz de elementos

StrTran - Sustitución de subcadena

MovingInWL - Mover el nivel de parada al punto de equilibrio

isTradeTimeString: devuelve el indicador de habilitación de comercio de tiempo.

isTradeTimeInt: devuelve el indicador de permiso de comercio de tiempo.


Además:
Todas las funciones en un archivo.
Todas las funciones están en forma de bibliotecas vinculadas.


 //+----------------------------------------------------------------------------+ //|  Автор    : Ким Игорь В. 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);   } } //+----------------------------------------------------------------------------+

Función ExistOrders().

Devuelve el indicador de existencia del pedido. Responderá a la pregunta de si el orden está establecido o no. Con esta función, puede solicitar cualquier pedido, así como uno más específico. El filtro de solicitud se configura utilizando parámetros de función:

  • sy : impone una restricción en el nombre de la herramienta. De forma predeterminada, el parámetro es "": sin restricciones, es decir, cualquier herramienta. Si pasa NULL, la selección de órdenes se limitará al instrumento actual.
  • op : establece un límite en el tipo de orden. Por defecto no hay restricción, es decir, se comprueba la presencia de una orden de cualquier tipo. Los valores de parámetros válidos son -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT y OP_SELLSTOP.
  • mn - Impone un límite en el número de identificación ("mágico") de la orden. Por defecto no hay restricción, es decir, se comprueba la presencia de una orden con cualquier número mágico.
  • ot - Impone un límite en el tiempo de colocación del pedido. Comprobado. para que el pedido se realice más tarde que el valor de este parámetro. Por defecto no hay límite, es decir, se comprueba la presencia de una orden con cualquier tiempo de fraguado.
 //+----------------------------------------------------------------------------+ //|  Автор    : Ким Игорь В. 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, приводить примеры их использования и отвечать на вопросы, связанн...
 

La función ExistPositions().

Diseñado para comprobar si hay compras o ventas abiertas. Similar a la función ExistOrders. Por defecto, comprueba todas las posiciones: corriente y otros instrumentos. Puede afinar la selección con una combinación de filtros - parámetros de función:

  • sy - Impone una restricción al nombre del instrumento. El parámetro por defecto es "" - sin restricción, es decir, cualquier instrumento. Si pasa NULL, la selección de la posición se limitará al instrumento actual.
  • op - pone una restricción en el tipo de posición (Compra/Venta). Por defecto, no hay ninguna restricción, es decir, se comprueba cualquier tipo de posición. Los valores válidos para este parámetro son -1, OP_BUY y OP_SELL.
  • mn - Aplica la restricción del número de identificación ("mágico") de la posición. Por defecto no hay ninguna restricción, es decir, se comprueba la posición con cualquier número mágico.
  • ot - Aplica la restricción de la hora de apertura de la posición. Comprueba si la posición se abrirá más tarde que el valor de este parámetro. Por defecto, no hay ninguna restricción, es decir, se comprueba la posición con cualquier tiempo abierto.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Función OpenPosition() para el probador.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
  }
}
 

Función OpenPosition() para la conexión.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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");
  }
}
 

Función ModifyOrder().

La función ModificarOrden está diseñada para cambiar uno o más niveles de precios de una orden preseleccionada. Aquí se entiende por orden pendiente una orden de Límite o Stop, así como una orden de Compra o Venta de mercado, es decir, una posición. Con la función ModifyOrder se pueden modificar dos niveles de precio StopLoss y TakeProfit para la posición, mientras que para la orden pendiente se puede cambiar también el precio de ajuste OpenPrice. Los niveles de precios modificados se pasan a la función ModifyOrder como parámetros. Si alguno de los parámetros es negativo, el nivel de precios correspondiente no se modificará.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
      }
    }
  }
}
 

Función DeleteOrders(). Versión de prueba.

La función DeleteOrders() sirve para eliminar las órdenes pendientes BuyLimit, BuyStop, SellLimit y SellStop. La función DeleteOrders() es universal, es decir, puede utilizarse para eliminar todas las órdenes pendientes presentes, así como las específicas que cumplan las condiciones de selección establecidas por los parámetros de la función:

sy - Nombre del instrumento. Dado que sólo se puede negociar el símbolo actual en el Probador de Estrategias, este parámetro no es relevante para la versión del Probador de Estrategias y sólo es necesario para la compatibilidad con la versión en línea de esta función. Es mejor utilizar los valores "" o NULL en el probador. El valor por defecto "" significa cualquier símbolo.
op
- Tipo de operación comercial, tipo de orden pendiente. Es posible uno de los cinco valores: -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT o OP_SELLSTOP. El valor por defecto de -1 significa cualquier orden.

mn - MagicNumber, número de identificación de una orden pendiente. El valor por defecto -1 significa cualquier 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);
          }
        }
      }
    }
  }
}
 

Función DeleteOrders(). Versión en línea.


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. 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);
}

Función ExistOrdersByLot().

Devuelve un indicador de la existencia de una orden con el tamaño de lote especificado. Verdadero - el orden existe (establecido), Falso - el orden no existe (no establecido). Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:

  • sy - Nombre del instrumento. Si establece este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier tipo de orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto de -1 significa cualquier MagicNumber.
  • lo - Tamaño de un lote con una precisión de dos decimales. El valor por defecto es 0 - cualquier tamaño de lote.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Función GetLotLastOrder().

Devuelve el tamaño del lote de la última orden colocada o -1. Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:

  • sy - Nombre del instrumento. Si se da este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa el instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto -1 significa cualquier 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);
}
 

Función GetOrderOpenPrice().

Devuelve el precio de ajuste de la última orden abierta o 0. Puede limitar la lista de órdenes a comprobar con los parámetros de la función:

  • sy - Nombre del instrumento. Si se da este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa el instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto -1 significa cualquier 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);
}
 

La función IndexByTicket().

Devuelve el índice (número ordinal en la lista general de órdenes establecidas o posiciones abiertas) de la orden o posición en el ticket. Si IndexByTicket() no encuentra una orden o posición con el ticket requerido, devolverá -1. Podemos limitar la lista de órdenes o posiciones a comprobar mediante los parámetros de la función:

  • sy - Nombre del instrumento. Si especifica este parámetro, la función sólo comprobará las órdenes y posiciones del instrumento especificado. NULL significa el instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación comercial, tipo de orden pendiente o posición. Valores válidos: OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier orden o posición.
  • mn - Identificador de una orden o posición (MagicNumber). El valor por defecto -1 significa cualquier 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);
}
Razón de la queja: