Funciones útiles de KimIV - página 118

 
borilunad:
Esto y aquello, muchas llamadas innecesarias a otras funciones con los consiguientes errores.

Bueno, ya has cometido errores...

Es simple y sencillo: puedes editarlo para adaptarlo a tus necesidades.

 
KimIV:


¿Puedes dibujar algo similar a esto...

actualizar...

Se adjunta un script para probar la función ExistOPNearPrice()

Lo hice, no sé si es correcto.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets(string sy="", int op=-1, int mn=-1, double price = -1, int ds=1000000) {
  int i, k=OrdersTotal(), ot;

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.00001; else p=0.001;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (OrderSymbol()==sy) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
            if ((price<0 && MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price>0 && MathAbs(price-OrderOpenPrice())<ds*p)) 
               {
                return(True);
               }
          }
          if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
            if ((price<0 && MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price>0 && MathAbs(OrderOpenPrice()-price)<ds*p)) 
               {
                return(True);
               }
          }
        }
      }
    }
  }
  return(False);
}
 
artmedia70:

Bueno, ya has cometido errores...

Es simple y sencillo: ajústalo como quieras.

Gracias. Sí, ya me he arreglado con otros trucos.
 
khorosh:

Lo hice, no sé si es correcto.

Parece que está bien... Es universal )))
 

CorregirPrecio().


En uno de mis EAs una vez necesité reducir drásticamente el número de 130 errores de "Stops inválidos". Mis argumentos de que no se deben usar stops y tomas pequeñas, que hay un límite de su valor mínimo que se establece por la configuración del servidor de comercio llamada STOPLEVEL, no convencieron al cliente. Después de todo, dijo, podríamos procesar de alguna manera este error antes de enviar una solicitud de comercio al servidor. Paré, si no hay error, cómo podría ser manejado. Pero un pensamiento se me metió en el cerebro y empezó a funcionar y dio lugar a esta función.

La función CorrectingPrice() está destinada a corregir los niveles de precios principales de las órdenes y posiciones para que cumplan el requisito STOPLEVEL antes de enviar una solicitud de operación al servidor, es decir, antes de preparar los datos iniciales.

Todos los parámetros de esta función son obligatorios, no hay valores por defecto. Además, los tres últimos parámetros se pasan por referencia, es decir, contendrán el resultado del trabajo de la función. La función acepta los siguientes parámetros:
  • sy - Nombre de un instrumento comercial. El valor vacío "" o NULL indicará el instrumento comercial actual (símbolo).
  • op - Operación comercial. Se permiten los siguientes valores: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP y OP_SELLSTOP.
  • pp - Precio de apertura/configuración de la posición/orden.
  • sl - Nivel de precio de StopLoss.
  • tp - Nivel de precio TakeProfit.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2013                                                     |
