Optimizasyon sırasında tek seferlik dizi hesaplaması - sayfa 5

 
Yuri Evseenkov :
öyle yaparım. Tek seferlik bir test yapıyorum. Bu testte dizileri bir dosyaya yazıyorum . Sonra aynı bölümde optimizasyon yapıyorum, ancak şimdi diziler her bir çubuğun veya işaretin görünümünde yeniden hesaplanmıyor, dosyadan okunuyor. Haftalık periyotlarda açılış fiyatları ile optimizasyon anında gerçekleşir. Ve dosya işlemleri olmadan saatlerce sürer.
Biraz farklı bir durumum var. Diziyi yalnızca bir kez doldurmam ve tüm geçişlerde kullanmam gerekiyor. Yani benim için her geçişte bir kez bile init'teki diziyi doldurmak çok fazla.
 
-Aleks- :

Anlaşıldı, yani sayılar içeren bitmiş dosya bir dizide okunabilir (benim durumum), daha sonra bir ikili dosyaya yazılabilir ve sonra kullanılabilir.

Peki, bir dosyadan 10 diziden veri okumanız gerekiyorsa, o zaman dizinin sonunu özel bir sayı ile anlayacak ve bir sonraki diziyi dolduracak bir sıralayıcı yapmanız gerekir ... çünkü manuel olarak yazmak uygun değildir. her seferinde dizinin boyutu.

İlk olarak, dosyaya dizinin boyutunda bir int değişkeni, ardından bir dizi, ardından boyutu olan başka bir int değişkeni, ardından bir dizi vb.

Aynı sırayla okuyoruz: bir boyuta sahip bir değişken saydık, bu boyuttaki bir diziyi, bir sonraki değişkeni, bir diziyi vb. saydık.

 
forexman77 :
Biraz farklı bir durumum var. Diziyi yalnızca bir kez doldurmam ve tüm geçişlerde kullanmam gerekiyor. Yani, benim için, her geçişte bir kez bile, bir init'te bir diziyi doldurmak çok fazla.
Peki, tek bir testle bir kez doldurun. Test ve optimizasyon sırasındaki programlar dosya işlemlerinde farklılık göstermelidir . Test ederken bu bir yazmadır ve optimize ederken bir okumadır. İki kod yazılması gerekiyor. Bir diziyi init ile çok doldurmak ne anlama gelir? Bir dosyadan dizi çağırmak, bence, örneğin bir sipariş açmaktan veya double ile çarpmaktan daha fazla zaman almaz.
 
Yuri Evseenkov :
Peki, tek bir testle bir kez doldurun. Test ve optimizasyon sırasındaki programlar dosya işlemlerinde farklılık göstermelidir . Test ederken bu bir yazmadır ve optimize ederken bir okumadır. İki kod yazılması gerekiyor. Bir diziyi init ile çok doldurmak ne anlama gelir? Bir dosyadan dizi çağırmak, bence, örneğin bir sipariş açmaktan veya double ile çarpmaktan daha fazla zaman almaz.

Bunun bir çok nedeni var: Tüm diziyi önceden biliyorum. Ve böylece geçişler arasında bu dizinin nasıl kaydedileceği sorusu ortaya çıktı. Bundan tam olarak emin olmasam da bir sonraki geçişte sıfırlandığını anlıyorum.

Benim durumumda okumanın daha hızlı olduğuna katılmıyorum. Aynı verileri göstergeler üzerinden aldığımda hız daha hızlı oluyor ve bu hazırlanan verileri gösterge hesaplamadan bir dosyadan okuduğumda önemli ölçüde düşüyor. Bin satırlık küçük bir zaman diliminde ve büyük bir segmentte, her seferinde dosyanın okunması çok pahalıdır.

Fikir şuydu: verileri okumak ve diziye koymak ve tüm geçişlerde yalnızca bu diziyi kullanın, yani dizi ilk geçişten sonuncuya kadar kesinlikle aynıdır.

 
forexman77 :

Bunun bir çok nedeni var: Tüm diziyi önceden biliyorum. Ve böylece geçişler arasında bu dizinin nasıl kaydedileceği sorusu ortaya çıktı. Bundan tam olarak emin olmasam da bir sonraki geçişte sıfırlandığını anlıyorum.

Benim durumumda okumanın daha hızlı olduğuna katılmıyorum. Aynı verileri göstergeler üzerinden aldığımda hız daha hızlı oluyor ve bu hazırlanan verileri gösterge hesaplamadan bir dosyadan okuduğumda önemli ölçüde düşüyor.

Fikir şuydu: verileri okumak ve diziye girmek ve tüm geçişlerde, yalnızca bu diziyi kullanın, yani dizi ilk geçişten sonuncuya kadar kesinlikle aynıdır.

Burada sadece pratik cevap verecektir. Her geçişte diziyi okuyun. Ben de aynı acıyı uzun süre yaşadım. Optimize etmek saatler sürdü. Şimdiye kadar, Andrey Khatimlyansky dosyaya bir kez yazıp sonra okumayı önermedi. Şimdi tek bir test için bir kez beklemeniz gerekiyor ve ardından optimizasyon gerçekleşiyor. Dosya işlemleri Kovalev'in ders kitabında iyi anlatılmıştır.
 
Dmitry Fedoseev :

İlk olarak, dosyaya dizinin boyutunda bir int değişkeni, ardından bir dizi, ardından boyutu olan başka bir int değişkeni, ardından bir dizi vb.

Aynı sırayla okuyoruz: bir boyuta sahip bir değişken saydık, bu boyuttaki bir diziyi, bir sonraki değişkeni, bir diziyi vb. saydık.

Burada kendimi eğitimsiz hissediyorum ... bir ikili dosyaya dizi boyutunda bir int değişkeni nasıl yazılır? Onlar. bir dosyadan okurken bu değişkeni tanımlamak nasıl mümkün olacak?
 
forexman77 :

Fikir şuydu: verileri okumak ve diziye girmek ve tüm geçişlerde, yalnızca bu diziyi kullanın, yani dizi ilk geçişten sonuncuya kadar kesinlikle aynıdır.

MT4'te gerçekten dosyalarla çalışmak çok yavaş, MT5'te nasıl olacağını bilmiyorum ve hatta bir ikili dosyada bile...

Benzer bir sorunu, tüm diziyi doğrudan kodun içine yazarak çözüyorum - ama bu elbette evrensel bir çözüm değil.

 

İşte bir dizi yazma ve okuma örneği

 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 );
} /*******************************************************************/


Hata ayıklama modunda iki kez çalıştırın ve diziyi yazmanın ve okumanın ne kadar sürdüğünü görün. İlk çalıştırma diziyi bir dosyaya yazar ve ikinci çalıştırma onu okur ve diziden tarihleri yazdırmaya başlar. Ardından seçilen parça ile ilgilenin, IS_DEBUG_MODE'u kaldırmanız ve duruma IsOptimization () eklemenin gerekli olup olmadığı ile ilgilenin

 
-Aleks- :
Burada kendimi eğitimsiz hissediyorum ... bir ikili dosyaya dizi boyutunda bir int değişkeni nasıl yazılır? Onlar. bir dosyadan okurken bu değişkeni tanımlamak nasıl mümkün olacak?

FileWriteInteger() gibi işlevler vardır. Yere göre tanımlayın, değişken dosyanın başında olmalıdır, okuduktan sonra işaretçi sonuna hareket eder, yani. dizinin başına, diziyi okuduktan sonra, işaretçi bir sonraki değişkenin önünde olacaktır...

Dosyalarla çalışma hakkında yakında makale geliyor.

 
Dmitry Fedoseev :

FileWriteInteger() gibi işlevler vardır. Yere göre tanımlayın, değişken dosyanın başında olmalıdır, okuduktan sonra işaretçi sonuna hareket eder, yani. dizinin başına, diziyi okuduktan sonra, işaretçi bir sonraki değişkenin önünde olacaktır...

Dosyalarla çalışma hakkında yakında makale geliyor.

anladım teşekkürler.

Ancak kodda bir göz atmak istiyorum - makaleyi bekleyeceğim.