セミナーサポート掲示板

山中康司が行ったセミナーサポート掲示板です。セミナー内容等に関する質問(タイトルは質問内容を示すもので)にご利用ください。関係の無い書き込み、宣伝、スパムは断りなく削除します。

*ツール関連の質問は明示をお願いします(MT4の場合、Forex.com、楽天証券の別も)。
*質問投稿後、元の質問を削除する行為は慎んでください。スパムと見做し、以後の書き込み禁止措置を取る場合があります。
*スパム投稿が増えた場合、公開時のチェック、投稿制限を実施します。

スレッド全件表示

スーパーボリンジャーのカスタムインディケータ

  • モリサワ
  • 投稿日:2013/05/04 23:15

お世話になります。

スーパーボリンジャーのカスタムインディケータを作ろうと思い、手探りで下記まで辿り着き、とりあえずチャートに適用してみたのですが、+2、+3σが表示されません。遅行スパンの記述方法もわからないので行き詰まっています。
間違っている個所と遅行スパンの記述方法をどうか教えて下さい。

よろしくお願いいたします。


#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen
#property indicator_color4 LightSeaGreen
#property indicator_color5 LightSeaGreen
#property indicator_color6 LightSeaGreen
#property indicator_color7 LightSeaGreen
//---- indicator parameters
extern int BandsPeriod=21;
extern int BandsShift=0;
extern double BandsDeviations1=1.0;
extern double BandsDeviations2=2.0;
extern double BandsDeviations3=3.0;
//---- buffers
double MovingBuffer[];
double UpperBuffer1[];
double LowerBuffer1[];
double UpperBuffer2[];
double LowerBuffer2[];
double UpperBuffer3[];
double LowerBuffer3[];

  • 1.モリサワ
  • 投稿日:2013/05/04 23:18

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,MovingBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,UpperBuffer1);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,LowerBuffer1);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,LowerBuffer2);
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,LowerBuffer2);
SetIndexStyle(5,DRAW_LINE);
SetIndexBuffer(5,LowerBuffer3);
SetIndexStyle(6,DRAW_LINE);
SetIndexBuffer(6,LowerBuffer3);
//----
SetIndexDrawBegin(0,BandsPeriod+BandsShift);
SetIndexDrawBegin(1,BandsPeriod+BandsShift);
SetIndexDrawBegin(2,BandsPeriod+BandsShift);
SetIndexDrawBegin(3,BandsPeriod+BandsShift);
SetIndexDrawBegin(4,BandsPeriod+BandsShift);
SetIndexDrawBegin(5,BandsPeriod+BandsShift);
SetIndexDrawBegin(6,BandsPeriod+BandsShift);
//----
return(0);
}

  • 2.モリサワ
  • 投稿日:2013/05/04 23:20

//+------------------------------------------------------------------+
//| Bollinger Bands |
//+------------------------------------------------------------------+
int start()
{
int i,k,counted_bars=IndicatorCounted();
double deviation;
double sum,oldval,newres;
//----
if(Bars<=BandsPeriod) return(0);
//---- initial zero
if(counted_bars<1)
for(i=1;i<=BandsPeriod;i++)
{
MovingBuffer[Bars-i]=EMPTY_VALUE;
UpperBuffer1[Bars-i]=EMPTY_VALUE;
LowerBuffer1[Bars-i]=EMPTY_VALUE;
UpperBuffer2[Bars-i]=EMPTY_VALUE;
LowerBuffer2[Bars-i]=EMPTY_VALUE;
UpperBuffer3[Bars-i]=EMPTY_VALUE;
LowerBuffer3[Bars-i]=EMPTY_VALUE;
}
//----
int limit=Bars-counted_bars;
if(counted_bars>0) limit++;
for(i=0; i<limit; i++)
MovingBuffer[i]=iMA(NULL,0,BandsPeriod,BandsShift,MODE_SMA,PRICE_CLOSE,i);
//----
i=Bars-BandsPeriod+1;
if(counted_bars>BandsPeriod-1) i=Bars-counted_bars-1;
while(i>=0)
{
sum=0.0;
k=i+BandsPeriod-1;
oldval=MovingBuffer[i];
while(k>=i)
{
newres=Close[k]-oldval;
sum+=newres*newres;
k--;
}
deviation=BandsDeviations1*MathSqrt(sum/BandsPeriod);
UpperBuffer1[i]=oldval+deviation;
LowerBuffer1[i]=oldval-deviation;
deviation=BandsDeviations2*MathSqrt(sum/BandsPeriod);
UpperBuffer2[i]=oldval+deviation;
LowerBuffer2[i]=oldval-deviation;
deviation=BandsDeviations3*MathSqrt(sum/BandsPeriod);
UpperBuffer3[i]=oldval+deviation;
LowerBuffer3[i]=oldval-deviation;
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+

  • 3.fenwick
  • 投稿日:2013/05/05 00:17

>>1
Ctrl+D でデータ・ウィンドウを表示させると、何処が悪いかが判って、遡って行くと大元が判るんじゃないかと思いますよ。

遅行スパンは、一目均衡表のインジケータに書かれていると思いますよ。

  • 4.fenwick
  • 投稿日:2013/05/05 00:44

>>1
誰もがついやっちゃううっかりミスであり、見つけ難いミスでもあるかな。

  • 5.fenwick
  • 投稿日:2013/05/05 08:30

>>1
間違いがあるのは、int init() のブロックですよ。

  • 6.山中
  • 投稿日:2013/05/05 10:45

>>5
fenwickさん、いつもありがとうございます。

モリサワさん、よく見るとわかると思いますが、後ほど、もっとシンプルに表示するコードを上げてみます。

ちなみに遅行スパンは、iCloseを25本シフトする方法、iMAで期間を1として25本シフトする方法、iIchimokuで遅行スパンを表示する方法の3つの表示方法があると思います。

  • 7.山中
  • 投稿日:2013/05/05 10:48

>>6
あと、既存の指標を組み合わせるだけでしたら、わざわざ指標を作るよりもテンプレートで表示させる方がはるかに簡単です。

  • 8.山中
  • 投稿日:2013/05/05 12:00

サンプルは以下の通りです。適当に編集してみてください。

// Custom Indicator Template (Yamanaka)
string indName="Boll_CS";

//buffer
#property indicator_chart_window
#property indicator_buffers 8
double Buf0[];
double Buf1[];
double Buf2[];
double Buf3[];
double Buf4[];
double Buf5[];
double Buf6[];
double Buf7[];

//parameter
extern int MAPeriod=20;
extern int Chiko=25;

//init
int init()
{
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,Blue);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,Green);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1,Green);
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1,Red);
SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1,Red);
SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,1,LightBlue);
SetIndexStyle(6,DRAW_LINE,STYLE_SOLID,1,LightBlue);
SetIndexStyle(7,DRAW_LINE,STYLE_SOLID,1,Magenta);
SetIndexBuffer(0,Buf0);
SetIndexBuffer(1,Buf1);
SetIndexBuffer(2,Buf2);
SetIndexBuffer(3,Buf3);
SetIndexBuffer(4,Buf4);
SetIndexBuffer(5,Buf5);
SetIndexBuffer(6,Buf6);
SetIndexBuffer(7,Buf7);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
return(0);
}

//indicator
int start()
{
int i,Counted_bars;
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
while(i>=0)
{
Buf0[i]=iBands(NULL,0,MAPeriod,1,0,PRICE_CLOSE,MODE_MAIN,i);
Buf1[i]=iBands(NULL,0,MAPeriod,1,0,PRICE_CLOSE,MODE_UPPER,i);
Buf2[i]=iBands(NULL,0,MAPeriod,1,0,PRICE_CLOSE,MODE_LOWER,i);
Buf3[i]=iBands(NULL,0,MAPeriod,2,0,PRICE_CLOSE,MODE_UPPER,i);
Buf4[i]=iBands(NULL,0,MAPeriod,2,0,PRICE_CLOSE,MODE_LOWER,i);
Buf5[i]=iBands(NULL,0,MAPeriod,3,0,PRICE_CLOSE,MODE_UPPER,i);
Buf6[i]=iBands(NULL,0,MAPeriod,3,0,PRICE_CLOSE,MODE_LOWER,i);
Buf7[i]=iBands(NULL,0,1,1,0,PRICE_CLOSE,MODE_MAIN,i-Chiko);
i--;
}
return;
}

  • 9.モリサワ
  • 投稿日:2013/05/05 16:05

>>3
>>4
>>5
fenwickさん、イイ感じ(笑)にヒントを与えて下さってありがとうございます。
データ・ウィンドウの存在は知っていましたが、そういう見方もできるんですね。勉強になります。
遅行スパンはおっしゃる通り、一目均衡表からコピペするつもりでいましたが、今はまだどの部分を引っ張ってくるのかがぼんやりしている状態ですので、少しずつですが勉強して前に進んでいきたいと思います。
改めてどうもありがとうございました。今後もよろしくお願いします。

  • 10.モリサワ
  • 投稿日:2013/05/05 16:07

>>6
>>7
>>8
山中さん、サンプルを上げていただきどうもありがとうございます。
私の今のレベルでは時間がかかりそうですが、一行一行しっかり噛み砕いて頭の中で整理してみます。
ちなみにテンプレート表示はさすがに私でも簡単にできましたので、チャート表示だけなら問題なかったのですが、将来、EAを作る時にMolanisSBのiCustomで読み込ませたかったためカスタムインディケータ化に拘りました。もし定型チャートを組み合わせてテンプレート化したものをカスタムインディケータに変換できる機能があれば凄く助かるんですが(笑) 
山中さん、今後もよろしくお願いします。どうもありがとうございました。

  • 11.山中
  • 投稿日:2013/05/05 16:23

