Funciones útiles de KimIV - página 21

 

La función isCloseLastPosByStop().

Esta función devuelve una bandera para cerrar la última posición por parada. La bandera está levantada - Verdadero - El StopLoss se ha activado. Bandera bajada - Falso - la posición ha sido cerrada por otra razón. La selección más precisa de las posiciones a tener en cuenta se establece mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto "" significa cualquier instrumento de mercado. NULL significa el instrumento actual.
  • op - Operación comercial, tipo de posición. Valores válidos: OP_BUY, OP_SELL o -1. El valor por defecto -1 significa cualquier posición.
  • mn - Identificador de posición, MagicNumber. El valor por defecto -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
P.D. Se adjunta un script para probar la función isCloseLastPosByStop().
Archivos adjuntos:
 
Lukyanov:
KimIV:

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) {
//-- skip --
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip -- 
Enchufado la función OpenPosition() en EA en real, error 4059, cambió NULL a Symbol(), desapareció, luego apareció el mensaje
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: experto detenido
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: las llamadas a funciones expertas no están permitidas; 'stdlib'-'ErrorDescription'
De vuelta a la línea de base, todo funciona... (stdlib.mqh && stderror.mqh están en la carpeta de inclusión de la entrega de la MT base)
 
teraptor2 писал (а):
He conectado la función OpenPosition() en mi Asesor Experto en el real, el error 4059

El error 4059 significa que la función no está disponible en el modo de prueba. El identificador de error es ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. Las siguientes funciones generan el error: MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.

teraptor2 escribió (a):
cambió NULL por Symbol(), desapareció, luego apareció un mensaje
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: experto detenido
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: las llamadas a funciones expertas no están permitidas; 'stdlib'-'ErrorDescription'
 

La función isCloseLastPosByTake().

Esta función devuelve una bandera para cerrar la última posición en Take Profit. La bandera está levantada - Verdadero - El TakeProfit se ha activado. Bandera bajada - Falso - la posición se cerró debido a otra razón. Una selección más precisa de las posiciones a considerar se especifica mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si especifica este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto "" significa cualquier instrumento de mercado. NULL significa el instrumento actual.
  • op - Operación comercial, tipo de posición. Valores válidos: OP_BUY, OP_SELL o -1. El valor por defecto -1 significa cualquier posición.
  • mn - Identificador de posición, MagicNumber. El valor por defecto -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
HH. Se adjunta un script para probar la función isCloseLastPosByTake().
Archivos adjuntos:
 

La función isLossLastPos().

Esta función devuelve el indicador de pérdida de la última posición cerrada. Bandera arriba - Verdadero - la última posición se cerró con pérdidas. Banderas abajo - Falso - la última posición se cerró a cero, o con beneficio. Esta función no tiene en cuenta los intercambios y las comisiones. La selección de las posiciones se define mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si especifica este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto "" significa cualquier instrumento de mercado. NULL significa el instrumento actual.
  • op - Operación comercial, tipo de posición. Valores válidos: OP_BUY, OP_SELL o -1. El valor por defecto -1 significa cualquier posición.
  • mn - Identificador de posición, MagicNumber. El valor por defecto -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
P.D. Se adjunta un script para probar la función isLossLastPos().
Archivos adjuntos:
 

La función isTradeToDay().

Esta función devuelve el indicador de comercio de hoy. La bandera está levantada - Cierto - hoy había posiciones abiertas. Bandera abajo - Falso - ninguna posición abierta hoy. La selección de las posiciones a tener en cuenta se establece mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto "" significa cualquier instrumento de mercado. NULL significa el instrumento actual.
  • op - Operación comercial, tipo de posición. Valores válidos: OP_BUY, OP_SELL o -1. El valor por defecto -1 significa cualquier posición.
  • mn - Identificador de posición, MagicNumber. El valor por defecto -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  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 (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
ZZY. Se adjunta un script para probar la función isTradeToDay().
Archivos adjuntos:
 
KimIV:

La función isCloseLastPosByStop().

Esta función devuelve una bandera para cerrar la última posición por parada. La bandera está levantada - Verdadero - El StopLoss se ha activado. Bandera bajada - Falso - la posición ha sido cerrada por otra razón. La selección más precisa de las posiciones a tener en cuenta se establece mediante parámetros externos:

().

Por la tarde . Al implementar el código con esta función, han aparecido algunas confusiones. He aplicado esta función así:

if (isCloseLastPosByStop(NULL,OP_BUY, MagicLong1))               {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
  for ( int rb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- )                {       
      if (OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES))                 { 
      //выбираем среди открытых и отложенных ордеров          
      if( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1))  {
         //закрываем все остальные позиции BUY
        OrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black );
       OrderDelete(OrderTicket());// и удаляем BUY-отложки   
        //  return(0); // выходим     
        }}}}

Hasta aquí todo funciona bien. Se cierran todas las posiciones de COMPRA y se borran las posiciones de VENTA, tal y como lo he definido. Pero entonces el Asesor Experto reajusta las órdenes pendientes según sus señales de entrada. Como era de esperar.

Pero esos pedidos se borran al instante. Al parecer, la bandera sigue colgada allí. Pero, ¿por qué está colgado? ¡Las últimas posiciones no han sido cerradas por un Stop Loss sino por la fuerza!

¿Cómo debo afrontar esta situación? ¿Cómo puedo conseguir que mi Asesor Experto muestre sus próximas órdenes normalmente después de que se ejecute el comando para cerrar este algoritmo?

 
rid писал (а):
¿Qué debo hacer en esta situación? ¿Para que el EA pueda colocar sus próximas órdenes normalmente después de la orden de cierre?

Esta cuestión debe abordarse en el contexto de toda la tarea, porque no se trata de una sola acción, sino de una interacción, y en un orden determinado. Por lo tanto, describa la tarea en su totalidad. No necesitas un código. Sólo hay que describir la tarea con palabras.

Pregunta de calentamiento. ¿Por qué hay que borrar los pedidos y volver a ponerlos? Creo que es preferible modificar.

 

Mis órdenes y posiciones se agrupan en matrices según los beneficios, las pérdidas, las órdenes de parada y límite, y otros motivos.

En este caso particular, estoy cerrando el conjunto de posiciones de COMPRA que han sido abiertas usando órdenes de stop y han acumulado un beneficio específico. Y borro todas las demás órdenes de stop que no han funcionado.

//---------------------------------------------------------------------------------------------

 

Ahora he puesto una función de comentario - Comentario (isCloseLastPosByStop());

Mirando. Inicialmente, la función =0. ¡Después del primer cierre de un Stop Loss Comentario (isCloseLastPosByStop()); cambia a uno, y luego - después del cierre forzado de otras posiciones, no vuelve a cero, sino que continúa siendo uno!