- タグクラウド
移動平均線を作る(移動平均線の描画)。
posted by SBT at 2005-04-28(木) 21:47
MQLの構造と、実行時の簡単な流れがつかめたところで、実際に移動平均線のインジケータスクリプトを書いていきます。
ナビゲータウィンドウの File タブに、MetaTraderをインストールしたフォルダのExpertsフォルダの中が表示されるので、そこから、前回、ウィザードで作ったファイルを開きます。
ウィザードで作ったファイルの中に、次のような部分があるはずです。
この部分はstart関数といって、この中にインジケーターを描くための処理を書きます。
まず、(1)の下に、
と書き加えます。
インジケータスクリプトを実行すると、レートが変わるたびに、毎回、一からインジケータの計算が行われます。
これは、そういった無駄を省くために、新しいレートの計算のみをするようにするための処理です。
次に、(2)と(3)の間に、
と書き加えます。
ここが、過去のデータも含めて、実際のインジケータを描くための処理になります。
以上で、移動平均線のインジケータは完成です。
ただし、このままではインジケータとしては使えません。
インジケータとして使うためには、コンパイルしなければなりません。
人間の理解できる形で書いたものをソースファイルといいますが、これをMetaTraderで実行できる形式へと変換しなければなりません。
コンパイルするには、メニューから、
File -> Compile
を選びます。
ソースファイルの拡張子は .mq4 ですが、コンパイルするとファイルが保存され、新しく .ex4 という拡張子のファイルが作られます。
ツールボックスウィンドウの Error(s) タブに、
と表示されれば、コンパイルは成功です。
後は、MetaTraderのナビゲータウィンドウ内の Custom Indicators の中にある Moving Average(Custom) を選べば、作ったインジケータスクリプトが実行されます。
ほとんどの場合には、(4)の部分を書き換えることで、色々なインジケータを作ることができます。
ウィザードで作ったファイルの中に、次のような部分があるはずです。
int start()
{
int counted_bars=IndicatorCounted(); // (1)
//---- TODO: add your code here (2)
//---- (3)
return(0);
}
この部分はstart関数といって、この中にインジケーターを描くための処理を書きます。
まず、(1)の下に、
int limit;
if(counted_bars<0) return(-1);
limit=Bars-counted_bars;
と書き加えます。
インジケータスクリプトを実行すると、レートが変わるたびに、毎回、一からインジケータの計算が行われます。
これは、そういった無駄を省くために、新しいレートの計算のみをするようにするための処理です。
次に、(2)と(3)の間に、
for(int i=0; i<limit; i++) {
ExtMapBuffer1[i]=iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_CLOSE,i); //(4)
}
と書き加えます。
ここが、過去のデータも含めて、実際のインジケータを描くための処理になります。
以上で、移動平均線のインジケータは完成です。
ただし、このままではインジケータとしては使えません。
インジケータとして使うためには、コンパイルしなければなりません。
人間の理解できる形で書いたものをソースファイルといいますが、これをMetaTraderで実行できる形式へと変換しなければなりません。
コンパイルするには、メニューから、
File -> Compile
を選びます。
ソースファイルの拡張子は .mq4 ですが、コンパイルするとファイルが保存され、新しく .ex4 という拡張子のファイルが作られます。
ツールボックスウィンドウの Error(s) タブに、
0 error(s), 0 warning(s)
と表示されれば、コンパイルは成功です。
後は、MetaTraderのナビゲータウィンドウ内の Custom Indicators の中にある Moving Average(Custom) を選べば、作ったインジケータスクリプトが実行されます。
ほとんどの場合には、(4)の部分を書き換えることで、色々なインジケータを作ることができます。
コメント
Posted by SBT at 2006-12-02(土) 00:33
Radioさん、こんばんは。 あ、この場合には★の行は不要ですね…。ご指摘、ありがとうございます。 同梱のサンプルがそうなっていたので、コピー&ペーストでそのままペーストしてしまったんだと思います。 これだと、実際には直近2本を再計算するようになってますね。 なので、このケースでは削除してしまって問題ありません(削除しなくても問題ありません)。 過去のバーも再計算・再描画させる必要がある場合には、★のような調整方法も使えますね。 該当部分を修正しておきました。
Posted by Radio at 2006-12-02(土) 00:55
SBTさん、こんばんは。 すばやい返答ありがとうございます。 ご回答いただいたおかげで、とてもスッキリしました。 SBTさんのMQL入門は丁寧に順を追って説明してくださっているので、自分の想像以上の速さで習得が進んでおります。 MQL入門以外のエントリもとても参考になりますし、SKILL UP FX!は私のバイブルといってもいいですね。 これだけ充実したサイトを運営するのは大変だと思いますが、これからもがんばってください。
Posted by タカハシ at 2006-12-28(木) 23:58
移動平均乖離率はソフトに標準装備されていますでしょうか?
Posted by SBT at 2007-01-04(木) 22:48
明けましておめでとうございます。 今年もよろしくお願いします。 乖離率は標準では入っていませんけど、アップローダにだけアップしてあります。 Kairi.mq4, Kairi.ex4っていうやつがそれなので、よろしければどうぞ。
Posted by タカハシ at 2007-01-06(土) 08:01
あけましておめでとうございます。 今年もよろしくお願いいたします。(すみませんです。) 早速出申し訳ないのですが。 ?保管庫にある平均足ですが、何本の足を平均足にしているのでしょうか? ?下はMACDヒストグラムの現在値です。 平均足を同じ式で表すと、double以下はどうなるのでしょうか? iOsMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, Current + 0);
Posted by SBT at 2007-01-10(水) 02:24
こんばんは。 ?一般的な平均足だと思うので、何本というのはないと思いますが…つまり、1本かと思います。設定できるパラメータがあれば別ですが…。 ?iOsMAのリファレンスを参考にしてみてください。PRICE_CLOSE部分のパラメータの説明に指定できる値一覧へのリンクがあって、その中に平均足と同様のものもあったかと思います。 これは他の関数でも同様ですので、使い方を覚えておくと便利だと思いますよ。
Posted by タカハシ at 2007-01-10(水) 09:40
申し訳ありません。 平均足について少々勘違いしておりました。 下記の表からですと、たぶんですが、パラメーターの指定値はなく、おそらく平均足始値、平均足高値、平均足安値、平均足終値は得られません。 比較的簡単に得られるのが平均足終値((始値+高値+安値+終値))/4ですが、下記の指定値にはありません。 足して4で割る数式を入れる必要があると思われます。 0 = Close price 1 = Open price 2 = High price 3 = Low price 4 = Median price, (high+low)/2 5 = Typical price, (high+low+close)/3 6 = Weighted close price, (high+low+close+close)/4 平均足を開いてみたのですが、私には分からないint 関数等が混在しておりました。 必要と思われる部分を抜き出して貼り付けてみました。 いちおうコンパイルはできましたので、式的には適合するかもしれません。 一つ前のデータ アップしておきます。 これをシグナルチェッカーで使えるかどうか試してみます。
Posted by SBT at 2007-01-11(木) 00:15
こんばんは。 すみません、こちらも少し勘違いしてました。 そうですね、指定できる値に平均値はないので、もしやろうとするなら自前で計算するしかないですね。 使うものにこだわるよりは、使えるものの範囲内でやるのも良いと思いますよ。
Posted by てり at 2007-11-09(金) 11:30
>下記のインジケータの計算量を削減するロジックなのですが、なぜ★の処理が必要なのでしょうか。 >int limit; >if(counted_bars<0) return(-1); >if(counted_bars>0) counted_bars--; ★ >limit=Bars-counted_bars; 非常に遅いですが、気になったので書き込みます。 私も★でなぜバーを2本計算するのか疑問に思っていました。 確かhttp://www.metatrader4.com/のどこかに書いてあったのですが、 新しいバーが出来る瞬間に値が動くと、バーの値と実際のそのバーの終値が違ってくるケース があり、それを防ぐために念のため2本計算するそうです。
Posted by SBT at 2007-11-13(火) 20:31
>てりさん なるほど。 start関数やインディケータ配列周りなど、この辺りはMQL独特なので注意する必要がありそうですね。 ありがとうございました。
Posted by 影虎 at 2010-01-15(金) 21:53
初めまして。 移動平均乖離率について、Kairi.mq4を利用させていただきました。 ありがとうございます。 私の手に入れたバージョンでは、EAに組み込むとテスト中に0 divide exceptionを発生します。 原因はテストデータによってはiMAが値を返さない場合がある為に発生するようです。 そのため0divideを回避するように修正を加えました。 折角なので私のサイトで公開させていただいております。 問題があるようでしたら直ぐに削除いたします。 よろしくお願いいたします。
トラックバック
このエントリーへのトラックバックはありません。
- トラックバックURL
- http://core.t3-ism.net/trackback/197



Posted by Radio at 2006-12-01(金) 23:43