Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1144

 
Valeriy Yastremskiy:

Lo entiendo, pero mql5 es difícil de entender por desgracia. Estoy de acuerdo con fxsaber, creo que es más fácil usar el 4 y para la optimización y otras cosas deberíamos usar el 5. En general, me gustaría saber si hay alguien que haya dominado el mql5 sin la práctica de la POO. Por supuesto, después de C++ 4 no es relevante, aunque puedo estar equivocado.

Las dos lenguas son absolutamente idénticas. Ni más ni menos. Y la POO (que a todo el mundo le ha intimidado) es exactamente igual en ambas. ¿No lo sabías? ¿Has leído historias de terror en Internet y has visto a blogueros en YouTube que "siembran lo bueno, lo sabio y lo eterno"? Que astutamente dicen tonterías, ahuyentando deliberadamente a la gente de MQL5.

Me apresuro a decepcionarle: ambas lenguas son exactamente iguales. Tanto en la facilidad de comprensión, como en las características y la presencia de la POO.
Pero MQL5 tiene más posibilidades.

 
Alexey Viktorov:

Te envié al español allí... bueno, asústalo. Hazle un indicador - No tengo tiempo. Está en inglés. Te explicaré si hay algo. Pero... ya te darás cuenta.

 
Alexey Viktorov:

No recuerdo la respuesta de Artem y no voy a buscarla. Todos los códigos de sus artículos son multiterminales o tienen dos versiones, para mql5 y mql4. He comprobado estas versiones en mql4 y todo funciona correctamente.

Sí, estos artículos son difíciles de entender, pero vale la pena si no eres mayor que yo. Y yo, para ser programador, soy obscenamente viejo.

La otra variante es más sencilla, pero será mucho más lenta. Escriba el ticket de pedido en un array, y mediante este array, seleccione el pedido y compruebe la hora de cierre del mismo. Si es superior a cero, significa que la orden está cerrada. Si el comentario de una orden cerrada contiene las letras "sl", significa que la orden se cierra con un stop. Si la orden se cierra, se elimina de la matriz. O bien, una vez completada la matriz, se rellena con las órdenes abiertas restantes. La imaginación vuela en general.

La opción que elija depende de usted. Y lee algunos de mis posts sobre el libro de texto de Kovalev. Es el libro de texto el que sugiere escribir int start(), mientras que el más reciente mql4 requiere void OnTick().

Para los indicadores y los scripts, consulte la documentación. Y por cierto, es mucho más fácil escribir indicadores en mql4 actualizado que cuando Sergey escribió este tutorial.

Muchas gracias. Su información fue muy valiosa para mí. Especialmente sobre la función start().

 
Alexey Viktorov:

No recuerdo la respuesta de Artem, y no la buscaré, puedo adivinar lo que podría haber contestado. ...

Esta es mi respuesta. Con una indicación clara de lo que hay que hacer:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Cualquier pregunta de los novatos sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2020.04.28 08:22

La explicación es sencilla: hay que controlar el número de órdenes y posiciones, y compararlas con el estado anterior. Si tenemos 12 posiciones en el tick anterior, y 8 posiciones en el tick actual, tenemos un cambio de 4 posiciones. En consecuencia, debemos tomar las cuatro últimas posiciones (por la hora de cierre) para entender lo que les ocurrió.

Pero, a juzgar por el código adjunto, en el que están escritos los "milagros", realmente no necesita una explicación con palabras. Pero está aquí para ayudar, no para escribir por/para.


 
ANDREY:

Muchas gracias. Su información fue muy valiosa para mí. Especialmente sobre la función start()

Lo bueno es crear en el editor lo que necesitamos, EA, script, indicador y el editor creará una plantilla con los campos adecuados.
 
Artyom Trishkin:

¿Y qué hace tu código además de que abre dos posiciones de venta, cada una a una hora estrictamente especificada, e imprime la hora de apertura de la última posición cuando está permitido? Eso es todo. El uso de variables no inicializadas, lo que puede llevar a "maravillas" en el comportamiento del código, y muy, muy viejo start() handler, que fue sacado de un estante polvoriento con años de telarañas, y en el mercado (algún día quieres vender algo) con los manipuladores antiguos nunca se perderá validador - dirá que el tipo de programa equivocado.

Gracias por la aportación. En el par GBP/USD encontré un patrón en el comportamiento del precio al hacer las pruebas. Este patrón con pequeñas correcciones, así como con pequeños drawdowns, el gráfico de balance lleva constantemente al alza desde 2008 y hasta el momento actual. Como he dicho, las correcciones de los gráficos de balance y las caídas no son grandes, pero pueden durar varios meses.
Empecé a probar diferentes variantes de este patrón y recurrí a la optimización para este fin. Pero resultó que la optimización utilizando varios parámetros a la vez requiere una gran cantidad de tiempo. En mi caso, tardé cerca de un año. Un algoritmo genético no me conviene.
Entonces llegué a la idea de que las pruebas y la optimización pueden realizarse más rápidamente con la ayuda de un código correctamente formulado, la función Pront() y la tabla de Excel.

El código siguiente es sólo un intento de escribir un código de este tipo. Voy a mejorar este código. Pero me encontré con un problema que no sabía cómo resolver.
Por favor, no me juzgue a mí ni a mi código muy severamente.... Soy un principiante que acaba de empezar a entender los fundamentos de la codificación y poco más. Pero me tomo las críticas con calma y no me ofendo..... especialmente a las críticas constructivas.

Gracias por su ayuda.

int s1,Mn,a,CH;
double Hay,Lou=Bid,Nm_PL[700]={0},PrS,DL=0.0030,X;
int start()
{
int ot = OrdersTotal();                                         
int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (X!=OrderTicket( ))
{
Mn=OrderMagicNumber();CH=TimeHour(OrderOpenTime());PrS=OrderProfit( );Nm_PL[CH+Mn*24]=Nm_PL[CH+Mn*24]+PrS;
Print("----------------- ПРОФИТ-----------------------=",CH,"    Ном орд.(1-26)   ",Mn," ТП    ",PrS," ФИН.РЕЗУЛЬТ.   ",Nm_PL[CH+Mn*24]," НОМ. ИНДЕКСА   ",Mn*24);X=OrderTicket();
}
////******************************************************************
if (Bid < Lou)
{
Lou=Bid;
}
//=======================
if (Bid > Hay)
{
Hay=Bid;
}
////=======================
if (Bid - Lou > DL&& Lou!=0)
{
for(int c=0; c<=500;c+=20) 
{
a++;
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+0.0030+c*Point,Ask-0.0010-c*Point,"300",a );
}
Lou=Bid;
Hay=Bid;
a=0;
s1=0;
}
return(0);
}

Si dos o más órdenes se cierran por stop o take en el mismo tick, el programa imprime Print() sólo después de la última orden cerrada en este tick. Necesito Print() después de que se cierre cada pedido. No sé cómo conseguirlo. Pero si veo el código necesario, lo entenderé y recordaré inmediatamente.

A continuación se muestra un ejemplo de mi problema.


Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • www.mql5.com
Введение Генетический алгоритм (ГА) относится к эвристическим алгоритмам (ЭА), который даёт приемлемое решение задачи в большинстве практически значимых случаев, однако при этом правильность решения математически не доказана и применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или вовсе невозможно. Классическим...
 
Valeriy Yastremskiy:
Lo bueno es crear en el editor lo que necesitamos, un EA, un script, un indicador y el editor creará una plantilla con los campos adecuados.

Sí, me he dado cuenta de que estos campos son correctos, es decir, nuevas funciones en lugar de START. Pero no les presté mucha atención y utilicé START para las pruebas como antes.
No sé dónde puedo leer más detalles sobre las últimas actualizaciones de MQL4. Me gusta mucho el libro de Kovalev, porque toda la información está estructurada de forma lógica y se entiende fácilmente. Y es lo suficientemente detallado como para entender todos los detalles necesarios. Me pregunto por qué no ha escrito el mismo libro de texto para MQL5.

 
Artyom Trishkin:

Dos lenguas absolutamente idénticas. Ni más ni menos. Y la POO (que a todo el mundo le ha intimidado) es exactamente igual en ambas. ¿No lo sabías? ¿Has leído historias de terror en Internet y has visto a blogueros en YouTube que "siembran lo bueno, lo sabio y lo eterno"? Que astutamente dicen tonterías, ahuyentando deliberadamente a la gente de MQL5.

Me apresuro a decepcionarle: ambas lenguas son exactamente iguales. Tanto en la facilidad de comprensión, como en las características y la presencia de la POO.
Pero MQL5 tiene más posibilidades.

Sí, en general, estoy de acuerdo, y OOP en 4ka contento))), pero en el acceso de los principiantes en mi experiencia libros de texto Kovalev, Zhdan en 4ka e incomprensible Mishin en 5ka y OOP. No sé cómo entenderlo. No importa cuántas veces se repita la encapsulación, la comprensión del poliformismo no llegará. Y no entiendes qué artículos leer primero. Y dónde buscar qué. Por eso hasta ahora en codobase en ontik la salida de la función de inicio se encuentra )))))
 
ANDREY:

Sí. Me he fijado en esos campos correctos, es decir, en las nuevas funciones en lugar de en el START. Pero no les presté mucha atención, así que utilicé START para hacer pruebas como antes.
No sé dónde puedo leer más detalles sobre las últimas actualizaciones de MQL4. Me gusta mucho el libro de Kovalev, porque toda la información está estructurada de forma lógica y se entiende fácilmente. Y es lo suficientemente detallado como para entender todos los detalles necesarios. Me pregunto por qué no ha escrito el mismo libro de texto para MQL5.

Como dijoAlexey Viktorov:Entendiendo la simple verdad, mql5 difiere de mql4 sólo en OrderSend() y algunas otras funciones, que no recuerdo. Otra diferencia importante es el sentido de la indexaciónde los topes indicadores. Sin embargo, puede solucionarse muy rápidamente, pero será mejor que te acostumbres a las nuevas funciones. Pero la obtención de los valores de los indicadores sigue siendo la misma.
Los artículos de OOP para principiantes han ayudado. Y la ayuda del editor.
 
ANDREY:

Gracias por su participación.

...

El código siguiente es sólo un intento de escribir un código de este tipo. Voy a mejorar este código en el futuro. Pero me encontré con un problema que no sabía cómo resolver.
Por favor, no me juzgue a mí ni a mi código muy severamente.... Soy un principiante que acaba de empezar a entender los fundamentos de la codificación y poco más. Pero me tomo las críticas con calma y no me ofendo..... especialmente a las críticas constructivas.

Gracias por su ayuda.

Si dos o más órdenes se cierran por stop o take en el mismo tick, el programa imprime Print() sólo después de que la última orden se haya cerrado en este tick. Necesito Print() después de que se cierre cada pedido. No sé cómo conseguirlo. Pero si veo el código necesario, lo entenderé y recordaré inmediatamente.

A continuación se muestra un ejemplo de mi problema.


Ya le he contestado:

La explicación en palabras: hay que controlar el número de órdenes y posiciones y compararlas con el estado anterior. Si teníamos 12 posiciones en el tick anterior y 8 en el actual, tenemos un cambio de 4 posiciones. En consecuencia, debemos tomar las cuatro últimas posiciones (por la hora de cierre) para ver qué ha pasado con ellas.

Toma la última orden de la lista:

int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))

Y primero hay que averiguar cuánto ha cambiado el estado de la lista de pedidos. Antes tenías 12, ahora tienes 8 - esto es un cambio de 4 órdenes. En consecuencia, es necesario imprimir las cuatro órdenes. Y siempre se imprime sólo el último pedido de la lista.

¿Cómo puedo saber cuánto ha cambiado? Necesitamos escribir el número de órdenes en una variable, por ejemplo int last_total, cuando ejecutamos el EA. Luego, en cada tic, compara OrdersTotal() con last_total. Si NO son iguales, eso es un cambio. Escribe la diferencia entre OrdersTotal() y last_total en una variable, por ejemplo, num_changes y guarda el nuevo estado de OrdersTotal() en last_total.
Aquí puede haber algunas sutilezas, por ejemplo, cuando se activa una orden pendiente. Pero por ahora, debes hacer lo que necesitas hacer primero.
Sabiendo el número de órdenes pendientes, puede buscarlas en el historial. Sin embargo, también se puede limitar el seguimiento de las órdenes de la lista histórica: hacer todo lo anterior para la lista de órdenes históricas, y no para la lista de órdenes de mercado. La diferencia entre lo que era y lo que ha llegado a ser: esta es la cantidad de órdenes que hay que analizar. Siempre se analiza sólo la última orden de la lista.

Sin embargo, esto no puede garantizar que el último pedido de la lista del historial sea el último pedido cerrado. Este es también un matiz que hay que tener en cuenta. Pero entonces.

Razón de la queja: