Proyecto del asesor - página 7

 
George Merts:

¿Qué quieres decir con que "el ATR no cuenta como indicador"?

¿Y cómo es que "no es adecuado como señal de entrada"? ¿Soy un tonto que utiliza la "ruptura de la volatilidad" utilizando sólo este indicador...?

Creo que usted tiene su propia comprensión de los indicadores. Para mí, un indicador es un objeto que puede producir algún valor variable, dependiendo del tiempo. De hecho, incluso un gráfico ordinario de velas del precio es también un indicador. Pero para ti es otra cosa... En consecuencia, nuestra comprensión es diferente.

Esencialmente
indicador = una herramienta (instrumento) que muestra cualquier cambio en algo.
En este sentido, el ATP es un indicador.
Si observa el gráfico, se dará cuenta de que el indicador es el más preciso (es decir, el indicador no es un indicador independiente, sino un indicador de posición) y debe mantenerlo en el mercado.

mi respeto.

 

Я не вижу особой разницы - как я понимаю, WS (WareStore, вероятно ?) - это все тот же мой дата-провайдер.

Es la abreviatura de WorkSymbol. La abreviatura se ha elegido a propósito, debido a la frecuente referencia a este objeto.

Sospecho que debe haber algunos pasos preliminares en la inicialización del objeto WS.

WS es una instancia del objeto CSymbol cuyo constructor utiliza por defecto el símbolo Symbol() actual. Por lo tanto, el WS no requiere una inicialización desde el exterior. Simplemente se crea junto con la clase de estrategia.

Puede haber muchos contenedores de diferentes símbolos y diferentes marcos temporales en un EA. La ideología del proveedor de datos permite no duplicarlos. Ya que en realidad - todas las series de tiempo se almacenan en él, y los contenedores - sólo apuntan a los necesarios.

El resultado es un núcleo de megaclase, al que acceden las clases expertas. ¿En qué se diferencia del MQL básico, cuando existe el núcleo de MetaTrader y cientos de sus funciones, que acceden a él?

Si consideramos que el propio MT4-5 es el proveedor de datos, y nuestra clase se utiliza sólo para proporcionar el acceso - entonces resulta que según su referencia al precio de Open debemos llamar a la función CopyOpen() para un valor - me parece poco razonable.

Exactamente. Sólo este recurso garantiza la unidad de representación de los datos y la completa sincronización de los estados. No es necesario hacer ninguna actualización de las cotizaciones (que pueden olvidarse), ni utilizar un montón de interruptores de palanca adicionales, que inevitablemente se producen al crear un intermediario de almacenamiento de datos. No es necesario buscar en la base de datos los datos que coinciden con los solicitados. Si mi EA lo hace:

Trade.SellLimit(WS.High[1]);

Entonces se garantiza que WS.High[1] devolverá su extremo anterior, sin importar cómo se actualice el entorno de negociación. Sí, es demasiado caro llamar a CopyHigh en cada llamada y copiar un solo valor de doble, pero es 100% fiable. Dado que las clases de cobertura no almacenan datos, sino que sólo pasan la llamada a las funciones del sistema, entonces no podemos tener una situación en la que los datos almacenados no se correspondan con el entorno actual.

También creo que es muy poco razonable dar acceso global completo a todas las variables en cualquier lugar del programa; por el contrario, intento tener acceso sólo a aquellas estructuras y datos que se necesitan para una acción determinada en cada lugar del programa. Todo lo demás debe ser inaccesible. La ideología del proveedor de datos sólo permite controlar este acceso.

Georg, de hecho, ya ha creado este acceso global. Tienes un gran proveedor de superclases al que todos acceden. Se trata de un gran conjunto global de objetos (indicadores, series temporales, etc.), que se recogen bajo la envoltura de la POO. En otras palabras, en el ejemplo con el proveedor de datos, la POO se ha convertido en una ficción. Existe formalmente, pero no existe en la realidad.

 
Vasiliy Sokolov:

Georg, de hecho ya ha creado este acceso global. Tienes un gran proveedor de superclase, al que todo el mundo tiene acceso. Se trata de un gran conjunto global de objetos (indicadores, series temporales, etc.) que se ensamblan bajo la envoltura de la POO. En otras palabras, en el ejemplo con el proveedor de datos, la POO se ha convertido en una ficción. Está ahí formalmente, pero no está en la realidad.

No, estaba comparando las velocidades de ejecución cuando coloco un búfer en el proveedor de datos u obtengo datos cada vez a través de CopyXXX - Tengo un acceso más rápido a mi búfer. Por eso me decidí por mis buffers, y el Proveedor de Datos es sólo un almacenamiento centralizado para estos buffers.

De hecho, la presencia de la "capa" -este mismo proveedor de datos- conlleva un riesgo de desincronización de los datos. Pero hasta ahora nunca me he encontrado con un problema de este tipo, pero el proveedor de datos ahorra velocidad de forma bastante clara. En realidad, creo que esta prueba ya se llevó a cabo por muchas personas - todos resultaron que al procesar una garrapata es más rentable para copiar los datos una vez y utilizarlos, en lugar de cada vez a la terminal de datos.

¿Ahora es diferente? ¿Y la velocidad de un número de llamadas a través de CopyXXX para cada valor doble es la misma que la velocidad de una llamada a la vez para todo el rango, y luego - llamada al buffer para los valores?

 
George Merts:

No, estaba comparando las velocidades cuando coloco el buffer en el Proveedor de Datos o consigo los datos cada vez por CopyXXX - Tengo un acceso más rápido a mi buffer. Por eso me decidí por los buffers, y el Proveedor de Datos es sólo un almacenamiento centralizado para estos buffers.

De hecho, la presencia de la "capa" -este mismo proveedor de datos- conlleva un riesgo de desincronización de los datos. Pero hasta ahora nunca me he encontrado con un problema de este tipo, pero el proveedor de datos ahorra velocidad de forma bastante clara. En realidad, creo que muchos ya han realizado esta prueba - todo el mundo recibió que cuando el procesamiento de la garrapata es más rentable para copiar los datos una vez y utilizarlos, en lugar de ir a la terminal cada vez para los datos.

¿Ahora es diferente? ¿Y la velocidad del número de llamadas a través de CopyXXX para cada valor doble es la misma que la velocidad de una llamada a la vez para todo el rango, y luego - llamada al buffer para los valores?

Sin duda, es mucho más rápido copiar todas las cotizaciones a la vez en la memoria interna del EA (proveedor de fechas) y luego llamar a los valores desde ella, que llamar constantemente al CopyBuffer. Pero ese es el precio de un sistema basado en el Estado. Básicamente, todo nuestro dominio - escribir EAs, scripts, etc. - es la programación de sistemas basados en estados: tenemos una orden - procesamos las reglas de su manejo. Si no hay orden - comprobamos las condiciones de su apertura.

En cuanto a CopyBuffer, copiar grandes trozos de citas y medir la ganancia de rendimiento sólo es posible en pruebas sintéticas. En la práctica, en el 90% de los casos, el Asesor Experto trabaja con la última barra en cada tick o en el momento de abrir una nueva barra. Por lo tanto, siempre se piden los datos de la última barra, y hay una llamada constante de la función CopyBuffer que copia la última barra en la caché.

El único aumento real de la productividad es cuando el Asesor Experto requiere las últimas N barras, donde el número N es mucho mayor que 1. ¿Pero qué se pide de los últimos N compases? Es el trabajo en la ventana deslizante (99% de todo el trabajo del Asesor Experto). Y la ventana deslizante, es un buffer circular en su esencia. Por lo tanto, cuando se solicitan las últimas N barras, en realidad, sólo hay que actualizar o añadir una, la última barra. Es decir, todo esto del copiado de bloques de datos es una historia muy bonita, pero no funciona en el ámbito para el que fue creado, mientras que los buffers en anillo funcionan con bastante éxito.

Ahora mi CSymbol funciona simplemente pasando el índice correcto. Pero puedo actualizarlo para que guarde en caché N últimas barras y N sea elegido por el propio CSymbol, dependiendo del índice máximo solicitado. Y entonces, sin ningún cambio externo, CSymbol en algunas tareas, trabajará muchas veces más rápido que la llamada permanente de CopyBuffer. Este es el poder de la POO. Después de una cierta sobrecarga asociada al uso de envoltorios adicionales, se produce un salto cualitativo, cuando se puede reducir drásticamente el uso de la memoria o el tiempo de la CPU gracias a los algoritmos adaptativos.

 
Gregory Kovalenko:
Hola.
A medida que la cantidad de código crece, a veces se vuelve difícil y confuso.
He visto código de EA con un número enorme de líneas de código, me pregunto cómo se diseñan los EA complejos, ¿hay alguna herramienta o técnica para trabajar con algoritmos tan complejos?

Escribo enormes bloques de código que ocupan cientos de líneas. Casi sin comentarios. Sin OOP. El código está en ruso. Todo funciona de manera muy eficiente. No tengo ningún problema de orientación en el programa, aunque hay unos 100 archivos conectados a él. Probablemente porque me he acostumbrado a ello y lo recuerdo todo desde hace mucho tiempo. Lo principal es conocer y entender su programa, todo lo demás es secundario. Yo creo que sí.

 
Реter Konow:

Escribir enormes bloques de código que ocupan cientos de líneas. Casi sin comentarios. No hay OOP. Código en ruso. Todo funciona de forma muy eficiente. No tengo ningún problema de orientación en el programa, aunque hay unos 100 archivos conectados. Probablemente porque me he acostumbrado a ello y lo recuerdo todo desde hace mucho tiempo. Lo principal es conocer y entender su programa, todo lo demás es secundario. Mi opinión es que lo más importante es conocer el propio programa, y lo demás es secundario.

¿Ha pasado de 1C a MQL?
 
Vasiliy Sokolov:
¿Ha pasado de 1C a MQL?

Soy autodidacta. El primer lenguaje de programación que aprendí fue el MQL4. Después, practiqué un poco en C# y C++.


Nunca he oído hablar de 1C. ¿Qué es?

 
Vasiliy Sokolov:

En cuanto a CopyBuffer, copiar grandes trozos de citas y medir la ganancia de rendimiento sólo es posible en pruebas sintéticas. En la práctica, en el 90% de los casos, el Asesor Experto trabaja con la última barra en cada tick, o en el momento de abrir una nueva barra. Por lo tanto, siempre se solicitan los datos de la última barra y hay una llamada constante del CopyBuffer, que copia la última barra en la caché.

Por lo tanto, necesitamos la velocidad en la "prueba sintética" - la velocidad se vuelve crítica cuando se buscan variantes en el probador de estrategias. Es el probador de la estrategia para mí es un "cuello de botella" donde necesitamos la velocidad.

En realidad en el trabajo real - la velocidad de acceso directo a los datos a través de CopyXXX cada vez es suficiente. Pero, para el prog en el probador - la diferencia de velocidad es muy importante.

 
Los comentarios que no son relevantes para este tema se han trasladado a "OOP vs programación procedimental".
 
George Merts:

Pero es en la "prueba sintética" donde necesitamos velocidad: la velocidad se vuelve crítica cuando se prueban opciones en el probador de estrategias. Es el probador de la estrategia para mí es un "cuello de botella" donde se requiere la velocidad.

En realidad en el trabajo real - la velocidad de acceso directo a los datos a través de CopyXXX cada vez es suficiente. Pero, para el prog. en el probador - la diferencia de velocidad es muy importante.

Para explicarlo en palabras más sencillas: en la base de su proveedor de datos está la función CopyXXX, que copia el último carácter. En la base de mi CSymbol está también CopyXXX, copiando el mismo último carácter. Ambas funciones son lentas. Por lo tanto, tanto tu código como el mío son lentos, ya que la llamada CopyXXX no puede ser evitada. Pero mi código es más sencillo y pequeño. Entonces, ¿por qué toda esta construcción de varios pisos sobre CopyXXX, si no resuelve el problema de CopyXXX en sí mismo?