最適化中の単一アレイ計算 - ページ 5

 
Yuri Evseenkov:
私はこうしています。1つのテストを実行する。このテストでは、ファイルに配列を書き込んで います。その後、同じ領域で最適化を実行しますが、配列はバーまたはティックごとに再計算されず、ファイルから読み込まれます。週次での始値による最適化が瞬時に行えます。ファイル操作がなければ何時間もかかる。
私の場合は少し状況が違います。配列を一度埋めるだけで、すべてのパスでそれを使用することができます。つまり、私にとっては、パスごととはいえ、イナイレで1回配列を埋めるのは大変なことなのです。
 
-Aleks-:

なるほど、つまり桁の入ったレディファイルを配列に読み込んで(私の場合)、バイナリファイルに書き込んで、それを使えばいいんですね。

まあ、ファイルから10個の配列のデータを読み込む必要があるのなら、特殊な数字で配列の終わりを理解して、次の配列を埋めるソーターを作る必要があるのですが...。いちいち配列のサイズを書き込むのは面倒だからです。

まず、配列の大きさを 表すint型変数をファイルに書き込み、次に配列、さらに大きさを表すint型変数、そして配列、といった具合に書き込んでいきます。

同じ順番で、サイズのある変数を読む、このサイズの配列を読む、次の変数、配列、などと読みます。

 
forexman77:
私は少し変わった状況です。配列を一度埋めるだけで、すべてのパスでそれを使うことができるのです。つまり、私にとっては、パスごとにでも、イナートで一回配列を埋めるのは大変なことなのです。
だから、1回のテストで1回分埋める。テスト中のプログラムと最適化中のプログラムでは、ファイル 操作に違いが あるはずです。テスト時は書き込み、最適化時は読み込み。2つのコードを書き込む必要があります。 initing to fill array is lotとはどういう意味ですか?ファイルから配列を呼び出しても、例えばオーダーを開いたり、doubleを使った掛け算の演算と同じように時間がかかりません。
 
Yuri Evseenkov:
だから、1回のテストのために1回だけ充填する。テスト中のプログラムと最適化中のプログラムでは、ファイル 操作に違いが あるはずです。テスト時は書き込み、最適化時は読み込み。2つのコードを書き込む必要があります。 initing to fill array is lotとはどういう意味ですか?ファイルから配列を呼び出しても、例えばオーダーを開いたり、doubleを使った掛け算の演算と同じように時間がかかりません。

多くの理由:あらかじめ配列の全体像がわかっているから。そこで、この配列をパスとパスの間でどのように保存するかという問題が発生した。私の理解では、次のパスでリセットされると思うのですが、正確なところはわかりません。

私の場合、読書の方が早いというのは納得がいきません。同じデータをインジケータで受け取ると速くなり、インジケータを計算せずにファイルから読み込むと大幅に遅くなる。行数が1000行の小さなタイムフレームで、しかも大きなセグメントでは、毎回ファイルを読み込むのは非常にコストがかかる。

それは、データを読み込んで配列に書き込み、すべてのパスでこの配列だけを使う、つまり、最初のパスから最後のパスまで配列はまったく同じである、というものだった。

 
forexman77:

多くの理由:あらかじめ配列の全体像がわかっているから。そこで、この配列をパスとパスの間でどのように保存するかという問題が発生した。私の理解では、次のパスでリセットされると思うのですが、正確なところはわかりません。

私の場合、読書の方が早いというのは納得がいきません。同じデータをインジケータで取得すると速くなり、インジケータを計算せずにファイルから読み込むと遅くなるのです。

それは、データを読み込んで配列に格納し、この配列をすべてのパスで使用する、つまり、最初のパスから最後のパスまで配列がまったく同じになるようにする、というものでした。

この問いに答えるのは、練習あるのみです。パス毎に配列を読み取る。 私は長い間、同じ問題に悩まされてきました。何時間もかけて最適化していたんです。Andrey Khatimlanskyの提案で、一度ファイルに書き込んでから 読むようにしました。あとはワンススルーテストを待って、最適化はお預けです。ファイル操作については、Kovalevのチュートリアルによく書かれています。
 
Dmitry Fedoseev:

まず、配列のサイズを指定したint型変数をファイルに書き出し、次に配列を書き出し、さらにサイズを指定したint型変数をファイルに書き出し、次に配列を書き出す、といった具合です。

サイズを指定して変数を読み、そのサイズの配列を読み、次の変数、配列、といった順序で読みます。

ここに不勉強を感じる...。配列のサイズを 変数intとしてバイナリファイルに書き込むには?つまり、ファイルから読み込む際に、この変数をどのように特定することが可能でしょうか?
 
forexman77:

このアイデアは、データを読み込んで配列に入れ、すべてのパスでこの配列だけを使う、つまり、最初のパスから最後のパスまで配列はまったく同じである、というものでした。

MT4はファイル操作にとても時間がかかるので、MT5ではどうなるのか、特にバイナリファイルではどうなるのか...。

私はこの問題を、配列全体を直接書き込む関数で解決していますが、もちろん万能ではありません。

 

以下は、配列の書き込みと読み出しの例です。

datetime T[]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920,
   1278456660,1278540000,1278626400,1278712800,1280447880,1280527200,1280789220,1280959200,1281045720,1283292000,
   1283378400,1283812200,1285626300,1285887060,1286229600,1286316000,1286404740,1288133220,1288216860,1288305120,
   1288392420,1288648860,1288735200,1288741980,1288822080,1288994400,1290722460,1290809040,1291069320,1291329540,
   1293228420,1293577020,1293666300,1293746400,1295992800,1296079320,1296253680,1296514200,1296686940,1296770400,
   1298503260,1298592000,1298672280,1298931060,1300831920,1300917600,1301609160,1301696460,1303512420,1303768920
   };

datetime newT[];
int fileHandle;

/******************Expert initialization function*******************/
int OnInit()
{
   if((fileHandle = FileOpen("test", FILE_READ|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)// здесь поставь точку останова нажав клавиш F9
    {
     FileReadArray(fileHandle, newT);
      for(int i = 0; i < ArraySize(newT); i++)
       Print(i, " ", TimeToString(newT[i], TIME_DATE|TIME_SECONDS));
      FileClose(fileHandle);
    }
  else
   if(/*IsOptimization()*/IS_DEBUG_MODE && (fileHandle = FileOpen("test", FILE_WRITE|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)
    {
     FileWriteArray(fileHandle, T);
     FileClose(fileHandle);
    }
   return(INIT_SUCCEEDED);
}/*******************************************************************/


デバッグモードで2回実行し、配列の書き込みと読み出しにかかる時間を確認します。最初の実行では配列をファイルに書き込み、2回目の実行ではそれを読み込んで配列から日付の印字を開始します。そして、ハイライトされた部分、IS_DEBUG_MODEを 削除するかどうか、IsOptimization()を条件に挿入するかどうかを判断してください。

 
-Aleks-:
ここに不勉強を感じる...。バイナリファイルに配列サイズのint型変数を書き込むには?つまり、ファイルから読み込む際に、この変数をどのように特定することが可能でしょうか?

FileWriteInteger() のような関数があります。位置で識別する場合、変数はファイルの先頭になければならず、それを読んだ後、ポインタはその末尾、すなわち配列の先頭に移動し、配列を読んだ後、ポインタは次の変数の前にある...。

ファイルを使った作業に関する記事は近日公開予定です。

 
Dmitry Fedoseev:

FileWriteInteger()のような関数があります。位置で識別する場合、変数はファイルの先頭になければならず、それを読んだ後、ポインタはその末尾、つまり配列の先頭に移動し、配列を読んだ後、ポインタは次の変数の前にある...。

近々、ファイルを使った作業に関する記事が掲載される予定です。

わかりました、ありがとうございます。

でも、コードを見てみたいので、記事を待ちます。