Erros, bugs, perguntas - página 280

 

-Alexey-:
Это было бы логично, но сейчас операция ">" ("<" не проверял) может возвращать результ true для таких чисел "равных в смысле машинного нуля". Обнаружился эффект т.к. результат  численного расчета получился больше теоретически возможного в результате такого эффекта, а после использования спец. функций, что выше - стал правильным. Поэтому и предлагаю ввести дополнение в справку.

O meu conhecimento do assunto é superficial, pelo que não posso avaliar o que disse. Escreva para o Service Desk e eles irão analisar o assunto.

 

Developerc - Obrigado pelo trabalho realizado - mt5 é uma boa ferramenta,

Gostaria de acrescentar mais exemplos de trabalho com funções,

aulas, etc. Claro que para o fazer na ajuda - ideal, mas também aqui

Mas aqui seria bom.


Um agradecimento especial a todos aqueles que escrevem artigos com exemplos. Muito obrigado.

 
uncleVic:

Por agora, tome este ficheiro como exemplo.

A classe CSignalCustomMACD é absolutamente idêntica ao CSignalMACD, excepto pelo facto de se basear na versão "personalizada" do indicador da entrega padrão.

Não se esqueça de acrescentar uma linha no código fonte do Expert Advisor:

caso contrário, não funcionará no testador.

Se a pasta Indicadores\Exemplos não contém o ficheiro MACD.ex5, o indicador deve ser compilado.

Um exemplo será acrescentado à ajuda num futuro próximo.

Muito obrigado, funciona!
 
-Alexey-:
Isto faria sentido, mas agora a operação ">" ("<" não verificou) pode voltar a ser verdadeiro para tais números "igual no sentido de máquina zero". O efeito foi detectado porque o resultado do cálculo numérico foi maior do que teoricamente possível como resultado deste efeito, mas depois de utilizar as funções especiais acima referidas, tornou-se verdadeiro. É por isso que proponho uma adição à ajuda.

Basta usar DBL_EPSILON em todas as comparações, não é difícil:

if ( a - b > DBL_EPSILON ) // a > b
if ( b - a > DBL_EPSILON ) // a < b
if ( MathAbs( a - b ) < DBL_EPSILON ) // a == b


Se trabalhar com preços, normalize-os após quaisquer cálculos e utilize o Point/2.0 em vez do DBL_EPSILON:

price_1 = NormalizeDouble( Ask + 25 * Point, Digits );
price_2 = NormalizeDouble( indicator_value, Digits );

if ( price_1 - price_2 > Point/2.0 ) // price_1 > price_2
if ( price_2 - price_1 > Point/2.0 ) // price_1 < price_2
if ( MathAbs( price_1 - price_2 ) < Point/2.0 ) // price_1 == price_2
Документация по MQL5: Проверка состояния / Point
Документация по MQL5: Проверка состояния / Point
  • www.mql5.com
Проверка состояния / Point - Документация по MQL5
 
Obrigado.
 

Por alguma razão, a leitura de um array através da função FileReadArray não funciona , embora o ficheiro esteja aberto, contenha dados, etc:

string   filename="equity FileWrite23.txt";
int      handle;
int      NumberCopyElements;
string   common_folder;
string   Array[];

void OnInit(){
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   handle=FileOpen(filename,FILE_READ|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
      Print("Equity FileWrite23 - OnInit(): Удалось открыть файл ",filename,".  Ошибка ",GetLastError());
      else
      Print("Equity FileWrite23 - OnInit(): Не удалось открыть файл ",filename,".  Ошибка ",GetLastError());

   NumberCopyElements = FileReadArray(handle,Array,0,WHOLE_ARRAY);
      PrintFormat("Equity FileWrite23 - OnInit(): Записано %d байт в общую папку всех терминалов - %s",NumberCopyElements,common_folder);
   FileClose(handle);

}





















2011.01.26 16:27:00     Core 1  connect closed
2011.01.26 16:27:00     Core 1  log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110126.log" written
2011.01.26 16:27:00     Core 1  EURUSD,H1: 5516 ticks (23 bars) generated within 15 ms (total bars in history 6419, total time 218 ms)
2011.01.26 16:27:00     Core 1  OnTester result 0
2011.01.26 16:27:00     Core 1  2011.01.14 00:00:00   Equity FileWrite23 - OnInit(): Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01.26 16:27:00     Core 1  2011.01.14 00:00:00   Equity FileWrite23 - OnInit(): Удалось открыть файл equity FileWrite23.txt.  Ошибка 0
2011.01.26 16:27:00     Core 1  EURUSD,H1: testing of Experts\_My\Experts\Expert1\Expert Small FileWriteEquity.ex5 from 2011.01.14 00:00 to 2011.01.15 00:00 started
2011.01.26 16:27:00     Core 1  EURUSD,H1 (Alpari-Demo): 1 minutes OHLC ticks generating. OnTick executed on the bar begin only
2011.01.26 16:27:00     Core 1   Intel Pentium 4  3.40 GHz, 3063 MB, PR39
2011.01.26 16:27:00     Core 1  4255 bytes of total initialization data received
2011.01.26 16:27:00     Core 1  successfully initialized
2011.01.26 16:27:00     Core 1  initial deposit 10000.00 USD, leverage 1:100
2011.01.26 16:27:00     Core 1  expert file added: Experts\_My\Experts\Expert1\Expert Small FileWriteEquity.ex5. 4106 bytes loaded
2011.01.26 16:27:00     Core 1  common synchronization completed
2011.01.26 16:27:00     Tester  EURUSD,H1 (Alpari-Demo): testing of Experts\_My\Experts\Expert1\Expert Small FileWriteEquity.ex5 from 2011.01.14 00:00 to 2011.01.15 00:00 to be started2011.01.26 16:27:00     Core 1  authorized (agent build 384)
2011.01.26 16:27:00     Core 1  connected
2011.01.26 16:27:00     Core 1  connecting to 127.0.0.1:3000


 
DV2010:

Por alguma razão, a leitura de um array através da função FileReadArray não funciona , embora o ficheiro esteja aberto, contenha dados, etc:

Escreve primeiro os dados no ficheiro da mesma forma, ver o formato...

E depois leia...

 
AlexSTAL:

Primeiro escreve-se os dados num ficheiro da mesma forma, ver o formato...

E depois leia...

Escrevo os dados uma linha de cada vez no indicador OnCalculated ou OnInit do Expert Advisor via FileWrite.

Como resultado, o ficheiro é uma lista de números:

10000
10000
9996.85
10005.25
10023.4
10029.7

É claro que também poderíamos escrever a matriz como um todo, mas porque devemos tomar medidas desnecessárias e qual é o erro aqui?

Não consegui encontrar quaisquer restrições sobre isto na documentação.

 
DV2010:

Escrevo os dados linha a linha para o indicador OnCalculated ou OnInit of Expert Advisor via FileWrite.

Como resultado, o ficheiro é uma lista de números:

10000
10000
9996.85
10005.25
10023.4
10029.7

Claro que também pode escrever a matriz como um todo, mas porque é que preciso de fazer coisas desnecessárias e qual é o erro aqui?

Não encontrei quaisquer limitações sobre este assunto na documentação.

Primeiro tente ver os formatos de ambos os ficheiros antes de discutir
 
DV2010:

Por alguma razão, a leitura de um array através da função FileReadArray não funciona , embora o ficheiro esteja aberto, contenha dados, etc:


A partir da ajuda:

FileReadArray

Lê arrays de qualquer tipo excepto arrays de cordas (pode ser um conjunto de estruturas sem cordas e arrays dinâmicos) a partir de um ficheiro binário da posição actual do ponteiro do ficheiro.