Funciones útiles de KimIV - página 111

 
Lisi4ka330:
Por favor, dígame por qué hay pluses en return(StrToTime(ye+"."+mo+".01").
Los pluses en este contexto sustituyen a la funciónStringConcatenate().
 
Gracias.... big)))))
 

Función ProfitIFStopInCurrency()

El otro día necesitaba una función para mi panel de información que devolviera la ganancia/pérdida estimada en la moneda del depósito cuando un grupo de posiciones activara sus stops. No es la primera vez que escribo una función de este tipo. Lo he probado largo y tendido en diferentes empresas de corretaje y en diferentes instrumentos con diferentes formas de cálculo de beneficios. Si no lo sabe, hay tres: Forex, CFD y Futuros. Pero no puedo encontrar la diferencia entre Forex y Futuros, pero todavía he incluido la posibilidad de cálculo diferente en el código. La pérdida máxima que puede devolver la función está limitada artificialmente por el saldo de la cuenta corriente. 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 establece este parámetro, la función comprobará las posiciones del instrumento especificado únicamente. 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 -1 significa cualquier MagicNumber.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.05.2012                                                     |
//|  Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита     |
//|             в случае срабатывания стопа открытых позиций.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double ProfitIFStopInCurrency(string sy="", int op=-1, int mn=-1) {
  if (sy=="0") sy=Symbol();  // Текущий символ
  int    i, k=OrdersTotal(); // Подсчёт открытых позиций
  int    m;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
  double l;                  // Размер контракта в базовой валюте инструмента
  double p;                  // Размер пункта в валюте котировки
  double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
  double v;                  // Размер минимального изменения цены инструмента в валюте депозита
  double s=0;                // Подсчёт стопа в валюте депозита

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
          m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
          v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
          if (OrderType()==OP_BUY) {
            if (m==0) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
            if (m==1) s-=(OrderOpenPrice()-OrderStopLoss())/p*v/t/l*OrderLots();
            if (m==2) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
            s+=OrderCommission()+OrderSwap();
          }
          if (OrderType()==OP_SELL) {
            if (OrderStopLoss()>0) {
              if (m==0) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
              if (m==1) s-=(OrderStopLoss()-OrderOpenPrice())/p*v/t/l*OrderLots();
              if (m==2) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
              s+=OrderCommission()+OrderSwap();
            } else s=-AccountBalance();
          }
        }
      }
    }
  }
  if (AccountBalance()+s<0) s=-AccountBalance(); // Ограничение убытка балансом счёта
  return(s);
}

HH. Adjunto el script para probar la función ProfitIFStopInCurrency().

Archivos adjuntos:
 

Función ProfitIFTakeInCurrency()

Esta función es similar a la anterior, sólo que devuelve la ganancia/pérdida estimada en la moneda del depósito cuando un grupo de posiciones activa su toma. También se tiene en cuenta el método de cálculo de beneficios: Forex, CFD y Futuros .El beneficio máximo que puede devolver la función está limitado artificialmente por el número 999.999.999. Parámetros:

  • sy - Nombre del instrumento. Si especifica este parámetro, la función sólo comprobará las posiciones 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 -1 significa cualquier MagicNumber.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.05.2012                                                     |
//|  Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита     |
//|             в случае срабатывания тейка открытых позиций.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double ProfitIFTakeInCurrency(string sy="", int op=-1, int mn=-1) {
  if (sy=="0") sy=Symbol();  // Текущий символ
  int    i, k=OrdersTotal(); // Подсчёт открытых позиций
  int    m;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
  double l;                  // Размер контракта в базовой валюте инструмента
  double p;                  // Размер пункта в валюте котировки
  double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
  double v;                  // Размер минимального изменения цены инструмента в валюте депозита
  double s=0;                // Подсчёт стопа в валюте депозита

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
          m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
          v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
          if (OrderType()==OP_BUY) {
            if (OrderTakeProfit()>0) {
              if (m==0) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v*OrderLots();
              if (m==1) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v/t/l*OrderLots();
              if (m==2) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v*OrderLots();
              s+=OrderCommission()+OrderSwap();
            } else s=999999999;
          }
          if (OrderType()==OP_SELL) {
            if (m==0) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v*OrderLots();
            if (m==1) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v/t/l*OrderLots();
            if (m==2) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v*OrderLots();
            s+=OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(s);
}

HH. He adjuntado un script para probar la función ProfitIFTakeInCurrency().

Archivos adjuntos:
 
Una lista de todos mis artículos con breves descripciones y enlaces a las publicaciones.
Archivos adjuntos:
 
Hola! No tienen algún tipo de plantilla (para principiantes) para facilitar la escritura de un EA para el probador y para el comercio real. Algo no se mueve((((
 
Chuma:
Hola! No tienen algún tipo de plantilla (para principiantes) para facilitar la escritura de un EA para el probador y para el comercio real. Algo no se mueve((((
¿Plantilla? :)) Bueno, toma cualquiera de mis EAs como punto de partida...
 
KimIV:
¿Plantilla? :)) Así que toma cualquiera de mis EAs como punto de partida...

Gracias.... cosas interesantes y útiles en general.... pero por ahora estoy planeando crear un asesor de trading que abra y cierre posiciones basándose en las señales más simples (cruce de medias por ejemplo) para empezar, pero todas estas comprobaciones, determinar el lote etc. .... qué, cuándo y cómo... un poco complicado....

 
así que la idea de una plantilla también se me pasó por la cabeza.... Apoyo a los "compañeros inexpertos" ))))))
 

Igor, me disculpo por mis frecuentes preguntas, y realmente espero que esto no sea demasiado difícil para ti..... ¿Podría decirme qué se entiende por

gbDisabled

en la función OpenPosition() para la línea

aquí hay una parte del código:

// Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза

Al compilar da un error de que la variable no está definida.

Razón de la queja: