Perguntas de um "boneco" - página 111

 
openlive:

Agora está a dar-me...

2012.02.26 15:47:46 Ficheiro do testador C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B9989A2FFC701\MQL5\Files\Files\signal10000.csv open error [32]

Primeiro, verifique o que tem na pasta C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDDD286B60B1DB9B989A2FFC701\MQL5Files\

Segundo: não há erro 32 na MQL5. Estranho... Verificam o cabo depois de tentarem abrir o ficheiro e o último código de erro depois de tentarem abri-lo?

 
DenisR:
O que é "modo matemático"?
No modo de cálculos matemáticos não há execuções de histórico - devido a isto a velocidade máxima é alcançada quando é necessário fazer cálculos matemáticos sem utilizar operações comerciais. Neste modo, se optimizar um Expert Advisor comercial , terá de modelar o ambiente do mercado (dados históricos, propagação, etc.) por si próprio. Neste caso, pode utilizar quaisquer dados históricos, retirá-los de um ficheiro pré-preparado.
 
DenisR:
O que é "modo de cálculo matemático"?

Neste modo, apenas OnTester() é chamado; contudo, a complexidade e volume de cálculos em OnTester() não é limitado. Se calcular o lucro do seu Expert Advisor para os parâmetros de entrada dados, pode usar o algoritmo genético do testador para optimização.
 

Por favor, ajuda-me a compreender, o meu cérebro está a ferver.

1. Compreendo que a mudança para o SO x64 está ligada ao facto de ser impossível "dividir" mais de 4 GB de RAM em 4 bytes. Tenho o SO x64, porque é que os apontadores ocupam 4 bytes (diz respeito não só ao mql, mas também ao C++))?

2. Pergunta sobre o MT4: porquê quando chamo a função dll:

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

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

A variável dll pode ser tomada normalmente nestas variantes:

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

Embora eu assuma que o ponteiro e a referência, por ideia não devem ser compatíveis, por exemplo porque o ponteiro para duplicar leva 4 bytes no meu caso.

Funciona desta forma:

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

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

Não funciona:

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

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

Pelo menos como funcionaria (quero passar várias matrizes)? Não o quero fazer através de um retrocesso.

 
220Volt:

Pelo menos como fazê-lo correctamente (quero passar várias matrizes)? Porque não quero ir pela porta dos fundos.

E na MQL, quem irá colocar & na declaração de função?
 
sergeev:
E na MQL, quem irá colocar & na declaração de função?

Sim, isso seria provavelmente a coisa certa a fazer. Mas não é como se a MQL funcionasse em C de qualquer forma (posso estar errado).

 
220Volt:

Sim, isso seria provavelmente a coisa certa a fazer. Só MKL não funciona de alguma forma por C (posso estar errado).

há uma diferença na passagem - tudo precisa de ser passado apenas por referência &, por ponteiro ' * ' apenas objectos de classe podem ser passados

 

Pensei que uma área de memória elementar consiste em duas partes - um endereço e um valor. Se um endereço for transmitido, deve estar em alguma variável com o endereço da área a ser transmitida no campo "valor". É por isso que não compreendo como é que tais variantes podem funcionar correctamente ao mesmo tempo:

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

Podemos tentar encontrar uma explicação tal como - é transferida área de memória "tal como está" e o lado receptor decide o que fazer com ela (escrever o endereço para o valor ou copiar o endereço). Mas esta hipótese é destruída pelo facto de não funcionar desta forma:

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

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

Poder-se-ia tentar novamente encontrar uma explicação - nas primeiras duplicatas, o endereço no campo "valor" é dado como entrada, e o lado receptor decide o que fazer com ele. Em contraste, o facto de em C++ o compilador dizer para não o fazer, na sua opinião ou assim:

fn(int *x)
{
}

int i;
fn(&i);

ou isto:

fn(int &x)
{
}

int i;
fn(i); 
Em suma, não vejo senão contradições.
 

Se perguntarem, eu respondo.

Cheguei à conclusão de que uma ligação e um ponteiro são essencialmente a mesma coisa. Há ligeiras diferenças:

  • Só se pode escrever um endereço numa referência uma única vez, num ponteiro muitas vezes.
  • Sintaxe diferente

Um ponto muito importante é: se a função chamada tem uma referência ou um ponteiro como argumento, o endereço é realmente passado. Isto é muito importante de compreender quando se telefona da dll.

 

Pode dizer-me como encontrar o valor exacto do cruzamento da linha principal e da linha indicadora do estocástico?

Visualmente é fácil, mas como implementá-lo de forma programática?