Öğrenme mantığı - sayfa 4

 

İşte bu göstergeden orijinal start() işlevi

 int start()
{
   int limit;
   double a;
   int counted_bars = IndicatorCounted();
   if (counted_bars < 0 ) return (- 1 );
   if (counted_bars > 0 ) counted_bars--;
   limit = Bars - counted_bars;
   for ( int i = 0 ; i < limit; i++)
    {
       for ( int j = 0 ; j < nPeriod; j++)
       {
         a = a + (iHigh( NULL , 0 , i + j) + iLow( NULL , 0 , i + j) + iClose( NULL , 0 , i + j) * 2 ) / 4 ;
       }       
      MaBuffer[i]  =  a / nPeriod;
      a = 0 ;
       if (iClose( NULL , 0 , i) > MaBuffer[i])
       {
         MaTUp[i] = MaBuffer[i] + iATR ( NULL , 0 , nPeriod, i) * Deviation;
         MaTDn[i] = MaBuffer[i] - iATR ( NULL , 0 , nPeriod, i);
       }  
       else if (iClose( NULL , 0 , i) < MaBuffer[i])
       {
         MaTDn[i] = MaBuffer[i] - iATR ( NULL , 0 , nPeriod, i) * Deviation;
         MaTUp[i] = MaBuffer[i] + iATR ( NULL , 0 , nPeriod, i);
       } 
       else if (iClose( NULL , 0 , i) == MaBuffer[i])
       {
         MaTDn[i] = MaBuffer[i] - iATR ( NULL , 0 , nPeriod, i) * Deviation;
         MaTUp[i] = MaBuffer[i] + iATR ( NULL , 0 , nPeriod, i) * Deviation;
       }  
    }  
   //-----
   return ( 0 );
}

İşlev, ortalamanın hesaplanmasını kullanır. Bu yüzden standart bir işlevle değiştirilmesini ister.

Aşağı yukarı böyle

 //=================================================================================================
// Замена расчета среднего на стандартную функцию
//=================================================================================================
//   Старый вариант расчета
//      for(int j = 0; j < nPeriod; j++)
//       {
//         a = a + (iHigh(NULL, 0, i + j) + iLow(NULL, 0, i + j) + iClose(NULL, 0, i + j) * 2) / 4;
//       }       
//      MaBuffer[i]  =  a / nPeriod;
//      a = 0;
//=================================================================================================
//   Новый вариант расчета

      MaBuffer[i]= iMA ( NULL , 0 , nPeriod, 0 , MODE_SMA , PRICE_WEIGHTED ,i);
//=================================================================================================

Ekli göstergenin düzeltmeli bir versiyonudur

Dosyalar:
 

Şimdi göstergenin mantığına geçelim (önerilen seçeneğin ideal olduğunu söylemiyorum)

sadece onu daha çok seviyorum

       // Вариант два. Убираем избыточные условия  и делаем одно обращение к функции
      
      atr= iATR ( NULL , 0 , nPeriod, i);
      MaTDn[i] = MaBuffer[i] - atr * Deviation;
      MaTUp[i] = MaBuffer[i] + atr * Deviation;

       if (iClose( NULL , 0 , i) > MaBuffer[i])
       {
         MaTDn[i] = MaBuffer[i] - atr;
       }  
       else if (iClose( NULL , 0 , i) < MaBuffer[i])
       {
         MaTUp[i] = MaBuffer[i] + atr;
       } 
Dosyalar:
 
İyi örnek. Sadece bu, mantıktan çok optimizasyonla ilgilidir.
 
denis_orlov :
İyi örnek. Sadece bu, mantıktan çok optimizasyonla ilgilidir.


Ve mantık da, düşünmenin mantığı.

Üçüncü seçenek, göstergedeki mantıksal koşulları tamamen terk etmektir. Soru ortaya çıkıyor - mümkün mü?

Hadi deneyelim

Bunu yapmak için birkaç boole değişkeni ekleyin

Başlatma fonksiyonunun tüm kodu bu hale geldi.

 int start()
{
   int limit;
   double atr;
   bool bUP, bDN;
   int counted_bars = IndicatorCounted();
   if (counted_bars < 0 ) return (- 1 );
   if (counted_bars > 0 ) counted_bars--;
   limit = Bars - counted_bars;
   for ( int i = 0 ; i < limit; i++)
    {

      MaBuffer[i]= iMA ( NULL , 0 , nPeriod, 0 , MODE_SMA , PRICE_WEIGHTED ,i);

       // Вариант три. 
      
      atr= iATR ( NULL , 0 , nPeriod, i);
      bUP=Close[i] < MaBuffer[i];
      bDN=Close[i] > MaBuffer[i];
      MaTDn[i] = MaBuffer[i] - atr - atr * (Deviation - 1.0 ) * bUP;
      MaTUp[i] = MaBuffer[i] + atr + atr * (Deviation - 1.0 ) * bDN;

    }  
   //-----
   return ( 0 );
}
Dosyalar:
 

if(counted_bars < 0) return(-1);

Bu çizgi hangi mantığa göre var?

 
Roger :

if(counted_bars < 0) return(-1);

Bu çizgi hangi mantığa göre var?


Bu benim hattım değil. Bu telif hakkı

start() işlevi için en uygun kod

 int start()
{
   int limit;
   double atr;
   int counted_bars = IndicatorCounted();
   
   limit = Bars - counted_bars- 1 ;
   if ( Bars - counted_bars > 2 ) limit = Bars - nPeriod- 1 ;

   for ( int i = limit; i >= 0 ; i--)
    {
      MaBuffer[i]= iMA ( NULL , 0 , nPeriod, 0 , MODE_SMA , PRICE_WEIGHTED ,i);
      atr= iATR ( NULL , 0 , nPeriod, i);

      MaTDn[i] = MaBuffer[i] - iATR ( NULL , 0 , nPeriod, i) * Deviation;
      MaTUp[i] = MaBuffer[i] + iATR ( NULL , 0 , nPeriod, i) * Deviation;

       if (iClose( NULL , 0 , i) > MaBuffer[i])
       {
         MaTDn[i] = MaBuffer[i] - iATR ( NULL , 0 , nPeriod, i);
       }  
       else if (iClose( NULL , 0 , i) < MaBuffer[i])
       {
         MaTUp[i] = MaBuffer[i] + iATR ( NULL , 0 , nPeriod, i);
       } 

    }  
   //-----
   return ( 0 );
}
Dosyalar:
 

İş seçeneklerinin karşılaştırmalı analizi

Optimum seçenek numarası 2. Mantıksal koşulları reddedemezsiniz

Seçenek 5 temelinde yapıldı

Dosyalar:
 

Senaryoyu tamamen unutmuşum.

Dosyalar:
 
Vinin :

Senaryoyu tamamen unutmuşum.

esprili yöntem, alıyorum))
 
Mathemat :

gip'i eleştiren bölüm hakkında şunu ekleyeceğim:


Böyle yazabildiğiniz zaman, neden boole değişkenleri etrafında böyle danslar yaptığı kesinlikle açık değil:

   showEUR  = ( StringFind ( Symbol (), "EUR" , 0 ) != - 1 );
   showUSD  = ( StringFind ( Symbol (), "USD" , 0 ) != - 1 );
   showGBP  = ( StringFind ( Symbol (), "GBP" , 0 ) != - 1 );
   showCHF  = ( StringFind ( Symbol (), "CHF" , 0 ) != - 1 );
   showJPY  = ( StringFind ( Symbol (), "JPY" , 0 ) != - 1 );