[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 396

 
rajak:

Hola a todos.

Pueden aconsejar, si alguien sabe cual es el problema, después de compilar el archivo ex4 no aparece, a través de metalang también. Qué puedo hacer al respecto, y hace un par de días todo funcionaba bien.

La compilación se ejecuta sin errores, incluso si los introduce a propósito.

Si tienes windows7, intenta buscar en la carpeta virtual

c:\NSu carpetaAppData\NLocal\Nde la tienda virtual\Nde los archivos de programa (x86)\Nde la carpeta MT4.

En lugar de su carpeta y la carpeta de MT4, sustituya sus directorios reales.

 
lottamer:

Hace algún tiempo, gente amable me dijo cómo hacer la función "devolver ticket de la última posición cerrada" de la función "devolver ticket de las dos últimas posiciones cerradas".

Y cuando necesité la función "entradas de tres posiciones cerradas", no pude (por similitud y método de selección) implementarla

ayuda por favor,

puedes ver que hay dos copias, la segunda con algunos cambios. pero pude continuarlas...

Tengo esta variante para la 3ª entrada... y me devuelve la entrada de la primera posición de nuevo por alguna razón...


Sustituir

if(OrderTicket()==A && (OrderTicket()==B) )continue;

a

if(OrderTicket()==A || (OrderTicket()==B) )continue;

No está claro lo que está haciendo para devolver tres valores de una función

 
Roger:


Sustituir

en

Simplemente no está claro qué está haciendo para devolver tres valores desde una función



el punto es calcular el resultado de las últimas N posiciones. para eso llamo a sus entradas, y luego es cuestión de técnica

fLastClosetPoz();
     OrderSelect( Ticket1,SELECT_BY_TICKET); X=OrderProfit(); SL1=OrderType(); TM1=OrderOpenTime();      Print (Ticket1); Print (SL1,"_",X); //ПОСЛЕДНИЙ 
     OrderSelect( Ticket2,SELECT_BY_TICKET); Y=OrderProfit(); SL2=OrderType(); TM2=OrderOpenTime();      Print (Ticket2); Print (SL2,"_",Y); //ПРЕДпоследний
     OrderSelect( Ticket3,SELECT_BY_TICKET); Z=OrderProfit(); SL3=OrderType(); TM3=OrderOpenTime();      Print (Ticket3); Print (SL3,"_",Z); //ПРЕД-ПРЕДпоследний
 
Roger:


Sustituir por

a


¡Funcionó! Honestamente, tenía la idea de sustituir OR por AND.... pero ... :)))))))))))))))))))))

gracias ! ahora entiendo la logica, aunque para contar 15 cerrados, tendre que soplar el codigo al tamaño de un globo !

¿se puede comprimir todo en un solo bucle? y sólo sustituir el parámetro del número de operaciones necesarias N?

 
Zhunko:

1. No deberías hacerlo. Incluso expresa mi admiración por su algoritmo. Es el HENRYFIX. Entonces tenía un apodo diferente.

El prefijo del nombre de la escritura son las primeras letras de nuestros apodos.

===============

2. Dmitry, pase lo que pase, me alegro sinceramente de que hayas resuelto algún problema secreto con algún algoritmo secreto, que no está sujeto a divulgación.

3. Todo parecía muy misterioso. Gracias por presumir. Sin duda, eres el programador más genial de este foro y quizá de todo el universo.

1. ¡Oh sí! Después de descubrir que era tu código, o el de tu amigo. Abalde, era el más jodido y vergonzoso, ahora se ha convertido inmediatamente en admirable.

2. Con lo que soy un programador, lo que sé y cómo sé y puedo hacer, con lo que no sé y no conozco - me las arreglaré de alguna manera.

3. La tarea no es en absoluto secreta, es absolutamente clara, se ha definido abiertamente aquí. Todos los que son capaces de entenderlo, lo entendieron enseguida sin ningún problema. Se ha resuelto no con algunos métodos secretos y mágicos, sino con los habituales y obvios (y mundialmente conocidos). No estoy presumiendo aquí, y de ti, milagro, me estoy riendo. Sólo su megalomanía le impide comprender y darse cuenta de ello.

 
Integer:

1. ¡Oh, sí! Después de que resultara ser tu código, o el de tu compañero. Abaldez, era el más cagón y vergonzoso, ahora se ha convertido inmediatamente en admirable.

2. Con lo que soy un programador, lo que sé y cómo sé y puedo hacer, con lo que no sé y no conozco - me las arreglaré de alguna manera.

3. La tarea no es en absoluto secreta, está absolutamente clara, se ha definido abiertamente aquí. Todos los que son capaces de entenderlo, lo entendieron enseguida sin ningún problema. Se ha resuelto no con algunos métodos secretos y mágicos, sino con los habituales y obvios (y mundialmente conocidos). No estoy presumiendo aquí, y de ti, milagro, me estoy riendo. Sólo tu megalomanía te impide comprender y darte cuenta de ello.




Vosotros, id a restregarlo a otro sitio! La gente está resolviendo problemas PRÁCTICOS aquí. y vosotros estáis ensuciando el hilo con emociones...
 
lottamer:


Vayan a restregarlo a otro lugar! La gente está resolviendo problemas PRÁCTICOS aquí. ustedes están ensuciando el hilo con emociones...


¿Por qué me escribes sobre esto? Coge a Junko y escribe eso, es su cuarto día aquí no puede entender de qué estamos hablando, todos los demás lo han entendido el primer día.
 

Por supuesto, tiene que haber límites en cualquier debate. De lo contrario, puede que ya haya traspasado los límites de lo razonable.

Una vez expuestas ambas posturas, las partes pueden estar de acuerdo o no. - Están en su derecho. Aunque la gente se equivoque. Todo el mundo tiene derecho a equivocarse.

Si se trata de un debate público, como éste, los que están viendo ven los argumentos de cada parte e, independientemente del consenso alcanzado (o no) sobre la cuestión, todos tienen la oportunidad de elegir su versión de la solución (o ambas).

Pero recurrir a las acusaciones y a las apelaciones al individuo (en lugar de a la tarea, al asunto, al caso) ya es rebajar la credibilidad de uno mismo. Es innecesario y condenable (por insultar a una persona).


Dado que los argumentos y las formas de resolver el problema están expuestos desde hace mucho tiempo, sugiero que ambas partes se detengan en esta cuestión y apelen a los demás.

Aparentemente, si los debatientes son profesionales en la resolución de cuestiones programáticas, son novatos en el debate de cuestiones. Lo cual no desentona con el tema del hilo, pero permite dar un consejo profesional. Espero que se tenga en cuenta este consejo.

 
Integer:

1. ¡Oh, sí! Después de que resultara ser tu código, o el de tu compañero. Abaldez, era lo más jodido y vergonzoso, ahora es inmediatamente admirable.

2. Con lo que soy un programador, lo que sé y cómo sé y puedo hacer, con lo que no sé y no conozco - me las arreglaré de alguna manera.

3. La tarea no es para nada secreta, está absolutamente clara, se ha definido abiertamente aquí. Todos los que son capaces de entenderlo, lo entendieron enseguida sin ningún problema. Se ha resuelto no con algunos métodos secretos y mágicos, sino con los habituales y obvios (y mundialmente conocidos). No estoy presumiendo, me estoy riendo de ti, milagro. Sólo su megalomanía le impide comprender y darse cuenta de ello.

1. ¿Sabes la diferencia entre un código y un algoritmo? Además, el algoritmo no tiene nada que ver con la apertura de la ventana del gráfico. He arreglado el código, por supuesto. El lugar donde se abre el gráfico no ha cambiado prácticamente. No teníamos otra opción en ese momento. Lo hice de una manera diferente en la DLL. Es más fiable.

2. ¡Eso fue genial! ¡Eres el mejor!

3:

PREGUNTAS FRECUENTES:

1) Problema: cada script (EA) debe conocer la presencia de todos los demás.

2) Problema : si hay un fallo, los globales del que ha fallado quedarán colgados sin ocupar y la cola se atascará.

3) Solución :

Cada exp organiza 1 globalka con nombre - prefijo común + asa de la ventana + símbolo. el valor del globalka es la hora del último tick en ese instrumento. 2 global común con su propio mango (después de trabajar escribe su propio mango en él o lo borra si es el más antiguo)

La cola está dispuesta en orden ascendente (asas), el más antiguo pone el segundo globale a cero

en cada exp, creamos tres matrices (a falta de estructuras) - símbolo/manija/tiempo de último acceso/tiempo de último tick.

todas las EXPs llevan la cuenta de (última hora de acceso/última hora de tic) para todas ellas y en cuanto son diferentes (una de las EXPs falla) se borran los dos globales de la EXP fallida y se considera inactiva. sus celdas en los arrays se borran (el array se reconstruye).

la cola se restablece

esto lo hará en realidad el EA que se encuentra en el gráfico más activo (ticks frecuentes).

cuando se desinicialice normalmente, cada expo se limpiará a sí misma.

max skip - una marca.

ZS. y en general, es mejor hacer una multidivisa

Así que esto es gracias a las habilidades telepáticas de Rustam. Es un problema hipotético y una solución hipotética. ¿Qué tiene que ver con tu problema? Nunca dijiste nada al respecto. Tuve que curiosear. La respuesta no es más que una blasfemia en lugar de palabras constructivas, que tú sigues sugiriendo, pero que no pones en práctica.

Tuve un reto similar en 2008. Los secretos no servirán, como algunos. Voy a dar un ejemplo concreto de qué tipo de problema, cómo resolverlo y por qué creo que resolver esos problemas de esta manera no tiene éxito.

============================

Los datos iniciales del problema:

1. La tarea tiene varios Asesores Expertos idénticos en bucle. Es decir, hilos totalmente independientes.

2. Existe una base de datos de coeficientes dividida en 8 grupos, a la que acceden algunos expertos. El tamaño de la base de datos es a partir de 2 Gb.

3. La DB se repone a veces. Se repone en períodos múltiplos de 2 horas. El tiempo de procesamiento depende de los múltiplos de la hora del día. La duración varía entre 5 minutos y 45 minutos en función de la multiplicidad de la hora del día y de la capacidad de la CPU.

Tarea:

Dado que completar la base de datos lleva mucho tiempo, sólo un experto debería encargarse de completarla. De lo contrario, es posible que no pueda esperar a que termine.

2. Es necesario prohibir el acceso a la base de datos mientras se actualiza. Hágalo en grupos, para no ralentizar significativamente la actualización de los coeficientes, con los que trabajan los expertos.

Los expertos que trabajen con coeficientes, que están siendo actualizados, deberán trabajar con los coeficientes antiguos.

Los expertos que han sido cambiados a un grupo específico de coeficientes durante el período de actualización deben trabajar con un solo coeficiente e informar sobre ello. Cuando termine la actualización, deberán cambiar al nuevo coeficiente. Lo mismo ocurre con el punto 3.

Solución en ese momento:

1. Se hace una cola común de identificadores de expertos compuesta por sus índices.

2. Se hace una cola de identificadores de expertos, que acceden a la base de datos, compuesta por sus índices.

Ambas colas son un recurso común. El acceso a las colas se sincroniza mediante un único objeto de sincronización.

El primer experto de la segunda cola se encarga de actualizar la base de datos. 4.

5. Además, es casi como lo describió Rustam. Es un poco más fácil debido a la implementación en DLL.

Los identificadores son los índices de paso. Cuando borramos un Asesor Experto, el identificador se elimina de la cola. La reindexación no se lleva a cabo. Los expertos restantes dejarán sus índices.

