MQL5による株式発振器とは - ページ 5

 
joo:

以下は、ファイルから読み込むコードです。

なぜFileReadString() のか?

FileReadArray() を使えば、 ループは必要 ない。

 
Serj_Che:

なぜFileReadString()なのか?

FileReadArray() を使えば、 ループする 必要はないのでは?

もしかしたら、その方がいいのかもしれません。慣れたもんだ。:)
 

ロッシュ
エクイティ値をファイルに書き込む。そして、その値でインジケータを構築する。ただし、データファイルは手動で移動する必要があります。 テスト中はAgent_name/MQL5/Files フォルダにファイルが書き込まれます。

今になって、すべてが複雑であることに気づきました。

しかし、何百ものテストを行うのですから、手作業では明らかに解決になりません。

そして、最初のうちは使えるデータがあるのだが......あ、ミラクル! と思える。- プログラムはそのように設計されているので、プログラムで取り出して使用するまで、何らかの方法でどこかに保存する可能性はありません。

私はプロのプログラマーではありませんが、この状況は理解しがたいものです。

巨大なドキュメント...、構築における膨大な可能性、それは、あらゆるもの、あらゆるもの...、メモリ管理、OOP、そしてここで、根本的にシンプルで決定的に必要なもの(これは、私がすでに説明したと思いますが)-デッドロックです。

...それなのに...Question!

テストモードで、強制的に消去可能なプログラム配列を書き込んで、それを使ってインジケータを作ることはできないのでしょうか?

そのような配列へのポインタをグローバル変数に 渡す可能性も含めて?

また、現在の実装の問題ではなく、原理的にテスト段階から本番までのデータの保存や転送の問題はどうなっているのでしょうか?

レナートは数百メガバイトのデータについて言及しましたが、第一に、プログラマーが明示的に望んだ場合にのみその可能性を提供できるのに、なぜ常にデータを再ロードしなければならないのか、第二に、目下の課題という点ではデータ量ははるかに少なく、数千桁にすぎません。

もう一度言いますが、ユーザーの立場からすると、複数のテスト(そして市場は、その複雑さのために、複数のテストを必要とする)中にファイルを手動で転送するオプションは絶対に不便で、期待できません。一方、私はテスト履歴の価格のダイナミクスとの直接的な相関関係で口座指標のダイナミクスは、一般的に最も重要なものの一つであると誰とも議論する準備ができていることを宣言します。

読み込みモードでファイルを開くというメイン操作の可視性を、テスターのファイルのフォルダまで拡張することに何か問題があるのでしょうか? これでは、仮に脅威となるものさえないのでしょうか?

また、メインモードとテストモードの間で必要なデータを強制的にRAMに格納できないのは、何か問題があるのでしょうか?

 

ディスク上の任意のフォルダにファイルを書き込んだり、読み込んだりするためのDLLです。ファイルの書き込み、読み出し機能をDLLに移動させるだけで完了です。

 
DV2010:

...それなのに...Question!

テストモードで、強制的に狭くしたプログラム配列を書き込んで、その後にインジケータを作ることはできないのでしょうか?


ファイルを開くときにFILE_COMMON フラグを設定してみる -https://www.mql5.com/ru/docs/constants/io_constants/fileflags

識別子

価値

商品説明

ファイル_COMMON

4096

全クライアント端末の共有フォルダー内のファイルの位置。このフラグは、ファイルを開くとき (FileOpen()) 、ファイルをコピーするとき (FileCopy(),FileMove()) およびファイルの存在を確認するとき (FileIsExist()) に使用されます。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов - Документация по MQL5
 
Rosh:

ファイルを開くときにFILE_COMMON フラグを指定してみる -https://www.mql5.com/ru/docs/constants/io_constants/fileflags

このスクリプトを実行し、どこに書き込まれるかを確認します。

//+------------------------------------------------------------------+
//|                                             Demo_File_Common.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string   filename="file_common.txt";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }

  }
//+------------------------------------------------------------------+
 

jooさん、Rashさん、ありがとうございます

共有フォルダオプションは、より...を統合した。

ただ一つ驚いたのは、このコードを実行すると、書き込み自体は行われているにもかかわらず、書き込みに失敗した旨のメッセージがインジケータ内に表示されることです。さらに - まだ未解決の問題 正確にいつ、どのようにデータを書き込むのが良いのか(各目盛りに別々に、しかしそれはリソースを集中的に、または最後の最後で - 全体の配列、しかし配列書き込みで何かがまだかなり明確ではないと、それはOnCalculatedが抽出のためにこの場合に動作するかを理解するのは難しい - 第二に、それはテストの後にすでに通路が判明?)

そして、もうひとつ、やや話がそれますが、昨日すでに触れられた疑問についてです。

OnTickとOnCalculatedに挿入される。

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
が、テスト終了 後、オープニングとクロージングポジションに関連するオブジェクト(矢印とライン - Terminal: Charts>Objects>Objects Listで確認できます)があるにもかかわらず、なぜか戻り値が0になっています。
 

ファイルへの書き込みはなるべく少ない方が良いので、整数配列で行うのが良い。測定頻度が1分以内でないと、チャートへの表示に支障をきたす(さらに、リソースを大量に消費することになる)。つまり、ランの終わりに。でも、それも可能なんです。

アルゴリズムは以下の通りです。

1) テスターでエキスパートを実行する。

2)関心のある価値を測定した。

3)ファイルに値を記録した

4) 新しい値を記録したことを意味するtrueを別ファイルに書き込む。

5) 無限ループを開始し、終了条件はフラグファイルでfalseとする。

6) 別のチャートで、スクリプトがフラグ付きのファイルを読み、新しい値があれば、チャートにリスクを描き、ファイルに偽を書き込む。


テスターでのビジュアルモードのテストは、だいたいこんな感じです。

もう少し待てば、コンテストは終わり、もっとエレガントで美しいソリューションが提示されるかもしれません。

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
DV2010:

jooさん、Rashさん、ありがとうございます

共有フォルダオプションは、より...を統合した。

ただ一つ驚いたのは、このコードをインジケーター内で実行すると、書き込み自体は行われるものの、書き込みに失敗したというメッセージが表示されることです。

その出力が全く出ないんです。試してみてください。

//+------------------------------------------------------------------+
//|                                   Demo_File_Common_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double buffer[];
input string   filename="file_common.txt";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,buffer,INDICATOR_DATA);

   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Rosh:

何一つ得るものがない。ぜひ試してみてください。

ロッシュ

何が原因か分かりませんが 私のインジケーターと違って、あなたので起動するとメッセージが出ます。

2011.01.21 13:52:53     Core 1  2011.01.14 00:00:00   Expert removed because indicator 43 cannot load [4002]

現在、あなたのコードを元に、Equityの値を全てファイルに書き込む(書き込む0バイトを含む全ての値の出力のみを変更し、変数をグローバルにし、ファイルのオープンと書き込みをOnInitとOnTickに分割した)同様の簡易Expert Advisorを作りましたが、エラーは出ず、ファイルも作成されますが、レコードとファイルは空っぽです。

#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;

void OnInit(){
   Expert1.Init();
   //--
   filename="equity.txt";
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
}
void OnTick(){
   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());
   }  
}
void OnDeinit(const int reason){
   Expert1.Deinit();
   //---
   FileClose(filename);
}

2011.01.21 14:00:46     Core 1  connect closed
2011.01.21 14:00:46     Core 1  log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written
2011.01.21 14: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.21 14:00:46     Core 1  OnTester result 0
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.21 14:00:46     Core 1  2011.01.14 22:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01.21 14:00:46     Core 1  2011.01.14 21:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common