//|  Описание : Выполняет корректирование ценовых уровней под STOPLEVEL.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование торгового инструмента                                 |
//|    op - торговая операция                                                  |
//|    pp - цена открытия/установки                                            |
//|    sl - ценовой уровень StopLoss                                           |
//|    tp - ценовой уровень TakeProfit                                         |
//+----------------------------------------------------------------------------+
void CorrectingPrice(string sy, int op, double& pp, double& sl, double& tp) {
  if (sy=="" || sy=="0") sy=Symbol();
  RefreshRates();
  int    di=MarketInfo(sy, MODE_DIGITS);
  int   msl=MarketInfo(sy, MODE_STOPLEVEL);
  int    sp=MarketInfo(sy, MODE_SPREAD);
  double mp=MarketInfo(sy, MODE_POINT);
  double pa=MarketInfo(sy, MODE_ASK);
  double pb=MarketInfo(sy, MODE_BID);
  double ds=NormalizeDouble(pp-sl, di);
  double dp=NormalizeDouble(pp-tp, di);

  if (msl==0) msl=2*sp;
  switch (op) {
    case OP_BUY:
      pp=pa;
      sl=pp-ds;
      tp=NormalizeDouble(pp-dp, di);
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELL:
      pp=pb;
      sl=NormalizeDouble(pp-ds, di);
      tp=pp-dp;
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_BUYLIMIT:
      if (pp>pa-msl*mp) {
        pp=pa-msl*mp;
        sl=pp-ds;
        tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_BUYSTOP:
      if (pp<pa+msl*mp) {
        pp=pa+msl*mp;
        if (sl>0) sl=pp-ds;
        if (tp>0) tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELLLIMIT:
      if (pp<pb+msl*mp) {
        pp=pb+msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_SELLSTOP:
      if (pp>pb-msl*mp) {
        pp=pb-msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    default:
      Message("CorrectingPrice(): Неизвестная торговая операция!");
      break;
  }
}

 
KimIV:

CorregirPrecio().


En uno de mis EAs una vez necesité reducir drásticamente el número de 130 errores de "Stops inválidos". Mis argumentos de que no se deben usar stops y tomas pequeñas, que hay un límite de su valor mínimo que se establece por la configuración del servidor de comercio llamada STOPLEVEL, no convencieron al cliente. Después de todo, dijo, podríamos procesar de alguna manera este error antes de enviar una solicitud de comercio al servidor. Paré, si no hay error, cómo podría ser manejado. Pero un pensamiento se me metió en el cerebro y se puso a trabajar y dio lugar a esta función.

La función CorrectingPrice() está destinada a corregir los niveles de precios principales de las órdenes y posiciones para que cumplan el requisito STOPLEVEL antes de enviar una solicitud de operación al servidor, es decir, antes de preparar los datos iniciales.

Todos los parámetros de esta función son obligatorios, no hay valores por defecto. Además, los tres últimos parámetros se pasan por referencia, es decir, contendrán el resultado del trabajo de la función. La función acepta los siguientes parámetros:
  • sy - Nombre de un instrumento comercial. El valor vacío "" o NULL indicará el instrumento comercial actual (símbolo).
  • op - Operación comercial. Se permiten los siguientes valores: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP y OP_SELLSTOP.
  • pp - Precio de apertura/configuración de la posición/orden.
  • sl - Nivel de precio de StopLoss.
  • tp - Nivel de precio TakeProfit.

Igor, algunas empresas de corretaje utilizan Spread*2 en lugar de StopLevel, que tiene valor cero. Revisando brevemente el código, no me di cuenta de la comprobación de esta situación. Sería bueno corregir el código para comprobar esta situación, de lo contrario provocará los mismos errores que el 130
 
artmedia70:
Igor, algunas empresas de corretaje utilizan Spread*2 en lugar de StopLevel que tiene valor cero. Después de un rápido vistazo al código, no he visto ninguna comprobación para esta situación. Sería bueno ajustar el código para comprobar esta situación, de lo contrario serán los mismos 130 errores


Artem, no conocí a ese DC... ¿Puede enviarme un par de ellas en su mensaje personal? Voy a leer las normas de comercio...

¿O hay una forma más sencilla de hacerlo? ¿Puede decirme si es correcto utilizar dicha corrección?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

ACTUALIZACIÓN: He corregido la funciónCorrectingPrice().

 

Una nueva versión de la función CorrectTF().

Hace tiempo me criticaron la funciónCorrectTF() alegando que su funcionalidad no se corresponde con su nombre. De hecho, ajusta el plazo al mínimo más cercano y no sólo al más próximo. He calculado los valores medios aritméticos entre los plazos estándar y he reescrito la función según su descripción.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.05.2013                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество минут).                               |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame) {
  if (TimeFrame>     1 && TimeFrame<    3) return(PERIOD_M1);
  if (TimeFrame>=    3 && TimeFrame<   10) return(PERIOD_M5);
  if (TimeFrame>=   10 && TimeFrame<   23) return(PERIOD_M15);
  if (TimeFrame>=   23 && TimeFrame<   45) return(PERIOD_M30);
  if (TimeFrame>=   45 && TimeFrame<  150) return(PERIOD_H1);
  if (TimeFrame>=  150 && TimeFrame<  840) return(PERIOD_H4);
  if (TimeFrame>=  840 && TimeFrame< 5760) return(PERIOD_D1);
  if (TimeFrame>= 5760 && TimeFrame<26640) return(PERIOD_W1);
  if (TimeFrame>=26640                   ) return(PERIOD_MN1);
}
 
KimIV:


Artem, no conocí a ese DC... ¿Puede enviarme un par de ellas en su mensaje personal? Voy a leer las normas de comercio...

Cayó

O puedes hacer algo más sencillo. ¿Puede decirme si es correcto utilizar dicha corrección?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

Por supuesto, todo es correcto.

ACTUALIZACIÓN: He corregido la funciónCorrectingPrice().

Igor, yo prácticamente hago lo mismo en los EAs, siempre leo primero los datos y asigno el valor necesario al nivel de la variable, luego compruebo los cálculos con ella.
 
KimIV:


Artyom, no me he encontrado con ningún DC así... ¿Puede enviarme un par de ellas en su mensaje personal? Voy a leer las normas de comercio...

O puedes hacerlo de forma más sencilla. Dígame usted, ¿es lo suficientemente correcto utilizar dicha enmienda?

ACTUALIZACIÓN: He modificado la funciónCorrectingPrice().

Hola compañeros, todavía estoy estudiando los códigos, no entiendo bien las sutilezas y estoy un poco en un dilema.

Según tengo entendido, tenemos que llamar a esta función para corregir los parámetros antes de hacer un pedido.

Hay una línea de este tipo para abrir un pedido:

if(buy == true && Open[0]>UpTr && Trade) {

buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(),Normal izeDouble(op,Digits),slippage,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits), "T",Magic,0,MediumBlue);

¿es aquí donde hay que dirigirse? Y cómo hacerlo correctamente. ¿O este comando no necesitaCorrectingPrice()?

Gracias de antemano.

Razón de la queja: