Funciones útiles de KimIV - página 18

 
rid писал (а):
MA. Mantendré el post durante 24 horas - ¡luego lo borraré!

No tienes que borrarlo. Que se quede...

 

Igor, en primer lugar gracias por tus funciones y por esta rama, ayudan a muchos programadores no profesionales. Pero me gustaría hacerle una pregunta sobre la función NumberOfOrders(). No consigo que funcione. Lo pongo en un Asesor Experto MACD estándar para dar un ejemplo de cómo lo uso. Pego el código:

Para describirlo brevemente, ha cambiado allí:

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
Naturalmente, no funciona. ¿Podría explicar qué es lo que está mal? Gracias de antemano.
Archivos adjuntos:
 
seifer писал (а):
¿Podría explicar qué es lo que está mal? Gracias de antemano.

Dos comentarios:

1. Yo lo haría así:

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2. La función NumberOfOrders() devuelve el número de órdenes - operaciones de tipo BuyLimit, BuyStop, SellLimit y SellStop. El Asesor Experto que has modificado no funciona con órdenes. Abre posiciones a precios de mercado, es decir, realiza operaciones de compra y venta. Tienes que utilizar la función NumberOfPositions(), que publicaré en el próximo post.
 

La función NumberOfPositions().

Esta función devuelve el número de posiciones actualmente abiertas. Una selección más precisa de las posiciones contadas se especifica 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  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) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
Se adjunta un script para probar la función NumberOfPositions().
Archivos adjuntos:
 

¡Vaya! Pensé que era un diseño:

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
pasaría por todas las posiciones (incluyendo OP_SELL y OP_BUY). Todo está funcionando ahora. Gracias de nuevo.
 

Función GetProfitFromDateInCurrency().

Esta función devuelve el beneficio total en la moneda de las posiciones cerradas desde una fecha determinada. La selección más precisa de las posiciones a tener en cuenta 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 de este instrumento. 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.
  • dt - Fecha y hora en segundos desde 1970. Valor por defecto - 0 significa que se tienen en cuenta todas las posiciones disponibles en el historial.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

HH. Se adjunta un script para probar la función GetProfitFromDateInCurrency().

El indicador i-Profit, que muestra los valores absolutos y porcentuales de los beneficios para diferentes periodos de tiempo, es un ejemplo más práctico para aprender a utilizar esta función.

Archivos adjuntos:
 

Hola Igor.

Me gustaría dar las gracias por la correlación fi. Tenía algunas opciones, sólo quería aclararlas)

Yo también tengo una pregunta de este tipo. Muy a menudo me encuentro con el error 130 - parada incorrecta durante la prueba del Asesor Experto en el modo de tiempo real. No lo analizo, no entiendo por qué se produce en una situación u otra. He empezado a utilizar esta construcción

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

He empezado a utilizar esta construcción para normalizar la parada y el TP, pero no ha resuelto la situación. Tal vez te hayas enfrentado a situaciones similares, cuéntame cómo afrontarlas y cuál es la mejor manera de analizarlas.

Para aclarar: Esto sucede muy a menudo cuando trato de establecer un stop a +1 p del precio de apertura

 
scorpionk писал (а):
encontrar el error 131 - Parada incorrecta.

131 - Volumen incorrecto, error en la granulación del volumen. Es el tamaño del lote que se negocia.

 
KimIV:
scorpionk escribió (a):
Me encuentro con el error 131 - Parada incorrecta.

131 - Volumen incorrecto, un error en la granulación del volumen. Es el tamaño del lote que se negocia.

Código incorrecto, no 131 sino 130

 
scorpionk:

Código equivocado, no es 131, es 130.

Ya veo...

Pruebe a normalizar de la siguiente manera:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Lo hago y no encuentro el error 130.