Funciones útiles de KimIV - página 110

 
Gracias por la aclaración, ahora seguiré adelante)))))
 

Función WritingLineInFile().

He reescrito esta función el otro día, he añadido el parámetro fs, que se encarga de escribir la primera línea del archivo, que es diferente de otras líneas, por ejemplo, la cabecera de la tabla. La primera línea se escribirá en el archivo sólo si se cumplen simultáneamente dos condiciones: que la longitud de la línea sea mayor que cero y que el tamaño del archivo sea cero. Y para mantener la compatibilidad con la versión anterior, el nuevo parámetro se ha hecho opcional.

Parámetros de la función WritingLineInFile():

  • fn - nombre del archivo
  • st - la cadena que se escribirá en el archivo
  • fs - primera línea (cabecera de la tabla)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.04.2012                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Запись строки в файл                                           |
//|  Параметры:                                                                |
//|    fn - имя файла                                                          |
//|    st - строка                                                             |
//|    fs - первая строка (шапка таблицы)                                      |
//+----------------------------------------------------------------------------+
void WritingLineInFile(string fn, string st, string fs="") {
  int fh=FileOpen(fn, FILE_READ|FILE_WRITE, " ");

  if (fh>0) {
    if (FileSize(fh)==0 && StringLen(fs)>0) FileWrite(fh, fs);
    FileSeek (fh, 0, SEEK_END);
    FileWrite(fh, st);
    FileClose(fh);
  }
}

ZZY. Se adjunta un script para probar la función.

Archivos adjuntos:
 
¡Buenas noches, Igor! Parada en la función
DateBeginQuarter

En primer lugar, estoy tratando de entender las líneas:

int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);

por defecto nq = 0, por lo que no está claro lo que obtenemos de la expresión MathMod(nq/4), ya que el resultado siempre será 0. También la segunda línea no está clara, ya que 0/4 no tiene resto, por favor aclárelo.

 

Gracias, Natasha, por tu pregunta. Gracias a ti, he vuelto a comprobar la función y he encontrado el error. En la línea

int ye=Year()-MathFloor(nq/4);

Tengo que sustituir el signo menos por un signo más.

int ye=Year()+MathFloor(nq/4);

Y ahora vamos al fondo de su pregunta. nq no siempre es igual a cero. Puede haber cualquier valor entero, incluso negativo. Estas líneas funcionan cuando nq es un múltiplo de 4, es decir, cuando hay que sumar o restar 4 trimestres (año).

 
KimIV:

Gracias, Natasha, por tu pregunta. Gracias a ti, he vuelto a comprobar la función y he encontrado el error. En la línea

Tengo que sustituir el signo menos por un signo más.

Y ahora vamos al fondo de su pregunta. nq no siempre es igual a cero. Puede haber cualquier valor entero, incluso negativo. Las líneas que ha especificado funcionan en los casos en que nq es un múltiplo de 4, es decir, cuando necesita sumar o restar 4 trimestres (año).

Gracias por tu respuesta, Igor.... me tomó más tiempo de lo habitual para hacer frente a la función, pero aún así lo resolví))))))) en la misma función, me parece que no es necesario disminuir el año en la expresión:

 if (mo<1) {
    mo+=12;
    ye--;

entonces será correcto.

 
Lisi4ka330:

...en la misma función, no creo que sea necesario reducir el año en la expresión...

Justifica, Natasha, ¿por qué no? Por el contrario, me parece lógico disminuir el año después de cerrar el círculo mensual en sentido contrario. En su expresión, hacer el año más pequeño es lo mismo que retrasar la aguja de las horas una hora después de que la aguja de los minutos haya dado una vuelta completa. Danos tu versión de la función y la discutiremos... Quizá su versión tenga más éxito que la mía.
 

Función GetDrawdownOpenPosInPoint()

Bueno, he terminado de probar a fondo esta función. He tenido en cuenta la dispersión donde era necesario, he intentado optimizarla... La función devuelve el drawdown máximo de las posiciones abiertas actualmente en pips. Tradicionalmente, se pueden pasar parámetros a la función y así filtrar las posiciones que se necesitan para el análisis:

  • sy - Nombre del instrumento. Si se pasa este parámetro, la función comprobará las posiciones sólo del instrumento especificado. NULL significa el instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • 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 de -1 significa cualquier MagicNumber.
  • tf - Marco temporal del gráfico, en el que se muestran los valores de las barras Alta y Baja. El valor por defecto es 0 - el marco temporal actual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.05.2012                                                     |
//|  Описание : Возвращает максимальную просадку в пунктах текущих открытых    |
//|             позиций.                                                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
int GetDrawdownOpenPosInPoint(string sy="", int op=-1, int mn=-1, int tf=0) {
  if (sy=="0") sy=Symbol();
  if (tf==0) tf=Period();

  datetime to=TimeOpenFirstPos(sy, op, mn); // Время открытия первой позиции
  datetime tb=GetTimeOpenBar(sy, tf, to);
  int      dd, md=0;                        // Просадка
  double   po, sp;                          // Пункт, спрэд
  int      i, k=OrdersTotal();              // Номера позиций
  int      nb;                              // Номер бара

  if (tb>0) {
    while (tb<TimeCurrent()) {
      dd=0;
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
            if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
              if (tb>OrderOpenTime()) {
                nb=iBarShift(OrderSymbol(), tf, tb, True);
                if (nb>=0) {
                  po=MarketInfo(OrderSymbol(), MODE_POINT);
                  if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
                  else {
                    if (OrderType()==OP_BUY) {
                      dd+=(OrderOpenPrice()-iLow(OrderSymbol(), tf, nb)+po)/po;
                    }
                    if (OrderType()==OP_SELL) {
                      sp=po*MarketInfo(OrderSymbol(), MODE_SPREAD);
                      dd+=(iHigh(OrderSymbol(), tf, nb)-OrderOpenPrice()+sp)/po;
                    }
                  }
                }
              }
            }
          }
        }
      }
      if (md<dd) md=dd;
      tb+=60*tf;
    }
  }
  return(md);
}

HH. El archivo adjunto contiene un script para probar la función GetDrawdownOpenPosInPoint().

Archivos adjuntos:
 
KimIV:
Justifica, Natasha, ¿por qué no? Por el contrario, me parece lógico disminuir el año después de cerrar el círculo mensual en sentido contrario. En su expresión, hacer el año más pequeño es lo mismo que retrasar la aguja de las horas una hora después de que la aguja de los minutos haya dado una vuelta completa. Danos tu versión de la función y la discutiremos... Quizá su versión tenga más éxito que la mía.

Razoné así: digamos que necesitamos determinar el inicio de Q7 en el pasado y en el futuro, entonces nq= -7 y nq=7 respectivamente. Mathfloor devolverá -2 para el pasado y +1 para el futuro (a juzgar por la descripción de la función en la documentación), por lo tanto, para la situación en el pasado restaremos un año más de lo que añadimos en el futuro..... si continuamos con más cálculos para el pasado, tendremos que reducir el año de nuevo y terminaremos en 2009.....

Lamentablemente por falta de tiempo (apenas tengo tiempo para leer la página del sitio), no puedo proporcionar el código que creo que es correcto, pero creo que si es necesario, no será difícil corregirlo.

 
Lisi4ka330:

Razoné así: digamos que necesitamos determinar el inicio de Q7 en el pasado y en el futuro, entonces nq= -7 y nq=7 respectivamente. Mathfloor devolverá -2 para el pasado y +1 para el futuro (a juzgar por la descripción de la función en la documentación), por lo que para la situación en el pasado restaremos un año más de los que sumemos en el futuro..... si seguimos calculando para el pasado, tendremos que volver a reducir el año y acabaremos en 2009...

Estoy de acuerdo con tu razonamiento, pero te olvidas de los tipos de datos que intervienen en las operaciones. MathFloor() puede omitirse por completo. Vea el resultado del script en el archivo adjunto.

Archivos adjuntos:
test.mq4  1 kb
 
Buenas tardes, Igor)))) Para ser sincero, no entendí muy bien tu respuesta, e incluso el script adjunto no me aportó claridad, sino más bien lo contrario... )))) pero creo que lo resolveré con el tiempo)))) ¿Podría decirme por qué hay pluses en la línea return(StrToTime(ye+"."+mo+".01").
Razón de la queja: