Funciones útiles de KimIV - página 51

 
Estimado Igor, me disculpo si he ofendido a alguien... En realidad no estaba criticando, es una pena que se vea así. En cualquier caso, el prototipo publicado se corregirá y perfeccionará más de una vez. Para que no haya rompecabezas (nunca pretendí ser el autor) le enviaré el trabajo para la revisión del autor en el futuro. Me veo como el primer paso hasta ahora 25 páginas. Tan pronto como lo termine lo enviaré a la dirección mencionada en su sitio. ¡¡¡Gracias por tu inestimable trabajo y por compartir desinteresadamente tu experiencia!!!
 
rid писал (а) >>

Creo que es posible. Aparentemente, es necesario comprobar en cada nivel (en el cruce) cuál es el tamaño de lote actual de la posición abierta. ¡Y exactamente por este criterio debemos implementar un mecanismo de cierre !

Estas funciones (que devuelven el tamaño del lote) están disponibles en esta rama. Mira las páginas. 17 и 27

Muchas gracias. ¡Hurra! Ahora puedo seguir adelante. ¡Muchas gracias!

 

Para determinar si se necesitan o no comprobaciones adicionales del tamaño del lote en la función OpenPosition(), hay que ver cómo calcula el tamaño del lote y cómo y dónde se llama; no vi esta función en la rama

doble ll=GetSizeLot();

Quizás me he perdido .

Si se calcula así https://championship.mql5.com/2012/ru/news, puede dar un error de 134 y perderse el campeonato :-)

 

Hola KimIV.envió una cosa tendrá que escribir de nuevo. No soy muy bueno programando y estoy estudiando para ser comerciante durante 3 semanas. mi gramática tampoco es buena.

aquí. Mi pregunta es la siguiente. ¿Es posible hacer un EA utilizando el indicador CCi?

Niveles CCi 250, 50, -50, -250. La idea es que cuando alcance (cruce) -50 y 50, respectivamente, vendería o compraría. Considere cuándo debe terminar el trato:

1Entonces (digamos que hay una venta) el gráfico cruza -250, luego cruza en sentido contrario -250 (se puede ver en la imagen).

2 El gráfico no ha llegado a 250 y vuelve a cruzar a 50.

Para la compra, es lo mismo, pero a la inversa.

Cotización del euro/dólar, cualquier plazo.

¿Cuánto costaría un EA de felpa como éste? ????

Si es el mismo precio, ¿puede ofrecer algo mejor?

Gracias de antemano. Eso espero. Bueno, fui a un curso de FOREX.

Por cierto, el forex es una forma real de ganarse el pan y la mantequilla????

 

Saludos a todos.

Encontré este indicador, lo cambié un poco - construye buenas líneas de tendencia.

Sería interesante inventar una función... (es una especie de petición de KimIV).

Archivos adjuntos:
tlbs.mq4  8 kb
 
Prival писал(а) >>

Re.

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Quizás sería mejor llamar a OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

Esta sugerencia, Sergei, aumenta la conveniencia de utilizar las paradas y las tomas establecidas en pips. ¿Qué pasa con los casos en los que los topes y las tomas se fijan por niveles de precios? Por ejemplo, un stop en el mínimo o el máximo de la barra anterior. O por una línea de algún tipo. ¿Se convierte en puntos antes de llamar a la función y se vuelve a convertir en precios dentro de la función? Se trata de una operación redundante. Así que lo dejaré como está.

Más adelante veremos la función GetSizeLot() (por cierto, ahora se llama GetLots()). En primer lugar, tenemos que terminar de utilizar las bibliotecas b-ForTest.mqh y b-Positions.mqh.

 

La función CountOrders() para el probador.

En mis versiones de prueba (destinadas a ser utilizadas sólo en el probador de MT4) de los Asesores Expertos, la función CountOrders() sustituye a las siguientes funciones: ExistOrders(), ExistPositions(), NumberOfOrders() y NumberOfPositions(). Es decir, puede dar información sobre la existencia de una posición o una orden de cualquier tipo, así como información sobre el número de operaciones de cada tipo. Este tipo de intercambio tiene sus propias ventajas, que se expresan en una referencia única a la base de órdenes para un tick y la obtención de toda la información necesaria de una sola vez. Y las funciones mencionadas, especialmente cuando se utilizan juntas, cada una de ellas trabaja con una misma base de órdenes de forma independiente, por lo que realizan repetidamente las mismas llamadas. Como resultado, la función CountOrders() puede reducir el tiempo de una pasada en varios segundos, lo que permite ahorrar horas de optimización.

La función CountOrders() toma los siguientes parámetros:

  • mo - Matriz del número de pedidos por tipo. Una vez ejecutada la función, el array tendrá 6 (seis) elementos. Elemento cero - número de operaciones de tipo Buy, primer elemento - número de órdenes Sell, segundo elemento - BuyLimit, tercer elemento - SellLimit, cuarto elemento - BuyStop, quinto elemento - SellStop.
  • mn - Identificador de una posición u órdenes (MagicNumber). El valor por defecto es -1 - cualquier MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize( mo)!=6) ArrayResize( mo, 6);
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ( mn<0 || OrderMagicNumber()== mn) mo[OrderType()]++;
    }
  }
}

P.D. Se adjunta un script para probar la función CountOrders() en línea.

Archivos adjuntos:
 

Buenas tardes, Igor y todos los demás también. Tengo un problema al utilizar la función GetFractalBar(NULL,0, 0). - Devuelve el número de barra fractal por su número. Para ser más precisos, el problema no está en la función. Pero en algún lugar cerca de él.

Todo está bien cuando el comentario se muestra con esta configuración. TENGO el número de la barra en la esquina del gráfico.

int a;
... ...

int start()
  {
//----
if(Time[0] == prevtime)   return(0);//ждём нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

if ( isFractalUp() > isFractalDn() )  {//если это Down-фрактал

   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   
Comment( GetFractalBar(NULL,0, 0));            }

Y todo está bien cuando muestro los números de los comentarios en la esquina del gráfico. Veo los valores del precio mínimo de la barra con el fractal en la esquina izquierda.

if ( isFractalUp() > isFractalDn() ) {//если это Down-фрактал
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));

Comment(iLow(NULL,0, GetFractalBar(NULL,0, 0)));          }

¡Pero más allá en general no está claro! En cuanto inserto la variable "a" en el comentario en lugar de la propia función, ¡el comentario devuelve 1 en la esquina en lugar del valor del precio! Aquí :

if ( isFractalUp() < isFractalDn() ) {
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   Comment( a);                        }
Llevo tres horas sentado, ¡no entiendo qué pasa! Por favor, dígame si puede....
 
Rita писал(а) >>
¡En cuanto inserto la variable "a" en el comentario en lugar de la propia función, el comentario devuelve 1 en la esquina en lugar del valor del precio !

Has declarado la variable "a" como una variable entera, es decir

int a;

Debes declararla como una variable real, es decir

doble a;

 

Función ModifyOrder() para el probador.

Esta es una versión simplificada de la función ModifyOrder(), publicada en la página 7, y está diseñada para cambiar los niveles de precios absolutos de una orden o posición preseleccionada.

La función ModifyOrder() acepta los siguientes parámetros:

  • pp - Precio de fijación del pedido. Si pasa un valor menor o igual a cero, no se realizará la modificación de este nivel de precios. El valor por defecto es -1.
  • sl - Nivel de precio máximo. Si pasa un valor inferior a cero, no se realizará la modificación del nivel de precios. El valor por defecto es 0.
  • tp - Toma el nivel de precios. Si pasa un valor inferior a cero, la modificación del nivel de precios no se llevará a cabo. El valor por defecto es 0.
  • ex - Fecha de vencimiento de la orden pendiente. El valor por defecto es 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);

  if ( pp!= op || sl!= os || tp!= ot) {
    if (MathMod(OrderType(), 2)==0) cl= clModifyBuy; else cl= clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(", er,") modifying order: ", ErrorDescription( er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+ GetNameOP(OrderType())," pp=", pp," sl=", sl," tp=", tp);
    }
  }
}