Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 2065

 
Evgeny Chumakov :

Tarihte boşluk olmadığını ve tüm günlerde (Cuma günü daha az) 1440 dakika olduğunu varsayarsak, kod şöyle olmalıdır:

Eurosd'da bile boşluklar var. Bar zamanı ile çalışın
 
elibrarius :
Eurosd'da bile boşluklar var. Bar zamanı ile çalışın


Bu anlaşılabilir, eğer yapsaydı, o zaman yapardı. Bu sadece açıklamayı kolaylaştırmak için.

 

Bunun gibi bir şey işe yarıyor gibi görünüyor) Paradan tasarruf etmek için yeni sıra oranları[i].yüksek olarak toplanır.

 #property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00' ;   // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00' ;   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt" ; // text file name
//+------------------------------------------------------------------+
#define NM 1440
ulong NSM = 60 ;
ulong NSD = 60 * 1440 ;
//+------------------------------------------------------------------+
void OnStart ()
{
   MqlRates rates[];
   double vol[NM] = { 0.0 }, d;
   int n[NM] = { 0 }, t;
   int nprice = CopyRates ( Symbol (), PERIOD_M1 , tstart, tstop, rates);
   for ( int i = 0 ; i < nprice; ++i)
  {
    t = ( int )(((( ulong )rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
   for ( int i = 0 ; i < NM; ++i)
  {
     if (n[i] > 1 ) vol[i] /= n[i];
    vol[i] = sqrt (vol[i]);
  }
   for ( int i = 0 ; i < nprice; ++i)
  {
    t = ( int )(((( ulong )rates[i].time) % NSD) / NSM);
     if (vol[t] > 0 ) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
     if (i > 0 ) rates[i].high += rates[i - 1 ].high;
  }
   int ft = FileOpen (zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT );
   FileWriteString (ft, "t p" );
   for ( int i = 0 ; i < nprice; ++i)
     FileWriteString (ft, "\n" + ( string )(( ulong )rates[i].time) + " "   + ( string )rates[i].high);
   FileClose (ft);
}
 
Aleksey Nikolaev :

Bunun gibi bir şey işe yarıyor gibi görünüyor) Paradan tasarruf etmek için yeni sıra oranları[i].yüksek olarak toplanır.

Geçmiş çubukları, örneğin 2020.5.1 00:00'dan itibaren gelecekten, 2020.10.1 00:00'dan ve aradaki çubuklarla normalleştirirsiniz.
Gerçek hayatta, yapmazsın.
Her çubuktan yaklaşık olarak aynı hesaplamayı yapmak gerekir, ancak yalnızca onun için geçmiş çubuklardan.

 
Alexey Nikolaev :

Bunun gibi bir şey işe yarıyor gibi görünüyor) Paradan tasarruf etmek için yeni sıra oranları[i].yüksek olarak toplanır.

Bu doğru bir şekilde yapılsa bile, bu normalleştirilmiş mum yükseklikleri bir ağ / orman tarafından çok doğru bir şekilde geri yüklenebilir.
Özellik olarak, bir gün ofseti ile 60 mum yüksekliği sunuyoruz ve kodunuzda elde edilen normalleştirilmiş yükseklikleri eğitiyoruz.
Eğitim %100'e yakın bir doğrulukla alınmalıdır.

Onlar. Mumların normalize edilmiş yükseklikleri yeni bilgi taşımaz, ihtiyaç duyulursa model çoğalır ve bunları kendi içinde dikkate alır.
Tek faydası, model eğitimi için ekstra 60 özellik uygulamanıza gerek olmamasıdır, bunlar sizinkilerden biriyle değiştirilebilir.
Birinin çubukları 2 ay önce özellik olarak sunması pek olası değildir, yani. göndermeyenler için hala yeni bilgiler var).

Elbette bu normalize edilmiş mum yüksekliklerinin modelin performansını artırıp artırmadığını kontrol etmeniz gerekiyor, o zaman elbette kullanmanız gerekecek (ya özelliklerinizden biri tercih edilebilir, ya da 60 tanesinden oluşuyor).

 
Şimdiden bir kontrol edelim, yoksa üç sayfa yazdık, enerji harcadık, Allah korusun hata artışı yüzde yarım olsun.
 
elibrarius :

Garip. Merak ediyorum bu nasıl açıklanabilir?
Yorumladığım başka bir versiyonum var ama mantıklı sebeplerden dolayı beğenmedim:

Hangi RandomInteger() kullanıyorsunuz? Ben Xor'um.

Bunu nasıl açıklayacağımı bilmiyorum :)

bu işlevi aldım

 int RandomInteger( int max_vl)
{
   return ( int ) MathFloor (( MathRand ()+ MathRand ()* 32767.0 )/ 1073741824.0 *max_vl);   //случайное Int от 0 до  1073741824
}
 

Maxim, C ++ modelinin CatBoost'tan doğru şekilde yüklenmediğine dair bir şüphe var - bunu python modeliyle karşılaştırabilir misiniz?

Göstergelerin CPP modelinden alındığı MQL5'teki model yorumlama göstergelerine ve ikili modeldeki göstergelere katılmıyorum. 0.15 civarında Delta - ki bu çok fazla.

 
elibrarius :

Geçmiş çubukları, örneğin 2020.5.1 00:00'dan itibaren gelecekten, 2020.10.1 00:00'dan ve aradaki çubuklarla normalleştirirsiniz.
Gerçek hayatta, yapmazsın.
Her çubuktan yaklaşık olarak aynı hesaplamayı yapmak gerekir, ancak yalnızca onun için geçmiş çubuklardan.

Evet, geleceğe bir bakış ve hemen belli olmayan diğer sorunlar var. Doğrudan, doğrudan ticaret için bu tamamen geçerli değildir, ancak bir ön analiz için vazgeçilmez olan şeydir. Örneğin, normalleştirilmemiş artışlar arasındaki korelasyonu dikkate almak anlamsızdır.

 
Alexey Nikolaev :

Evet, geleceğe bir bakış ve hemen belli olmayan diğer sorunlar var. Doğrudan, doğrudan ticaret için bu tamamen geçerli değildir, ancak bir ön analiz için vazgeçilmez olan şeydir. Örneğin, normalleştirilmemiş artışlar arasındaki korelasyonu dikkate almak anlamsızdır.

Not alacağım, belki bir gün önceki çubuklar için yeniden yapacağım ve öğrenmeyi iyileştirip iyileştirmediğini kontrol edeceğim.
Birisi daha önce kontrol ederse - abonelikten çıkın.

Ön analiz nedir? Modeli girdiye gönderin ve karşılaştırın - bu özellik ile ve olmadan.

Bence son 30 dakikaya kadar normalleşmek daha iyi.
Alternatif olarak, bu günün son 30 dakikası ve her biri 30'ar dakikalık önceki 5 gün.

Mart ayındaki volatilitenin nasıl değiştiğine göre, opsiyonunuzun adapte olması çok uzun zaman alacak, bir-bir buçuk ay, mevcut değerler bir-iki ay öncesine göre çok daha yüksek olacak. Sonuç olarak, model bilinmeyen bölgede çalışacaktır. Tahminlerde bulunmak için bu tür çalışmaların örneklerine sahip olmayacak.

Geçen hafta normalleşirse, oyunun yeni kurallarını çabucak öğrenecek.