エラー、バグ、質問 - ページ 280

 

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

私の知識は表面的なものなので、おっしゃることを評価することはできませんが。サービスデスクに 連絡すれば、調査してくれるでしょう。

 

Developerc - お疲れ様です - mt5は良いツールです。

関数を使った作業例をもっと増やしたい。

クラスなどもちろん、ヘルプでそれを行うには - 理想的な、しかし、あまりにもここで

でも、ここならいいんじゃないでしょうか。


例を挙げて記事を書いてくださる方に感謝します。ありがとうございました。

 
uncleVic:

とりあえず、このファイルを例にとって説明します。

CSignalCustomMACDクラスは、CSignalMACDと全く同じですが、標準配布のインジケータの「カスタム」バージョンをベースにしているという点が異なります。

Expert Advisorのソースコードに一行追加することを忘れないでください。

でないと、テスターで動作しません。

IndicatorsExamples フォルダに MACD.ex5 ファイルがない場合、インジケータをコンパイルする必要があります。

近日中にヘルプに例を追加する予定です。

ありがとうございました!うまくいきました
 
-Alexey-:
これなら納得ですが、今度は操作の">"("<" はチェックしませんでした) は、"マシンゼロの意味で等しい" 数に対して真を返すかもしれません。この効果により数値計算の結果が理論上可能な値よりも大きくなっていたため検出されましたが、上記の特殊な関数を使用した後は真となりました。そこで、ヘルプの追加を提案します。

すべての比較でDBL_EPSILONを使用するだけで、難しいことではありません。

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


価格を扱う場合は、計算後に正規化し、DBL_EPSILONの代わりにPoint/2.0を使用します。

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
削除済み  
ありがとうございます。
 

FileReadArray 関数で配列を読み込むと、ファイルが開かれ、データも入っているのに、なぜかうまくいきません。

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:

FileReadArray 関数で配列を読み込むと、ファイルが開かれ、データも入っているのに、なぜかうまくいきません。

まず、同じようにファイルにデータを書き込みますが、フォーマットをご覧ください...

そして、読む...

 
AlexSTAL:

まず、同じようにデータをファイルに書き込みますが、フォーマットをご覧ください...

そして、読む...

OnCalculated インジケータやExpert AdvisorのOnInitでFileWriteを使って1行ずつデータを書き込んでいます。

その結果、ファイルは数字の羅列になる。

10000
10000
9996.85
10005.25
10023.4
10029.7

もちろん、配列全体も書けるのですが、なぜ無駄なステップを踏む必要があるのか、ここで何が間違いなのか?

ドキュメントには、これに関する制限事項が見つかりませんでした。

 
DV2010:

OnCalculatedインジケータやExpert AdvisorのOnInitにFileWriteで一行ずつデータを書き込んでいます。

その結果、ファイルは数字の羅列になる。

10000
10000
9996.85
10005.25
10023.4
10029.7

もちろん、配列ごと書くこともできますが、なぜ余計なことをする必要があるのか、また、ここでのエラーは何でしょうか。

この件に関する制限事項は、ドキュメントには見当たりませんでした。

まず、両方のファイルのフォーマットを見てから議論してください。
 
DV2010:

FileReadArray 関数で配列を読み込むと、ファイルが開かれ、データも入っているのに、なぜかうまくいきません。


ヘルプより

FileReadArray

バイナリ ファイルから、文字列配列(文字列を含まない構造体の配列、動的配列でも可)以外の任意の型の配列を、ファイルポインタの現在位置から読み込む。