Funciones útiles de KimIV

 

En este hilo publicaré los códigos de mis funciones en MQL4, daré ejemplos de su uso y responderé a las preguntas relacionadas con su uso. Cada función se publicará en dos puestos. El primer post contendrá el código de la función, el segundo - ejemplos de uso y breves explicaciones. A veces adjunto el código de un script en el segundo post para probar realmente la función y mostrar los resultados.

Empezaré con las funciones para manejar las órdenes según la petición de Lukyanov en el tema "Cómo ejecutar dos EAs al mismo tiempo" al final.

Dejemos que la primera sea la función de ajuste de órdenes (versión de prueba de MT4):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+
 
¿Habrá funciones publicadas para el comercio real? P.D.: Gracias por el tema. Creo que será muy popular y tendrá mucha demanda.
 
¡Hola, Igor!
Apoyo la idea. Decisión correcta: ¡¡¡........!!!
Su código es enorme, las preguntas surgen a menudo, y no es bueno dirigirse a usted en los mensajes de otras personas y en otros temas.
 

Genial.

Sugerencia a los desarrolladores: empezar a formar una biblioteca de funciones. En mi opinión, para ello es conveniente presentar a la comunidad los requisitos de diseño (por ejemplo, descripción obligatoria de las variables, estipulación de los límites de uso, número de caracteres por cadena, etc.). Un artículo de MQ sobre el tema sería una buena idea.

Con el tiempo, aparecerán en la biblioteca no sólo funciones sencillas, sino también complejas.

 
Lukyanov:
¿Habrá funciones publicadas para el comercio real?

Sí, lo harán... A continuación, la función SetOrder() para el comercio en línea...


Ejemplos de cómo utilizar la función SetOrder():

1. Estableciendo una orden BuyLimit con 0,1 lotes, 50 pips por debajo del precio actual:

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point);

2. Estableciendo una orden BuyStop con el lote 0.3 36 pips por encima del precio actual con un stop de 32 pips:

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+36*Point, Ask+(36-32)*Point);

3. Colocación de una orden SellLimit por lote 0,2 a 42 pips por encima del precio actual con una retirada de 50 pips:

SetOrder(NULL, OP_SELLLIMIT, 0.2, Bid+42*Point, 0, Bid+(42-50)*Point);

4. Colocar una orden SellStop por lote 0,5 por 100 pips por debajo del precio actual con un stop de 30 pips y una retirada de 70 pips:

SetOrder(NULL, OP_SELLSTOP, 0.5, Bid-100*Point, Bid-(100-30)*Point, Bid-(100+70)*Point);

5. Una orden BuyLimit con lote 0.1 colocada 50 pips por debajo del precio actual con número mágico 123456 y vencimiento en dos horas:

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point, 0, 0, 123456, TimeCurrent()+2*60*60);
El tráiler es un guión de la vida real con los ejemplos anteriores. Los cuatro primeros ejemplos están comentados.
Archivos adjuntos:
 
VBAG:
¡Hola, Igor!
Apoyo la idea. Decisión correcta: ¡¡¡........!!!
Su código es enorme, las preguntas surgen a menudo, y no es bueno dirigirse a usted en los mensajes de otras personas y en otros temas.
Bueno, aquí podemos hablar. Formule sus preguntas, estaré encantado de responderlas :-)
 
Muestre su versión de los retrasos entre las transacciones comerciales
Gracias.
 
Gracias por este tema tan útil, aunque yo estoy a punto de quemarme las tartas, pero aun así puede que alguien se haya enfrentado al problema de acumular y tomar muestras de grandes conjuntos de datos en µl. µl y bases de datos? ¿Ha pensado alguien en esa dirección?
 
zhuki писал (а):
Muestre su versión de los retrasos entre operaciones

No hago ninguna demora entre las operaciones. Es decir, si necesito colocar dos o más órdenes, realizo estas operaciones sin pausa entre ellas. Pero entre los intentos de negociación, que deben repetirse si hay un error al contactar con el servidor, hago una pausa según las recomendaciones de los desarrolladores de MT4. Como ejemplo, puede ver cómo se implementan estas pausas en mi función SetOrder() para el comercio en línea. Se realizan diferentes pausas para diferentes errores devueltos por el servidor de comercio.

Esta función SetOrder() se utiliza para establecer órdenes pendientes. Se recomienda su uso en el comercio en línea en las cuentas de demostración y en vivo.

Archivos adjuntos:
 
Muy original, pero explique por qué los retrasos de 7,7, 17 y 11 segundos. Además, si hay más de un Asesor Experto, el análisis es necesario.
 
zhuki:
...explicar por qué hay un retraso de 7,7,17,11 segundos. ¿Es una broma o está justificado?

¿Qué tipo de bromas puede haber con dinero real?

Los errores 129 (Precio de compra o venta incorrecto), 130 (Paradas incorrectas), 134 (No hay suficiente dinero), 136 (No hay precio) se pausarán durante 7,7 segundos. Los desarrolladores de MT4 recomiendan pausas de más de 5 segundos en estos casos. Puse 7,7 segundos. También podría haber puesto 6,1 segundos. No me gustan los valores redondos por su atractivo, por lo que establezco valores no circulares.

La pausa de 17 segundos se suponía que era para el error 145 (Modificación prohibida). Pero como la función SetOrder no maneja la modificación, eliminé el manejo de este error. Gracias por llamarme la atención sobre este aspecto de mi función.

La pausa de 11 segundos se encuentra dentro del bucle que comprueba el estado del subsistema comercial. Se puede ajustar a 15 o 30 segundos. Puedes ajustarlo a 15 o 30 segundos, lo que prefieras.

zhuki:
También me pregunto qué hacer si hay más de un Asesor Experto, y no se puede prescindir del análisis.

En el caso de varios Asesores Expertos en una cuenta de trading, se gestiona el error 146 (el subsistema de trading está ocupado). La función SetOrder espera hasta que el subsistema de negociación esté libre.


¡Atención! He editado el post anterior. Se han realizado cambios en la función SetOrder.