Funciones útiles de KimIV - página 5

 

Gracias por su aceptación... ;)

Qué es AND, OR, NOT
no es difícil de entender, sólo me interesan estas pequeñas cosas en el código y sus usos.

O, por ejemplo, esto:
- la condición a es IGUAL a b es fácil de implementar a==b
- Pero la condición de que a sea INSEQUIBLE a b es difícil de aplicar...

Perdón por volver a sacar lo básico, pero esto probablemente será útil para muchos principiantes...

Aquí hay un código listo con condiciones de entrenamiento de combate. :)
Lo tiene todo... desde la definición y disposición de los campos hasta la escritura del programador...
https://www.mql5.com/ru/forum/51521

 
kombat писал (а):
- Pero la condición de que a sea DESIGUAL a b ya está causando dificultades...
a!=b;
 
Me parece, Igor, que te has desviado un poco del tema y has entrado en explicaciones.
Si se me permite, me gustaría sugerir una función que muestre cualquier cosa en el acceso directo de la barra de tareas.
Lo utilizo para monitorizar el rendimiento de los EAs en el trabajo sin abrir el terminal (muchas miradas indiscretas).
también puede ser útil en otros casos.

//----------- Función de visualización en la barra de tareas -------------------------------------
void ProfMT(string X)
{
int hwnd1 = WindowHandle(Symbol(), Period());
int hwnd_parent1 = 0;
while (!IsStopped())
{
hwnd1= GetParent(hwnd1);
if (hwnd1 == 0) break;
hwnd_parent1 = hwnd1;
}
if (hwnd_parent1 != 0) SetWindowTextA(hwnd_parent1,X);
}
Gracias.
 

Ahí tienes... En qué otro lugar se puede aprender la verdad tan rápidamente como en un foro... ;)

¡Gracias! Y siento haberme salido del tema.
Intentaré hacer más preguntas en el hilo del libro...

 

La función OpenPosition() para el probador.

Diseñado para abrir posiciones - operaciones de compra o venta a precios de mercado. Esta función es universal y multidivisa, permitiendo abrir posiciones para cualquier símbolo, no sólo para el actual. Por ejemplo, se puede ejecutar un EA en el gráfico del EURUSD y operar con el USDCAD.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Открытие позиции. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color  clOpen;
  double pp;
  int    err, ticket;
 
  if (sy=="") sy=Symbol();
  if (op==OP_BUY) {
    pp=MarketInfo(sy, MODE_ASK); clOpen=clOpenBuy;
  } else {
    pp=MarketInfo(sy, MODE_BID); clOpen=clOpenSell;
  }
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, 0, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") open ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
 

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) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}
 

Ejemplos de uso de la función OpenPosition().

1. Comprar 0,1 lote del instrumento actual

OpenPosition(NULL, OP_BUY, 0.1);

2. Vender 0,2 lotes de EURUSD

string sy="EURUSD";
double pa=MarketInfo("EURUSD", MODE_ASK);
double pb=MarketInfo("EURUSD", MODE_BID);
double po=MarketInfo("EURUSD", MODE_POINT);
OpenPosition(sy, OP_SELL, 0.2);

3. Vender 0,12 lotes de USDCAD con un stop de 20 pips

string sy="USDCAD";
double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo("USDCAD", MODE_POINT);
OpenPosition("USDCAD", OP_SELL, 0.12, pb+20*po);

4. Comprar 0.15 lote de USDJPY con 40 pips de stop

string sy="USDJPY";
double pa=MarketInfo("USDJPY", MODE_ASK);
double pb=MarketInfo("USDJPY", MODE_BID);
double po=MarketInfo("USDJPY", MODE_POINT);
OpenPosition("USDJPY", OP_BUY, 0.15, 0, pa+40*po);

5. Vender 0.1 lote de GBPJPY con stop 23 y takeaway 44 pips

string sy="GBPJPY";
double pa=MarketInfo("GBPJPY", MODE_ASK);
double pb=MarketInfo("GBPJPY", MODE_BID);
double po=MarketInfo("GBPJPY", MODE_POINT);
OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);
El trailer es un script para probar la función OpenPosition(). Los 4 primeros ejemplos están comentados.
Archivos adjuntos:
 
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 --
¿Por qué no poner lsComm en los parámetros de la función? Por ejemplo, así:
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, string lsComm="", int mn=0) {
color clOpen;
datetime ot;
double pp, pa, pb;
int dg, err, it, ticket=0;

if (lsComm=="" || lsComm=="0") lsComm=WindowExpertName()+" "+GetNameTF(Period());
if (sy=="" || sy=="0") sy=Symbol();
Imho, la "flexibilidad" de la función se expande...
 
Lukyanov писал (а):
¿Por qué no poner lsComm en los parámetros de la función?
Imho, la "flexibilidad" de la función se expande...
No me importa... Quiero decir que te permito hacerlo :-)
 
Lo hice por mí mismo. Podría serle útil a alguien. :-)
Razón de la queja: