Funciones útiles de KimIV - página 62

 

Gracias por la respuesta, Igor, ya lo he resuelto. También uso sus funciones por separado, pero quería aprovechar la biblioteca en la etapa de desarrollo de EA.

He mirado cómo está hecha la biblioteca trade_lib&info_lib de komposter y he hecho algunos cambios en la suya para mi propio uso.

1. He eliminado en todas las bibliotecas los enlaces cruzados #property library e #include library, he cambiado el nombre de las bibliotecas para que no se confundan.

2. He hecho un bloque de llamadas directas de todas las bibliotecas.

#include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

Ahora todas las funciones de todas las bibliotecas están disponibles, no hay errores ni mensajes criminales durante la compilación, excepto el normal "no se hace referencia...".

Todos los EA externos están disponibles, sin problemas.

Escribe más, nos conectaremos y usaremos. En primer lugar me gustaría ver la función de arrastre por el beneficio total.

 

La función WeekOfMonth().

Esta función devuelve la semana del mes por fecha. Sólo acepta un parámetro opcional:

  • dt - Fecha, hora. Valor por defecto - 0 - fecha y hora actuales del servidor de comercio.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if ( dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay( dt), nn=1;

  for ( i=2; i<= kd; i++) {
    d=StrToTime(TimeYear( dt)+"."+TimeMonth( dt)+"."+ i);
    if (TimeDayOfWeek( d)==1) nn++;
  }
  return( nn);
}

SZY. Se adjunta un script para probar la función WeekOfMonth().

Archivos adjuntos:
 
Igor, ¿no hay una función que cierre todas las posiciones empezando por las que tienen un lote mayor?
 

Hola, Igor! Muchas gracias por tus útiles funciones! Las estoy utilizando todo lo que puedo! Yo también me he metido en esto hace poco, así que una pregunta para ti... Llevo mucho tiempo usándolas, así que las he usado durante mucho tiempo. Estoy usando su función OpenPosition, ¿quizás está reaccionando a un error o algo así? Aquí está el registro de ayer, ¡todo estaba bien antes de eso! No encuentro el error 220........ en ningún sitio

07:47:28 MetaTrader 4.00 build 220 iniciado (MetaQuotes Software Corp.)
07:47:28 Expert open prob USDJPY EURUSD,M1: cargado con éxito
07:47:32 '1262868': login
07:47:44 '1262868': login
07:49:40 '1262868': login
07:49:46 '1262868': login
07:54:44 '1262868': connect failed [No connection]
11:38:16 Expert open prob USDJPY EURUSD,M1: removed
11:38:18 MetaTrader 4.00 build 220 detenido
14:05:05 MetaTrader 4.00 build 220 iniciado (MetaQuotes Software Corp.)
14:05:05 Experto abierto prob USDJPY EURUSD,M1: cargado con éxito
14:05:10 '1262868': login
14:05:31 '1262868': login
14:06:39 '1262868': login
14:06:46 '1262868': login
15:57:06 '1262868': connect failed [No connection]
18:30:46 Experto abierto prob USDJPY EURUSD,M5: eliminado
18:30:49 Bombeo principal: tiempo de espera en la parada
18:30:52 Bombeo principal: tiempo de espera en la parada
18:30:55 Bombeo principal: tiempo de espera en la parada
18:30:58 Bombeo principal: tiempo de espera en la parada
18:31:01 Bombeo principal: tiempo de espera en la parada
18:31:01 Bombeo principal: terminado
18:31:02 MetaTrader 4.00 build 220 detenido
18:31:02 MetaTrader 4.00 build 220 detenido por cierre del sistema
18:47:57 MetaTrader 4.00 build 220 iniciado (MetaQuotes Software Corp.)
18:47:58 Probador experto abierto USDJPY EURUSD,M5: cargado con éxito
18:48:01 '1262868': conexión fallida [Sin conexión]
18:48:10 '1262868': login
18:48:20 '1262868': login
20:19:00 '1262868': login
20:19:07 '1262868': login
20:20:05 '1262868': login
20:20:13 '1262868': login
20:59:29 '1262868': login
20:59:39 '1262868': login
21:02:16 '1262868': login
21:02:41 '1262868': DataCenter connecting failed [6]
22:08:40 '1262868': ping failed
22:08:43 '1262868': login
22:08:49 '1262868': DataCenter connecting failed [6]
22:1001 '1262868': login
22:10:05 '1262868': DataCenter conectando falló [6]
22:14:59 '1262868': login
22:15:13 '1262868': login
22:15:22 '1262868': DataCenter conectando falló [6]
22:37:16 '1262868': login
22:37:27 '1262868': DataCenter conectando falló [6]
22:4051 '1262868': login
22:41:04 '1262868': DataCenter connecting failed [6]
23:17:14 Expert open prob USDJPY EURUSD,M5: removed
23:17:16 Expert open prob USDJPY EURUSD,M5: loaded successfully
23:25:52 Expert open prob USDJPY EURUSD,M5: removed
23:25:55 MetaTrader 4.00 build 220 detenido
23:25:59 MetaTrader 4.00 build 220 iniciado (MetaQuotes Software Corp.)
23:26:05 '1262868': login
23:26:05 Experto abierto prob USDJPY EURUSD,M5: cargado con éxito
23:26:15 '1262868': login
23:27:19 '1262868': login
23:27:34 '1262868': login
23:28:20 Experto abierto prob USDJPY EURUSD,M5: eliminado
23:28:25 Experto abierto prob USDJPY USDCHF,H4: cargado con éxito
23:28:33 Experto abierto prob USDJPY USDCHF,H4: eliminado

Muchas gracias de antemano.

 
khorosh писал(а) >>
Igor, ¿no hay una función que cierre todas las posiciones empezando por las que tienen un lote mayor?

no fue... escribió...

La función ClosePosBySortLots().

Esta función cierra las posiciones en orden de clasificación por tamaño de lote. Es decir, con esta función se pueden cerrar posiciones en orden ascendente o descendente de los tamaños de los lotes. La función ClosePosBySortLots() acepta los siguientes parámetros opcionales:

  • sy - Nombre del instrumento de negociación. "" - cualquier instrumento, NULL - instrumento actual. El valor por defecto es "".
  • op - Tipo de operación comercial. Valores válidos -1 - cualquier posición, OP_BUY - comprar, OP_SELL - vender. El valor por defecto es -1.
  • mn - MagicNumber, identificador único de la operación comercial. Valor por defecto -1 - cualquier número mágico.
  • sd - Dirección de clasificación del tamaño del lote. Valores válidos MODE_ASCEND - ascendente, MODE_DESCEND - descendente. El valor por defecto es MODE_DESCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd= MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=0;                     // Количество позиций

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()== sy || sy=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p++;
            ArrayResize( a, p);
            a[ p-1][0]=OrderLots();
            a[ p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if ( p>0) {
    ArraySort( a, WHOLE_ARRAY, 0, sd);
    for ( i=0; i< p; i++) {
      if (OrderSelect( a[ i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}

SZY. Se adjunta un script para probar la función ClosePosBySortLots().

Archivos adjuntos:
 

La función AddLeadingZero().

Esta función añade tantos ceros a la izquierda "0" a la cadena para que la longitud de la cadena sea igual a un valor dado. La función AddLeadingZero( ) toma los siguientes parámetros obligatorios:

  • s - La cadena a la que hay que añadir los ceros a la izquierda.
  • k - La longitud de la cadena resultante S.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen( s)< k) s=StringConcatenate("0", s);
  return( s);
}

SZU. Se adjunta un script para probar la función AddLeadingZero().

Archivos adjuntos:
 

La función toTime().

Esta función convierte dos/tres enteros en una cadena en formato de tiempo. Si se pasan dos números a la función, el primero se utilizará como horas y el segundo como minutos. La cadena de formato devuelta será "HH:MM". Si hay tres números, el tercero será sustituido por los segundos y la función devolverá la cadena "HH:MM:SS". La función toTime() acepta los siguientes parámetros opcionales:

  • h - Reloj. El valor por defecto es 0.
  • m - Minutos. El valor por defecto es 0.
  • s - Segundos. 0 - No utilizar. Valor por defecto 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if ( h==0) st="00:";
  else      st=StringConcatenate( AddLeadingZero( h, 2), ":");

  if ( m==0) st=StringConcatenate( st, "00");
  else      st=StringConcatenate( st, AddLeadingZero( m, 2));

  if ( s!=0) st=StringConcatenate( st, ":", AddLeadingZero( s, 2));

  return( st);
}

ZS. Se adjunta un script para probar la función toTime().

Archivos adjuntos:
 

Igor, ¿podrías sugerir una función que dé una señal correspondiente cuando el precio coincida con una de las variables, digamos b=1,2400, s=1,2300;

Si b=precio sig=1, si s=precio sig=-1.

Pido disculpas por el descuido).

 
Prival >> :
Lo siento, no soy Igor. Pero tal vez esto ayude.

Yo también me disculpo. >> es más preciso.

//+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign(double b, double s)
   {
   double var, e; var=Close[0]; e=0.000001;
   if( var< b+ e && var> b- e) return( 1);
   if( var< s+ e && var> s- e) return(-1); 
   return(0);
   }
 
Prival >> :

...borraré mis mensajes esta noche para no saturar el hilo...

No es necesario. Será útil echarle un vistazo, pues le hará ver que el valor exacto del precio no se capta sistemáticamente.

Razón de la queja: