#property copyright "Copyright 2010, Pavlov Sergei" #property link "" #property version "1.00"
#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh> ClassExpert Expert1; int handle; string common_folder; string filename;
voidOnInit(){ Expert1.Init(); //-- filename="equity.txt"; common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH); int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON); } voidOnTick(){ Expert1.OnTick(); //--- if(handle!=INVALID_HANDLE){ uint written=FileWrite(handle, AccountInfoDouble(ACCOUNT_EQUITY),common_folder); PrintFormat("Expert OnTick: Записано %d байт в общую папку всех терминалов - %s",written,common_folder); } else{ Print("Expert OnTick: Не удалось открыть на запись файл ",filename,". Ошибка ",GetLastError()); } } voidOnDeinit(constint reason){ Expert1.Deinit(); //--- FileClose(filename); }
2011.01.2114:00:46 Core 1 connect closed 2011.01.2114:00:46 Core 1log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written 2011.01.2114:00:46 Core 1 EURUSD,H1: 5516 ticks (23 bars) generated within 47 ms (total bars in history 6419, total time 3093 ms) 2011.01.2114:00:46 Core 1 OnTester result 0 2011.01.2114:00:46 Core 12011.01.1423:59:59 order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829] 2011.01.2114:00:46 Core 12011.01.1423:59:59 deal performed [#13 sell 0.15 EURUSD at 1.33829] 2011.01.2114:00:46 Core 12011.01.1423:59:59 deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13) 2011.01.2114:00:46 Core 12011.01.1423:59:59 position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593] 2011.01.2114:00:46 Core 12011.01.1422:00:00 Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common 2011.01.2114:00:46 Core 12011.01.1421:00:00 Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
以下は、ファイルから読み込むコードです。
なぜFileReadString() なのか?
FileReadArray() を使えば、 ループは必要 ない。
なぜFileReadString()なのか?
FileReadArray() を使えば、 ループする 必要はないのでは?
ロッシュ
エクイティ値をファイルに書き込む。そして、その値でインジケータを構築する。ただし、データファイルは手動で移動する必要があります。 テスト中はAgent_name/MQL5/Files フォルダにファイルが書き込まれます。
今になって、すべてが複雑であることに気づきました。
しかし、何百ものテストを行うのですから、手作業では明らかに解決になりません。
そして、最初のうちは使えるデータがあるのだが......あ、ミラクル! と思える。- プログラムはそのように設計されているので、プログラムで取り出して使用するまで、何らかの方法でどこかに保存する可能性はありません。
私はプロのプログラマーではありませんが、この状況は理解しがたいものです。
巨大なドキュメント...、構築における膨大な可能性、それは、あらゆるもの、あらゆるもの...、メモリ管理、OOP、そしてここで、根本的にシンプルで決定的に必要なもの(これは、私がすでに説明したと思いますが)-デッドロックです。
...それなのに...Question!
テストモードで、強制的に消去可能なプログラム配列を書き込んで、それを使ってインジケータを作ることはできないのでしょうか?
そのような配列へのポインタをグローバル変数に 渡す可能性も含めて?
また、現在の実装の問題ではなく、原理的にテスト段階から本番までのデータの保存や転送の問題はどうなっているのでしょうか?
レナートは数百メガバイトのデータについて言及しましたが、第一に、プログラマーが明示的に望んだ場合にのみその可能性を提供できるのに、なぜ常にデータを再ロードしなければならないのか、第二に、目下の課題という点ではデータ量ははるかに少なく、数千桁にすぎません。
もう一度言いますが、ユーザーの立場からすると、複数のテスト(そして市場は、その複雑さのために、複数のテストを必要とする)中にファイルを手動で転送するオプションは絶対に不便で、期待できません。一方、私はテスト履歴の価格のダイナミクスとの直接的な相関関係で口座指標のダイナミクスは、一般的に最も重要なものの一つであると誰とも議論する準備ができていることを宣言します。
読み込みモードでファイルを開くというメイン操作の可視性を、テスターのファイルのフォルダまで拡張することに何か問題があるのでしょうか? これでは、仮に脅威となるものさえないのでしょうか?
また、メインモードとテストモードの間で必要なデータを強制的にRAMに格納できないのは、何か問題があるのでしょうか?
ディスク上の任意のフォルダにファイルを書き込んだり、読み込んだりするためのDLLです。ファイルの書き込み、読み出し機能をDLLに移動させるだけで完了です。
...それなのに...Question!
テストモードで、強制的に狭くしたプログラム配列を書き込んで、その後にインジケータを作ることはできないのでしょうか?
ファイルを開くときにFILE_COMMON フラグを設定してみる -https://www.mql5.com/ru/docs/constants/io_constants/fileflags
識別子
価値
商品説明
ファイル_COMMON
4096
全クライアント端末の共有フォルダー内のファイルの位置。このフラグは、ファイルを開くとき (FileOpen()) 、ファイルをコピーするとき (FileCopy(),FileMove()) およびファイルの存在を確認するとき (FileIsExist()) に使用されます。
ファイルを開くときにFILE_COMMON フラグを指定してみる -https://www.mql5.com/ru/docs/constants/io_constants/fileflags
このスクリプトを実行し、どこに書き込まれるかを確認します。
jooさん、Rashさん、ありがとうございます
共有フォルダオプションは、より...を統合した。
ただ一つ驚いたのは、このコードを実行すると、書き込み自体は行われているにもかかわらず、書き込みに失敗した旨のメッセージがインジケータ内に表示されることです。さらに - まだ未解決の問題 正確にいつ、どのようにデータを書き込むのが良いのか(各目盛りに別々に、しかしそれはリソースを集中的に、または最後の最後で - 全体の配列、しかし配列書き込みで何かがまだかなり明確ではないと、それはOnCalculatedが抽出のためにこの場合に動作するかを理解するのは難しい - 第二に、それはテストの後にすでに通路が判明?)
そして、もうひとつ、やや話がそれますが、昨日すでに触れられた疑問についてです。
OnTickとOnCalculatedに挿入される。
が、テスト終了 後、オープニングとクロージングポジションに関連するオブジェクト(矢印とライン - Terminal: Charts>Objects>Objects Listで確認できます)があるにもかかわらず、なぜか戻り値が0になっています。ファイルへの書き込みはなるべく少ない方が良いので、整数配列で行うのが良い。測定頻度が1分以内でないと、チャートへの表示に支障をきたす(さらに、リソースを大量に消費することになる)。つまり、ランの終わりに。でも、それも可能なんです。
アルゴリズムは以下の通りです。
1) テスターでエキスパートを実行する。
2)関心のある価値を測定した。
3)ファイルに値を記録した。
4) 新しい値を記録したことを意味するtrueを別ファイルに書き込む。
5) 無限ループを開始し、終了条件はフラグファイルでfalseとする。
6) 別のチャートで、スクリプトがフラグ付きのファイルを読み、新しい値があれば、チャートにリスクを描き、ファイルに偽を書き込む。
テスターでのビジュアルモードのテストは、だいたいこんな感じです。
もう少し待てば、コンテストは終わり、もっとエレガントで美しいソリューションが提示されるかもしれません。
jooさん、Rashさん、ありがとうございます
共有フォルダオプションは、より...を統合した。
ただ一つ驚いたのは、このコードをインジケーター内で実行すると、書き込み自体は行われるものの、書き込みに失敗したというメッセージが表示されることです。
その出力が全く出ないんです。試してみてください。
何一つ得るものがない。ぜひ試してみてください。
ロッシュ
何が原因か分かりませんが、 私のインジケーターと違って、あなたので起動するとメッセージが出ます。現在、あなたのコードを元に、Equityの値を全てファイルに書き込む(書き込む0バイトを含む全ての値の出力のみを変更し、変数をグローバルにし、ファイルのオープンと書き込みをOnInitとOnTickに分割した)同様の簡易Expert Advisorを作りましたが、エラーは出ず、ファイルも作成されますが、レコードとファイルは空っぽです。