Preguntas de un "tonto" - página 111

 
openlive:

Ahora me está dando...

2012.02.26 15:47:46 Archivo de comprobación C:\N-Universal de la vida, de los datos, de las cotizaciones, de la terminal 9C3619DDD286B60B1DB9B9989A2FFC701\NMQL5\Nde los archivos de la señal10000.csv error de apertura [32].

En primer lugar, compruebe lo que tiene en la carpeta C:\Nsers\Nopenlive\NAppData\NRoaming\NMetaQuotes\NTerminal\9C3619DDD286B60B1DB9B989A2FFC701\NMQL5Files

Segundo: no hay error 32 en MQL5. Extraño... ¿Compruebas la manija después de intentar abrir el archivo y el último código de error después de intentar abrirlo?

 
DenisR:
¿Qué es el "modo matemático"?
En el modo de cálculos matemáticos no hay ejecuciones del historial - debido a esto se consigue la máxima velocidad cuando se necesita hacer cálculos matemáticos sin utilizar operaciones comerciales. En este modo, si usted optimiza un Asesor Experto en operaciones , tendrá que modelar el entorno del mercado (datos históricos, spread, etc.) por su cuenta. En este caso, puede utilizar cualquier dato histórico, tomarlo de un archivo preparado previamente.
 
DenisR:
¿Qué es el "modo de cálculo matemático"?

En este modo, sólo se llama a OnTester(); sin embargo, la complejidad y el volumen de los cálculos en OnTester() no están limitados. Si calcula el beneficio de su Asesor Experto para los parámetros de entrada dados, puede utilizar el algoritmo genético del probador para la optimización.
 

Por favor, ayúdame a entender, mi cerebro está hirviendo.

1. Entiendo que el cambio al SO x64 está relacionado con el hecho de que es imposible "particionar" más de 4 GB de RAM en 4 bytes. Tengo el sistema operativo x64, ¿por qué los punteros ocupan 4 bytes (no sólo afecta a mql, sino también a C++))?

2. Pregunta sobre MT4: por qué cuando llamo a la función dll:

#import "MemoryDLL.dll"
void fn(double j[]);           // Подозреваю что так отдается адрес?
#import

int start()
{
   double dVal[1];
   fn(dVal);
   retutn(0);
} 

La variable dll se puede tomar normalmente en estas variantes:

extern "C" __declspec(dllexport) void fn(double &j);       // Почему так работает????
// и так
extern "C" __declspec(dllexport) void fn(double *j);       // Думаю что должно работать только так

Aunque asumo que puntero y referencia, por idea no deben ser compatibles, por ejemplo porque el puntero a doble ocupa 4 bytes en mi caso.

Funciona así:

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Согласен

extern "C" __declspec(dllexport) void fn(double j);  

No funciona:

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Почему нет???

extern "C" __declspec(dllexport) void fn(double &j);  

Al menos, ¿cómo funcionaría (quiero pasar varias matrices)? No quiero hacerlo a través de la retroalimentación.

 
220Volt:

¿Al menos cómo hacerlo correctamente (quiero pasar varios arrays)? Porque no quiero ir por la puerta de atrás.

Y en MQL, ¿quién pondrá & en la declaración de la función?
 
sergeev:
Y en MQL, ¿quién pondrá & en la declaración de la función?

Sí, eso sería probablemente lo correcto. Pero de todos modos no es que MQL funcione en C (podría estar equivocado).

 
220Volt:

Sí, eso sería probablemente lo correcto. Sólo MKL no funciona de alguna manera por C de todos modos (puedo estar equivocado).

hay una diferencia en el paso - todo necesita ser pasado sólo por referencia &, por puntero ' * ' sólo se pueden pasar objetos de clase

 

Pensaba que una zona de memoria elemental consta de dos partes: una dirección y un valor. Si se transmite una dirección, debe estar en alguna variable con la dirección del área que se transmite en el campo "valor". Por eso no entiendo cómo esas variantes pueden funcionar correctamente al mismo tiempo:

extern "C" __declspec(dllexport) void fn(double &j);  
// и так
extern "C" __declspec(dllexport) void fn(double *j);  
// Прототип для MQL - void fn(&s[]);

Podemos tratar de encontrar una explicación como - se transfiere área de memoria "tal cual" y el lado receptor decide qué hacer con él (para escribir la dirección al valor o copiar la dirección). Pero esta hipótesis queda destruida por el hecho de que no funciona así:

extern "C" __declspec(dllexport) void fn(double j);  

// Прототип для MQL - void fn(&s[]);

De nuevo se podría intentar encontrar una explicación: en los primeros duplicados, la dirección del campo "valor" se da como entrada, y la parte receptora decide qué hacer con ella. En cambio, el hecho de que en C++ el compilador diga que no lo haga, en su opinión o así:

fn(int *x)
{
}

int i;
fn(&i);

o esto:

fn(int &x)
{
}

int i;
fn(i); 
En definitiva, no veo más que contradicciones.
 

Tú preguntas, yo respondo.

He llegado a la conclusión de que un enlace y un puntero son esencialmente la misma cosa. Hay ligeras diferencias:

  • Se puede escribir una dirección en una referencia sólo una vez, en un puntero muchas veces.
  • Sintaxis diferente

Un punto muy importante es: si la función llamada tiene una referencia o un puntero como argumento, la dirección se pasa realmente. Es muy importante entender esto cuando se llama desde dll.

 

¿Puedes decirme cómo encontrar el valor exacto del cruce de la línea principal y la línea indicadora del estocástico?

Visualmente es fácil, pero ¿cómo implementarlo programáticamente?