こんばんは。キリンです。
先ほどHey!Hey!Hey!の大阪の歌特集をやっていました。
Dreams Come Trueの大阪をメインにした歌がすごい印象に残りました。
東京にいる大阪人にとって、新大阪というのはなじみ深い駅だと思います。
詩にすると味が出ますね。
「新大阪までいつものスウェットで私を迎えにきてた。今日も家に直行かぁ。」
っていう言葉。なんだか愛がありますよね。
さて、今回は第14回の続きです。
インディケーターの主要部分についてお話しようと思います。
難しい・・・かもしれません。
しっかり理解していただければと思います。
■インディケーターのメインプログラム
■全体の大まかな動作の説明
■今回のプログラム中身・MQL定義済み関数と変数の解説
■宿題!
■インディケーターのメインプログラム
今日お話しするのは、たったこれだけの部分です。
//+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //—- int limit = Bars-IndicatorCounted(); for(int i=limit-1; i>=0; i–) { Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i); } //—- return(0); } //+------------------------------------------------------------------+ |
ですが、かなり奥が深い内容になっています。
まずはプログラムの全体の大まかな説明をします。
■全体の大まかな動作の説明
インディケーターを表示させるとき、
実は全てのローソク足での値を計算させています。
その結果をグラフで表示ているのです。
しかし、一度計算したところでのインディケーターの値は2回目計算しても同じですよね。
ですので、一度計算したところはもう計算しないというプログラムが必要なのです。
そうすることで、プログラム全体が軽くなります。
・インディケーターを表示させようとしたときに、表示しているローソク足全ての点での
インディケーターの値を計算する。
↓
・ローソク足が新しくなったり、最新のローソク足だけ計算する
というのがメインの動作です。
次は、実際にその動作の中身のお話です。
■今回のプログラム中身・MQL定義済み関数と変数の解説
・int start()
プログラムの超重要な部分です。
この関数の{ }の部分が、実際にプログラムの動作する部分になります。
チャートが1tick動くごとに、このstart()が動作します。
↑すっごい大事です。
ちなみに、
int init()は、「インディケーター導入時のみ動作する」ところでした。
復習をかねてこちらもしっかり理解していただければと思います。
・int limit = Bars-IndicatorCounted();
Bars[定義済み変数]
表示しているバー(ローソク足)の本数を返します。
IndicatorCounted()[定義済み関数]
今まで計算したバーの本数を返します。
※この関数は、インディケーターでしか使えません。
上記ふたつによって、int limitの値は、
limit =(全部のローソク足の本数) – (今まで計算したローソク足の本数)
となるわけですね。
この引き算結果は、
limit = (計算したことのないローソク足の本数)
になります。
・ for(int i=limit-1; i>=0; i–)
このfor文の繰り返しの内容は、
(計算したことのないローソク足の本数)から1を引いて、
↓
iが0以上なら繰り返し、
↓
iを1ずつ引いていく
という中身になります。
なぜ、limit -1 とするかといいますと、
「最新のローソク足は絶えず動き続けているので、
何度も計算しなおす必要がある」
からですね。
・Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
Bufは第14回で定義済み。
ここで新しい関数は、iMA()というものですね。
このiMAは非常に便利で、おそらくこれから先何度も使う関数になると思います。
これについては細かく説明したいので、次回にしますね。
ここでは、Buf[i]に値が割り当てられているのを理解していただければと思います。
インディケーター導入時の初回の動作は
(計算したことのないローソク足の本数)= (全てのローソク足)
になるので、全てのローソク足分、Buf[i]に値が割り振られます。
初回移行は、新しいローソク足の部分のみ、Bufに値が割り振られます。
基本的には、Buf[0]だけ計算されると思っていただいても問題ないです。
ちなみに、Buf[0]といえば最新のローソク足のBufの値、
Buf[1083]といえば、最新のローソク足から1083前のBufの値になりますので
復習をかねて説明させていただきます。
・return(0);
プログラムの終了を告げています。
0をreturnさせる必要性はないのですが、
「エラーがなかった」
ということを、0で表すのでこのように0でreturnさせるのがルールになっています。
そこまで深く考える必要はないです。
iMAの動作はとりあえず保留ということで、
それ以外の基本的な動作の流れを説明しました。
ご理解いただけましたでしょうか!?
ちょっと複雑になってきたので心配です。
明日でまたさらに補足の説明を行っていきますね!
今日の宿題はしっかり考えていただければと!
Bufの配列の中身全てに[93.30]を入力するインディケーターのfor分を作ってください。
そして、ドル円のチャートで実際に動作させてみましょう。
ヒント:Bufの中身全てに93.30を入力するにはどこを変更すればいいかを考えれば・・・
ちなみに、元ファイルはこれです!
これのほんの一部を変更するだけで、赤色の直線を表示するインディケーターになります。
ぜひ挑戦してみてくださいね!
最後までお読みくださり、誠にありがとうございます!
//+------------------------------------------------------------------+ //| MA Kirin.mq4 | //| Copyright Kirin 2010, Forex Trading Laboratory. | //| http://ameblo.jp/ftlabo-kirin/ | //+------------------------------------------------------------------+ #property copyright “Copyright Kirin 2010, MetaQuotes Software Corp.” #property link “http://ameblo.jp/ftlabo-kirin/” #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_level1 0 // 指標バッファ double Buf[]; // 外部パラメータ extern int MAPeriod = 13; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //—- indicators // 指標バッファの割り当て SetIndexBuffer(0, Buf); // 指標ラベルの設定 string label = “MA(“+MAPeriod+”)”; IndicatorShortName(label); SetIndexLabel(0, label); //—- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //—- //—- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //—- int limit = Bars-IndicatorCounted(); for(int i=limit-1; i>=0; i–) { Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i); } //—- return(0); } //+------------------------------------------------------------------+ |
コメント
SECRET: 0
PASS:
1000文字超えたのでメールします。
多分、色んな方法があるんだと思いますが、とりあえず出来たものを送ります。
SECRET: 0
PASS:
Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
を
Buf[i] = 93.30;
にしたらOKでした(笑)
SECRET: 0
PASS:
>りあるさん
メッセージの内容素晴らしかったです!
使わせていただきますのでw
コメントまでありがとうございます!
SECRET: 0
PASS:
>junkyさん
ずばり正解ですw
今回の答えはこれだったんですねー。
さすが junkyさんっす!
コメントありがとうございます!
SECRET: 0
PASS:
「最新のローソク足は絶えず動き続けているので、何度も計算しなおす必要がある」
↑ここが分かりません。
プログラマー世界の検索法か何かで決まっているテクニックですか?最近C言語というかフローチャート勉強しています。
SECRET: 0
PASS:
>fx_nakabatosuさん
コメントのお返事がもれていました!
申し訳ありません。
最新のローソク足の「終値」は常に変化しているのは
チャートを見ていただいても分かると思います。
ローソク足の確定まで計算し続ける必要があるんです。
ご参考になりましたでしょうか?
コメントありがとうございます!
SECRET: 0
PASS:
現在値を0として数える「shift値」と、
Bars-IndicatorCounted()のローソク足の「本数」とを
混同して計算していました。
ありがとうございました。m(_ _ )m
SECRET: 0
PASS:
チャートを見て
自分なりに分かりやすく解釈すると
for(int i=limit-1; i>=0; i–)
{
Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
}
は
for(int i=時間軸の計算)
{
価格軸の回答 Buf[時間軸の回答 i] = 価格軸の計算;
}
という解釈でよろしいのでしょうかね
Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
↑の記述がなにをやろとしているか分からなかったので Bufの正体が価格軸の数値である事を 回答を見てやっと分かりました。.
SECRET: 0
PASS:
故に このインジの動きは
Buf[i] = ここで計算された価格帯に;
足毎又はティック毎?に点をポンポン置いてく動きをするわけなんですね?
で点が連なって曲線又は棒線に見えると….
SECRET: 0
PASS:
Buf[i]
だから 足毎 ティック毎というより
最新足よりi本前の足からポンポンという事になるのか…