This website requires JavaScript.

独創的な新商品や役立つ無料商品の開発日記です!


BBands_Stopの改良(プログラマーのコダワリ)

2020年5月20日 23:18公開 / 2020年8月12日 12:47更新

BBands_Stopというインジケーターがあります。

ボリバンを利用してトレンドを表示する優れたインジケーターだと思いますが、ひとつ気になることがあります。

それはインジケーターをコンパイルするとエラーが出ることです。



「the size of local・・・」というのがエラーですが、配列の容量がデカすぎますよ!という警告です。

プログラムを見ると確かに無謀な設定をしてます(笑)

ま~、動けばいいっていう正義もありますが、いつ何時移り気なMetaQuotesがエラーを見逃さなくなるとも限りません。

(というか、このような大御所プログラムに問題があると解決したくなるのが私のサガなので・・・)

コンパイルしてもエラーが出ないようにプログラムを「修正」してみました。




興味のある方&自己責任にて試してみて下さい。



#property copyright "Nana"

#property link      "https://www.gogojungle.co.jp/users/111341"

#property indicator_chart_window

#property indicator_buffers 6

#property indicator_color1 Chartreuse

#property indicator_color2 Orange

#property indicator_color3 Chartreuse

#property indicator_color4 Orange

#property indicator_color5 Chartreuse

#property indicator_color6 Orange

//---- input parameters

extern int    Length=20;      // Bollinger Bands Period

extern int    Deviation=2;    // Deviation

extern double MoneyRisk=1.00; // Offset Factor

extern int    Signal=1;       // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;

extern int    Line=1;         // Display line mode: 0-no,1-yes  

extern int    Nbars=1000;

//---- indicator buffers

double UpTrendBuffer[];

double DownTrendBuffer[];

double UpTrendSignal[];

double DownTrendSignal[];

double UpTrendLine[];

double DownTrendLine[];

double smax[],smin[],bsmax[],bsmin[];


//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

  int init()

  {

//---- indicator line

   IndicatorBuffers(20);

   SetIndexBuffer(0,UpTrendBuffer);

   SetIndexBuffer(1,DownTrendBuffer);

   SetIndexBuffer(2,UpTrendSignal);

   SetIndexBuffer(3,DownTrendSignal);

   SetIndexBuffer(4,UpTrendLine);

   SetIndexBuffer(5,DownTrendLine);

   SetIndexStyle(0,DRAW_ARROW);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexStyle(3,DRAW_ARROW);

   SetIndexStyle(4,DRAW_LINE);

   SetIndexStyle(5,DRAW_LINE);

   SetIndexArrow(0,159);

   SetIndexArrow(1,159);

   SetIndexArrow(2,108);

   SetIndexArrow(3,108);

   SetIndexBuffer(10,smax);

   SetIndexBuffer(11,smin);

   SetIndexBuffer(12,bsmax);

   SetIndexBuffer(13,bsmin);   

//----

   return(0);

  }


//+------------------------------------------------------------------+

//| Bollinger Bands_Stop_v1                                          |

//+------------------------------------------------------------------+

int start()

  {

   int    shift,trend;

   //double smax[20000],smin[25000],bsmax[25000],bsmin[25000];

   

   for (shift=Nbars;shift>=0;shift--)

   {

   UpTrendBuffer[shift]=0;

   DownTrendBuffer[shift]=0;

   UpTrendSignal[shift]=0;

   DownTrendSignal[shift]=0;

   UpTrendLine[shift]=EMPTY_VALUE;

   DownTrendLine[shift]=EMPTY_VALUE;

   }

   

   for (shift=Nbars-Length-1;shift>=0;shift--)

   {

     smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);

  smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);

  if (Close[shift]>smax[shift+1]) trend=1; 

  if (Close[shift]<smin[shift+1]) trend=-1;

  if(trend>0 && smin[shift]<smin[shift+1]) smin[shift]=smin[shift+1];

  if(trend<0 && smax[shift]>smax[shift+1]) smax[shift]=smax[shift+1];

    

  bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

  bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

  if(trend>0 && bsmin[shift]<bsmin[shift+1]) bsmin[shift]=bsmin[shift+1];

  if(trend<0 && bsmax[shift]>bsmax[shift+1]) bsmax[shift]=bsmax[shift+1];

  

  if (trend>0) 

  {

     if (Signal>0 && UpTrendBuffer[shift+1]==-1.0)

     {

     UpTrendSignal[shift]=bsmin[shift];

     UpTrendBuffer[shift]=bsmin[shift];

     if(Line>0) UpTrendLine[shift]=bsmin[shift];

     }

     else

     {

     UpTrendBuffer[shift]=bsmin[shift];

     if(Line>0) UpTrendLine[shift]=bsmin[shift];

     UpTrendSignal[shift]=-1;

     }

  if (Signal==2) UpTrendBuffer[shift]=0;   

  DownTrendSignal[shift]=-1;

  DownTrendBuffer[shift]=-1.0;

  DownTrendLine[shift]=EMPTY_VALUE;

  }

  if (trend<0) 

  {

  if (Signal>0 && DownTrendBuffer[shift+1]==-1.0)

     {

     DownTrendSignal[shift]=bsmax[shift];

     DownTrendBuffer[shift]=bsmax[shift];

     if(Line>0) DownTrendLine[shift]=bsmax[shift];

     }

     else

     {

     DownTrendBuffer[shift]=bsmax[shift];

     if(Line>0)DownTrendLine[shift]=bsmax[shift];

     DownTrendSignal[shift]=-1;

     }

  if (Signal==2) DownTrendBuffer[shift]=0;    

  UpTrendSignal[shift]=-1;

  UpTrendBuffer[shift]=-1.0;

  UpTrendLine[shift]=EMPTY_VALUE;

  }

  

}

return(0);

 }







2020年5月20日 23:18公開/ 2020年8月12日 12:47更新

0


Nana

MT4プログラムの可能性を追求してます。 インジケーターやEAを構成するMQL言語って本当に可能性が高く、出来ないこと以外は全部出来る!そんな感動を覚えますw こんなことできるか?というお問合せをお待ちしてます。 mt4nana@gmail.com また、多くの方に使って頂き、磨かれた自慢のオリジナル商品もよろしくお願いします。 https://www.gogojungle.co.jp/users/111341