Al añadir un nuevo experto, si el índice del último experto no coincide con su número, se asigna el primer índice antiguo libre. En caso contrario, se asignan nuevos índices.

La vinculación al descriptor y al instrumento gráfico no es necesaria. Además, no es necesario hacer un seguimiento de un fallo de descarga. Nunca ha habido un fracaso. Aunque haya ocurrido, no es un desastre. La EA seguiría trabajando con los antiguos ratios. Para la siguiente actualización, el controlador del contador de actualizaciones habría detectado que no hay actualizaciones y habría eliminado el ID del EA principal de la segunda cola. El siguiente experto recogería la misión del maestro. El mismo controlador haría lo mismo cuando el Asesor Experto entra en modo de conexión a la base de datos. Es decir, lo introduce en la segunda cola. Es decir, sólo se verían afectados los expertos que trabajan en M1, donde el valor del coeficiente no es crítico.

Dicha solución cumplió plenamente con la tarea, pero me disgustó mucho debido a la vinculación de los Asesores Expertos entre sí y a la inusual tarea de reposición de la base de datos por parte del Asesor Experto, lo que no contribuye a la fiabilidad. En aquella época no sabía ni sabía cómo hacer muchas cosas. Un año más tarde lo rehice.

Solución 2:

1. La base de datos se mantiene en un hilo separado, donde se repone en un temporizador.

2. El acceso a la base de datos en el momento de su reposición está protegido por el objeto de sincronización.

Todo resultó mucho más sencillo. Sin colas. Pero tampoco me gustó mucho. Antes de una reposición, la base de datos llamaba al script de intercambio de citas, lo que a veces provocaba el desbordamiento de la memoria. Lo que ralentiza mucho a MT4. En ese momento MT4 trabajaba con 2 GB de memoria. Ahora funciona con 4GB.

Solución 3:

1. La base de datos es una aplicación independiente. Es decir, otro proceso con su propia memoria dedicada, independiente de MT4.

2. La base de datos se está reponiendo.

El intercambio de datos se produce a través del mapeo. Aumentó la velocidad de intercambio de datos y la reposición de la base de datos. Antes todo se leía del disco. Era imposible hacerlo de otra manera. La memoria de trabajo de МТ4 es muy limitada.

4. El historial es bombeado por MT4 de forma remota desde la aplicación DB, donde se patea según sea necesario. Cualquier fallo de MT4 - su descarga y posterior carga.

5. El punto 4 se realiza creando un enlace simbólico al directorio actual de MT4. Es decir, es una copia completa de la actual MT4. El historial se actualiza sobre la marcha directamente en los directorios de MT4, sin esperar a la carga de MT4 en funcionamiento.

6. Sincronización del acceso a la base de datos en el momento de su actualización a través de mutex, ya que la sección crítica funciona sólo para un proceso.

========================

Así que, Dmitry, sin conocer tu tarea, puedes suponer que se puede resolver sin organizar la cola y manteniendo los hilos del Asesor Experto independientes. Aumentará la fiabilidad y el rendimiento general. Llevo ya varias páginas hablando de ello (independencia de hilos).

 

Lo siento. No hay respuesta a eso:

Integer:

Es una unidad de acceso atómico y sin sincronización. No tiene sentido dirigirse sólo al depósito de esta manera. La llamada a cualquiera de las funciones del parámetro de depósito será atómica por sí misma, sin ningún ajuste. Si lo haces de forma atómica, todo el trabajo del Asesor Experto. Así es como se resuelven los problemas: crees que has hecho algo, pero en realidad es una ilusión.

Dmitry, no deberías pensar que sólo hay tontos. Por la pregunta de Sergey, se ve que entiende bien el problema.

Por supuesto, una simple referencia a los parámetros del depósito con la sincronización no tiene sentido. La sincronización es necesaria para cambiar estos parámetros. Para que el Asesor Experto paralelo reciba el parámetro correcto que ya ha sido cambiado, en lugar de obtenerlo en el proceso de cambio.

Razón de la queja: