优化过程中的单一阵列计算 - 页 5

 
Yuri Evseenkov:
我这样做。我运行一个单一的测试。在这个测试过程中,我把数组写进一个文件。然后我在同一区域进行优化,但数组不是在每个条形或刻度上重新计算,而是从文件中读取。通过每周的开盘价进行的优化是即时的。如果没有文件操作,则需要几个小时。
我的情况略有不同。我只需要填充一次数组,并将其用于所有通道。也就是说,对我来说,即使每一次通过,在inite中填充一次数组都是一个很大的问题。
 
-Aleks-:

我明白了,也就是说,你可以把准备好的带数字的文件读成一个数组(我的例子),然后把它写成一个二进制文件,然后再使用它。

好吧,如果你需要从文件中读取10个数组的数据,那么你需要做一个分拣器,它将通过特殊数字来理解数组的结束,并填充下一个数组...因为每次都写数组的大小并不方便。

首先,我们向文件中写入一个带有数组大小 的int变量,然后是一个数组,然后是另一个带有大小的int变量,然后是一个数组,等等。

按照同样的顺序,我们读:读有大小的变量,读该大小的数组,下一个变量,数组,等等。

 
forexman77:
我有一个稍微不同的情况。我只需要填充一次数组,并将其用于我的所有通行证。也就是说,对我来说,即使是每一次通过,在inite中填充一次数组也是很多的。
因此,在一次测试中要填写一次。测试和优化期间的程序必须在文件 操作上有所区别。在测试期间,它在写,而在优化期间,它在读。必须写两个代码。 你说启动填充数组是一个很大的问题是什么意思?从文件中调用一个数组并不比例如打开一个订单或用双倍数进行乘法操作花费更多时间。
 
Yuri Evseenkov:
所以要填一次,做一次测试。测试和优化期间的程序必须在文件 操作上有所区别。在测试期间,它在写,而在优化期间,它在读。必须写两个代码。 你说启动填充数组是一个很大的问题是什么意思?从文件中调用一个数组并不比例如打开一个订单或用双倍数进行乘法操作花费更多时间。

很多原因是:我事先知道整个阵列。于是就出现了一个问题,即如何在两次传递之间保存这个阵列。我的理解是,它在下一次传递时被重置,尽管我不完全确定这一点。

我不同意在我的情况下阅读更快。如果我通过指标接收相同的数据,速度会更快,而当这些数据从文件中读取而不计算指标时,速度会明显下降。在一个行数为一千的小时间范围内,在一个大段的时间内,每次读取文件都是非常昂贵的。

我们的想法是:读取数据并将其写入一个数组,然后在所有的传递中只使用这个数组,也就是说,这个数组从第一次传递到最后一次都是完全一样的。

 
forexman77:

很多原因是:我事先知道整个阵列。于是就出现了一个问题,即如何在两次传递之间保存这个阵列。我的理解是,它在下一次传递时被重置,尽管我不完全确定这一点。

我不同意在我的情况下阅读更快。当我通过指标获得相同的数据时,速度比较快,而当我从文件中读取这些数据而不计算指标时,速度就会变慢。

我们的想法是:读取数据并将其放入一个数组,然后将这个数组用于所有的传递,也就是说,这个数组从第一次传递到最后一次传递都完全相同。

只有实践才能回答这个问题。每次读数组。 我长期以来一直在纠结于同样的问题。我优化了好几个小时。直到Andrey Khatimlansky建议我向文件中写 一次,然后再读。现在我必须等待一次通过的测试,然后优化就可以了。文件操作在科瓦廖夫的教程中有很好的描述。
 
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);
}/*******************************************************************/


在调试模式下运行两次,看看写和读数组需要多长时间。第一次运行将把数组写入文件,第二次将读取数组并开始打印数组中的日期。然后找出高亮部分,如果IS_DEBUG_MODE 应该被删除,如果IsOptimization()应该被插入到条件中。

 
-Aleks-:
这就是我感到没有教养的地方......如何将一个数组大小的int变量写入一个二进制文件中?也就是说,当从文件中读取时,如何能够识别这个变量?

有一个函数,类似FileWriteInteger()。通过位置识别,变量必须在文件的开头,读完后指针会移到它的末端,即移到数组的开头,读完数组后指针会在下一个变量之前......

一篇关于使用文件的文章很快就会出现。

 
Dmitry Fedoseev:

有一个函数,类似FileWriteInteger()。通过位置识别,变量必须在文件的开头,读完后指针会移到它的末端,即移到数组的开头,读完数组后指针会在下一个变量之前......

一篇关于使用文件的文章很快就会出现。

我明白,谢谢你。

但我想看一下代码,所以我等着看文章。