学習ロジック - ページ 4

 

このインジケータのオリジナルのstart()関数は以下のとおりです。

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

この機能は、平均値の計算を使用します。標準機能に置き換える必要がある。

このように見えます。

//=================================================================================================
// Замена расчета среднего на стандартную функцию
//=================================================================================================
//   Старый вариант расчета
//      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);
//=================================================================================================

修正したインジケーターのバリエーションを添付します。

ファイル:
 

さて、インジケータのロジックそのものについてです(提案されたバージョンが理想的だとは言いません)。

私はもっと好きです

      // Вариант два. Убираем избыточные условия  и делаем одно обращение к функции
      
      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;
       } 
ファイル:
 
いい例ですね。ただ、それはロジックというより、最適化なのです。
 
denis_orlov:
良い例です。しかし、それは理屈よりも最適化のためです。


そして論理も、考える論理。

第三の選択肢は、指標の論理条件を完全に放棄することである。可能なのだろうか、という疑問が湧いてきます。

レッツトライ

このために、いくつかの論理変数を追加してみましょう。

現在、スタート関数のコード全体は

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);
}
ファイル:
 

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

どのようなロジックでこのセリフが存在するのでしょうか?

 
Roger:

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

どのようなロジックでこのセリフが存在するのでしょうか?


私のセリフではありません。それは、著者の

start()の最適なコード

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);
}
ファイル:
 

働き方の選択肢の比較分析

最適な選択肢その2。ブール条件は破棄できない

オプション5は、それを踏まえて

ファイル:
 

スクリプトのことをすっかり忘れていた

ファイル:
 
Vinin:

スクリプトのことをすっかり忘れていた

機知に富んだ方法、いただきます ))
 
Mathemat:

gip さんが批判された部分について補足します。


このように書けるのに、なぜブール変数に踊らされるのか理解できない。

   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);