>>10

さすがにテンプレート→カスタム指標というツールは無いと思いますが、モラニスのテクニカル・インディケータ・ビルダ(TIB)を使えば今回のような指標は簡単に作成可能です。

ただし、TIBは外部変数に対応していないため、自分でexternの定義をする必要があります。つまり、プロ版が必要です。

  • 12.fenwick
  • 投稿日:2013/05/05 19:58

>>8
サンプルを編集無しで使ってみましたが、色の設定が反映されません。
コンパイルは問題無く通りますが、チャートにドロップしパラメータが開かれると、色が全て黒になっています。
仮の色を設定すれば表示されます。
ここでMT4を終了して再起動すると、色は仮の設定ではなく、インジケーター内の設定色で表示されます。
更にこの分析ツールを削除し再ドロップして表示させると、色が全て黒になっています。
この様な事は私だけの環境の事で、皆さんの所では問題なく設定色で直ぐに表示されるのでしょうか?

他のカスタムインジケータを幾つか試しましたが、問題なく色の設定が反映されています。
Allow DLL ...、Allow external ...の両方ともチェックが入っています。
他の方からコメントが無いから、私だけかな?
何か確認すべき点があれば、教えて下さい。

P.S. 遅行スパンは馴染めず、以前山中さんが話された先行させる遅行スパンの方が好きです。

  • 13.モリサワ
  • 投稿日:2013/05/05 20:20

>>12
fenwickさん、私のところでも同じです。そして直近の遅行スパンが真下に垂れています。

  • 14.fenwick
  • 投稿日:2013/05/05 20:51

>>13
色の設定と線のスタイルを
  #property indicator_color
  #property indicator_style
で設定することに変更して、今回の問題は一応解決できました。
だけど何故だろう?

確かに遅行スパンの直近が下に垂れていました。
私は-25にして先行させるので気付きませんでした。

  • 15.山中
  • 投稿日:2013/05/05 20:59

>>12/13/14

黒く出てしまうのですね?私のところでは全く色表示については問題ありません。原因は不明ですが、プロパティで色設定をすると回避できるようなのでその方が良いかもしれません。アップしたサンプルは極力ソースの行数を減らす書き方をしていますので。

あと、遅行スパンは何故か最後のバーの終値から0に向かっていますが、明日LIVEレートが入った段階で再確認ですね。これも、確認したところ終値、移動平均、遅行スパン、どれで試しても同じでした。もし、LIVEレートが入ってきても同じ現象となると、横着せず面倒でも指標のソースを丁寧に書かないとダメなのかもしれません。

  • 16.山中
  • 投稿日:2013/05/05 21:04

>>15
念のため、動作環境を書いておきます。

MacOSX10.8+Parallels8による仮想マシン上のWindows 8(32bit)
MT4は日足5本、6本の2パターンで確認

  • 17.fenwick
  • 投稿日:2013/05/06 08:19

>>15
今朝のLIVEレートで試してみましたが色は黒で反映されず、遅行スパンも下がったままで更新されず、そのまま左に流れていきます。
ボリンジャーの7本の線は更新されますが、遅行だけ更新されないのが納得できませんね?

一目からパクッた遅行はローソクが変わるのに連動して、下に垂れる事無く更新されています。

動作環境は、Win7(64bit)
MT4は日足5本、6本の2業者のEURJPY,M1で確認

  • 19.山中
  • 投稿日:2013/05/06 11:36

>>18
悔しいので色々と試してみたところ解決しました。要は、ラインを引く時にシフトをその場所で指定してはダメなのでした。つまりint init()の中でshiftを指定する必要がありました。

いっぽう、色については、私のところではpropertyで指定すると黒一色になるという逆の現象が出ました。これについては、正直何がそうさせているのかさっぱりとわかりません。

ということで、次のレスにとりあえずの完成版を置きます。

  • 20.山中
  • 投稿日:2013/05/06 11:37

// Custom Indicator Template (Yamanaka)
string indName="Boll_CS";

//buffer
#property indicator_chart_window
#property indicator_buffers 8
double Buf0[];
double Buf1[];
double Buf2[];
double Buf3[];
double Buf4[];
double Buf5[];
double Buf6[];
double Buf7[];

//parameter
extern int MAPeriod=20;
extern int Chiko=25;

//init
int init()
{
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,Blue);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,Green);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1,Green);
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1,Red);
SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1,Red);
SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,1,LightBlue);
SetIndexStyle(6,DRAW_LINE,STYLE_SOLID,1,LightBlue);
SetIndexStyle(7,DRAW_LINE,STYLE_SOLID,1,Magenta);
SetIndexBuffer(0,Buf0);
SetIndexBuffer(1,Buf1);
SetIndexBuffer(2,Buf2);
SetIndexBuffer(3,Buf3);
SetIndexBuffer(4,Buf4);
SetIndexBuffer(5,Buf5);
SetIndexBuffer(6,Buf6);
SetIndexBuffer(7,Buf7);
SetIndexShift(7,-Chiko);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
return(0);
}

//indicator
int start()
{
int i,Counted_bars;
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
while(i>=0)
{
Buf0[i]=iBands(NULL,0,MAPeriod,1,0,PRICE_CLOSE,MODE_MAIN,i);
Buf1[i]=iBands(NULL,0,MAPeriod,1,0,PRICE_CLOSE,MODE_UPPER,i);
Buf2[i]=iBands(NULL,0,MAPeriod,1,0,PRICE_CLOSE,MODE_LOWER,i);
Buf3[i]=iBands(NULL,0,MAPeriod,2,0,PRICE_CLOSE,MODE_UPPER,i);
Buf4[i]=iBands(NULL,0,MAPeriod,2,0,PRICE_CLOSE,MODE_LOWER,i);
Buf5[i]=iBands(NULL,0,MAPeriod,3,0,PRICE_CLOSE,MODE_UPPER,i);
Buf6[i]=iBands(NULL,0,MAPeriod,3,0,PRICE_CLOSE,MODE_LOWER,i);
Buf7[i]=Close[i];
i--;
}
return;
}

  • 21.モリサワ
  • 投稿日:2013/05/06 16:51

>>20
山中さん、下記の形で使わせていただきます。
パラメータ、色、線幅は微妙に変えました。
それとChiko→Chikouも(笑)
               ありがとうございます。

string indName="superbollinger";

//buffer
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Blue
#property indicator_color2 Green
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_color5 Red
#property indicator_color6 Aqua
#property indicator_color7 Aqua
#property indicator_color8 Magenta

double Buf0[];
double Buf1[];
double Buf2[];
double Buf3[];
double Buf4[];
double Buf5[];
double Buf6[];
double Buf7[];

//parameter
extern int MAPeriod=21;
extern int Chikou=20;

//init
int init()
{
SetIndexStyle(0,DRAW_LINE,EMPTY,2);
SetIndexStyle(1,DRAW_LINE,EMPTY,2);
SetIndexStyle(2,DRAW_LINE,EMPTY,2);
SetIndexStyle(3,DRAW_LINE,EMPTY,2);
SetIndexStyle(4,DRAW_LINE,EMPTY,2);
SetIndexStyle(5,DRAW_LINE,EMPTY,2);
SetIndexStyle(6,DRAW_LINE,EMPTY,2);
SetIndexStyle(7,DRAW_LINE,EMPTY,2);
SetIndexBuffer(0,Buf0);
SetIndexBuffer(1,Buf1);
SetIndexBuffer(2,Buf2);
SetIndexBuffer(3,Buf3);
SetIndexBuffer(4,Buf4);
SetIndexBuffer(5,Buf5);
SetIndexBuffer(6,Buf6);
SetIndexBuffer(7,Buf7);
SetIndexShift(7,-Chikou);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
return(0);
}

以下同。

  • 22.山中
  • 投稿日:2013/05/06 17:32

>>21
まずは、きちんとカスタム指標になって安心しました。

今回の形式はカスタム指標のテンプレートになると思いますので、最大8つのラインまでであれば他にも使い回しが効くと思います。色々とお試しください。

気づけば簡単なことでしたが、shiftの記述は久しぶりに悩み私も良い勉強になりました。

なお、ボリンジャーバンドの偏差は実数で宣言しても整数しか受け付けません。1.5とか2.5のような入力を行いたい場合は一工夫必要です。このあたりは、パンローリングから出ている「FXメタトレーダー実践プログラミング」の71ページ以降に詳しいです。

  • 23.fenwick
  • 投稿日:2013/05/06 18:20

お気に入りのインジでShiftは使っていたのに、今回思い出せず悔しいです。
別で見つけた Buf7[0] = EMPTY_VALUE; を試みましたが、上手く行きませんでした。

ちなみに私は8つ全てを線では出さず4〜6本位にして、残りは矢印などの記号でGC/DCなどを表しています。

  • 24.山中
  • 投稿日:2013/05/06 18:26

>>23
普段からMT4のコードを書いている人だとすぐにわかることなのでしょうが、なかなか難しいものです。

GW後半の2日は良い頭の体操になりました。

タグ:

おすすめサービス

InterPot(インターポット) ドメイン@nifty @niftyホームページサービス