[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 304

 
Chiripaha:

: )))))))) Sí, así es. ¡Todos los reproches son aceptados! - Por eso, de nuevo, pido disculpas. - Son todas las consecuencias de un fuerte desarrollo (por ejercicios especiales)

creativo, imaginativo, poético, etc. - de todos modos, hay dos hemisferios en el ser humano: el creativo y el racional. Mi culpa es que lo vi y no lo corregí.

Así que todas tus afirmaciones van al grano y yo soy culpable.

Pero sólo queda la pregunta sin resolver...

¿Cómo resolverlo al final?

Si crees que no me he enterado de algo, por favor, acláralo. Entiendo la técnica de retroalimentación (para poder "escuchar"), pero no he visto una solución todavía.

¿Cómo obtener el número correcto sin redondear en el doble, hasta el tercer decimal, por ejemplo en el valor de Ask = 1,20667?- Una solución como "StrToDouble(DoubleToStr(Ask,3)) = 1,2100 // 1,2100 es el resultado (es decir, el redondeo)" no funcionó.

Gracias de antemano por su tolerancia y comprensión.

¡¡¡DoubleToStr(Ask,3) !!! - Era algo que había que ver.

Y la solución está en el archivo (es un script de prueba).

Archivos adjuntos:
test_ind.mq4  2 kb
 
alsu:

He mirado su código.... Estás demasiado confundido))))

No entiendo muy bien, por qué necesitamos acumular ticks, porque es suficiente almacenar en la memoria (o incluso no almacenar, porque la barra actual debe ser escrita en HST - de lo contrario el gráfico no se actualizará) parámetros de la barra actual - seis números TOHLCV, y actualizarlos según sea necesario en la recepción de ticks, y hacer que las barras se corten por una condición dada (TimeCurrent()-O>1).

Intenta rehacer el código de esta manera, se reducirá en 8 veces, te lo garantizo (lo he comprobado:)


¿Así? Rehecho el algoritmo, eliminado el acumulador, convertido en Asesor Experto, añadido la gradación de los ticks a bajista-alcista, añadido las colas de las velas usando un algoritmo diferente, comentado todo. No tengo nada para comprobarlo, no hay garrapatas en el fin de semana. En cuanto al volumen - me parece, estaba en FileFlush, funciona con el buffer. Para el futuro me niego a poner nada entre FileSeek y FileFlush...
Archivos adjuntos:
elz.jp.mq4  23 kb
 
IgRU4ek:

¡¡¡DoubleToStr(Ask,3) !!! - esto debería haberse visto.

Y la solución está en el archivo (es un script de prueba).


Muchas gracias.

Todavía no entiendo el mecanismo - por qué en mi versión no funcionó y por qué "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Aparentemente, no todas las características de las funciones se revelan en el manual.

Su función fue analizada - entendí la forma en que se resolvió. Pero estaba seguro de que debía haber una forma "más sencilla" de resolverlo, porque el conjunto de funciones de un lenguaje de programación está diseñado para resolver problemas típicos con ellas, en lugar de crear esas funciones típicas para cada usuario por sí mismo. Ingenuamente asumí que DoubleToStr() resuelve precisamente este problema. - No entiendo el sentido de usarlo entonces (cuáles son sus matices). Soy un usuario normal, no un programador, para "llegar a esos detalles". Cuándo utilizar productos de creación en este caso, si todo el tiempo se dedicará a la programación detallada.

Gracias de nuevo. Ahora intentaré ponerlo todo en el código. Esperemos que todo funcione.

 
Chiripaha:

Muchas gracias.

Todavía no entiendo el mecanismo - por qué mi versión no funcionó y por qué "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Aparentemente, no todas las características de las funciones se revelan en el libro de referencia.

Su función fue analizada - entendí la forma en que se resolvió. Pero estaba seguro de que debía haber una forma "más sencilla" de resolverlo, porque el conjunto de funciones de un lenguaje de programación está diseñado para resolver problemas típicos con ellas, en lugar de crear esas funciones típicas para cada usuario por sí mismo. Ingenuamente asumí que DoubleToStr() resuelve precisamente este problema. - No entiendo el sentido de usarlo entonces (cuáles son sus matices). Soy un usuario normal, no un programador, para "llegar a esos detalles". Cuándo utilizar productos de creación en este caso, si todo el tiempo se dedicará a la programación detallada.

Gracias de nuevo. Ahora intentaré ponerlo todo en el código. Esperemos que todo funcione.

DoubleToStr() realiza una conversión con un número en dos pasos: primero redondea (según las reglas de las matemáticas) el número con el signo correcto y luego lo convierte en una cadena.
 

Pruebe su caso

double x = MathFloor(y*1000)/1000;

 
IgRU4ek:
DoubleToStr() realiza la conversión a un número en dos pasos: primero redondea (por reglas matemáticas) el número con el signo correcto y luego lo convierte en una cadena.


Gracias por la aclaración. No lo sabía, por supuesto, y estaba culpando a StrToDouble() en este caso. Pero después de tu aclaración ahora asumo que ambos están redondeando :(

El motivo del redondeo no está claro. Si se requiere el redondeo, sería mejor en este caso, en primer lugar, utilizar alguna función de redondeo (como se requiere) - la misma normalización. Entonces habría ambas posibilidades con redondeo y sin él. De lo contrario, tendríamos un desorden innecesario. Además, no entiendo por qué se redondea cuando sólo necesito convertir un número existente en un tipo diferente. Ya lo tengo (un número), ¿por qué debería inventarlo adicionalmente?

 
Roger:

Pruebe su caso

double x = MathFloor(y*1000)/1000;


¡Exactamente! Es una buena solución. Ya lo había visto antes, pero en mi caso me faltó algo. ¡Muchas gracias, Alexander, también! - ¡Ahora tendré 2 soluciones! : )) (Para el dibujo animado "Prostokvashino")
 

Una cuestión tan teórica. ¿El precio de cierre, en términos de tick, es un bid o un ask del último tick de la vela? Me he dado cuenta de que si la oferta se escribe en Close[0], entonces la cotización en el corredor es la misma que en el acta.

Pensaba en ello... Puja en la idea...

 
Zhunko:
Muchos errores. ¿Tal vez deberías mirar un ejemplo y hacerlo por analogía?


Básicamente es lo mismo. Según tengo entendido, aunque no hay nada al respecto en el tutorial, la inclusión es necesaria sólo como enlace entre el Asesor Experto y la biblioteca.

La función se importa en el inline, y se declaran las funciones a importar. Se pone un signo . entre las declaraciones;

Aquí escribí un inlude y una biblioteca (con una sola función, pero es sólo para una prueba).

La inclusión está aquí:

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

Cuando se declaren todas las funciones necesarias (usadas por un búho específico), ponga#import al final

Aquí está la propia biblioteca:

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

Ni siquiera se compila.

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

Tú no declaras nada en la biblioteca y no tienes errores, pero yo sí por alguna razón. No vi ninguna diferencia.

 

Víctor, tienes muchas variables en tu función y ninguna declarada.

El compilador dijo:

variable no definida

Una variable no está definida. Son 18.

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

A juzgar por el diseño de la función, se trata de una función altamente especializada. ¿Por qué lo pondrías en la biblioteca? Sobre todo porque probablemente será llamado en el bucle en cada barra.

Estabas diciendo algo sobre la velocidad y la optimización. Está creando un código muy lento. En MQL4 no debes poner funciones en un bucle. Cuantas menos llamadas de función haya en un bucle, más rápido se ejecutará el código.

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

Hace mucho tiempo, cuando empecé a escribir en MQL4, escribí mi primer indicador de índice de divisas. Allí también había funciones, operaciones con cadenas... Qué lío... He tardado 5 minutos en cambiar de TF.

Entonces me senté a pensar, eliminé todas las funciones y las abrí justo en el bloque del bucle. Se ha eliminado el trabajo con cadenas, sustituyéndolas por identificadores. Todo lo que se podía calcular de antemano y que no cambiaba, así lo calculé (optimización). Movido el código al Asesor Experto. Como resultado, el cálculo más pesado al cambiar de TF fue de 15 segundos. Luego he transferido los cálculos a la DLL. Ahora tarda unos 5 segundos.

Razón de la queja: