Funciones útiles de KimIV - página 13

 
olyakish:

Igor, te hice una pregunta en la 'Biblioteca de funciones para trabajar con archivos INI', pero no hubo respuesta :(


Gracias... respondió...

 

La función ClosePosBySelect().

Cierra una posición preseleccionada. Esta función es más bien auxiliar, porque es llamada desde otras funciones, que ayudan a seleccionar posiciones para cerrar por algunas condiciones.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
 
KimIV:

Gracias... contestó...

Otra pregunta (o más bien afirmación) allí también :)

 
KimIV:

La función ClosePosBySelect().

Cierra una posición preseleccionada. Esta función es más bien auxiliar porque se llama desde otras funciones que ayudan a seleccionar las posiciones que se van a cerrar según algunas condiciones.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}

¡Hola!

¡Disculpe!

1) No entiendo el significado de la línea for (it=1; it<=NumberOfTry; it++)

¿qué tipo de bucle es este?

2) Tampoco entiendo la condición if (!testing() ......) break;

3) y por último, ¿qué función es esta? ErrorDescription(err)," ,

Si no le importa, por favor explique .

 

1. esto es un ciclo de intentos de comercio. Si el servidor de operaciones devuelve errores, la función hará un número de intentos para cerrar la posición después de todo. Yo suelo poner NumberOfTry=5.

2. esta condición implementa la capacidad de salir correctamente del ciclo de intentos cuando se detiene el Asesor Experto que trabaja en línea. Sin esta condición, para llamar, por ejemplo, a las propiedades del EA, teníamos que esperar hasta que el EA utilizara todos los intentos de operación, o eliminar el EA del gráfico.

3. Busque en el archivo ..\Nexperts\libraries\stdlib.mq4

 

Me gustaría preguntar cómo hacer que un EA funcione en un bucle infinito, pero con acceso a la configuración de sus parámetros?

Escribí en el inicio así

while (true)
{
  // проверка на останов и прочее
      if (IsStopped()) 
        return(-1);
  while (isRefresh == false)
       isRefresh = RefreshRates();
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

Pero en este caso, el Asesor Experto se cuelga y no puedo hacer nada con él excepto quitarlo del gráfico

 

Valera, hazlo:


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}
 

La función ClosePosBySizeProfitInCurrency().

Esta función cierra sólo las posiciones cuyo beneficio en la moneda del depósito supera un valor determinado. Puede especificar qué posiciones deben cerrarse mediante los parámetros de la función:

  • sy - Nombre del instrumento. Si define este parámetro, la función sólo comprobará las posiciones del instrumento especificado. NULL significa el instrumento actual, mientras que "" (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). Valor por defecto -1 - significa cualquier MagicNumber.
  • pr - Nivel de beneficio en la moneda del depósito. Valor por defecto - 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых профит в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит                                                             |
//+----------------------------------------------------------------------------+
void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; 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) {
            if (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}
 
KimIV:

Valera, hazlo:


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

Por desgracia, esto también difunde el ekspert y no da acceso a sus parámetros hasta que lo elimine del gráfico

 
scorpionk:

Por desgracia, esto también difunde el EA y no da acceso a sus parámetros hasta que lo elimine del gráfico

Sin embargo, le da la opción de detener el EA pulsando el botón "EAs" en la barra de herramientas.

Razón de la queja: