インジケータの記事一覧

FXメタトレーダー実践プログラミング

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

お久しぶりです。

年末からやたら忙しい状態がつづいていて、部署が変わったから楽になるかと思ったら、もっとひどくなってしまいました。

そんな訳で、更新もままならない状況です。

楽しみにしている方には、申し訳ないと思います。

出来る範囲で、ゆっくりとやっていきたいので期待せずにまっていてください。

ちょっと前に見つけて、今日買った本について

FXメタトレーダー実践プログラミング」という本です。

FXメタトレーダー実践プログラミング

FXメタトレーダー実践プログラミング

価格:2,940円(税込、送料別)

前作の「FXメタトレーダー入門」の続編に当たるものです。

FXメタトレーダー入門

FXメタトレーダー入門

価格:2,940円(税込、送料別)

FXメタトレーダー実践プログラミングは、結構いいですよ。

前作は、メタトレーダーの使い方とプログラムの触りでしたが、今回のはやりたい事をだいたい実現できるだけの情報が載っています。

目次はこんな感じ。

  • 第1章 メタトレーダーの構成を知る(メタトレーダーを使いこなす前に/メタトレーダーとMQL4プログラミング)
  • 第2章 カスタム指標プログラムで独自のテクニカル分析(カスタム指標プログラムの基本/組み込みテクニカル指標関数の使い方/オブジェクトを利用したカスタム指標/テクニカル指標のデータをファイルに出力)
  • 第3章 トレード関数で柔軟な注文を実現(トレード関数を使いこなす/トレード時のエラーチェック/トレード関数のライブラリー化/エキスパートプログラムによる注文)
  • 第4章 エキスパートプログラムでシステムトレード自由自在(売買システムの基本構成/仕掛けのパターン/手仕舞いのパターン/そのほかのシステムのパターン/ストラテジーテスターでの検証)
  • 第5章 MQL4をさらに使いこなしたい人のために(データの型/プリプロセッサ命令/変数の種類/配列の種類/数学関数/オブジェクトの表示/ファイルの入出力/文字列に関する関数/日時に関する関数/マーケット情報/口座情報/関数のライブラリー化)
  • 付録A MQL4関数一覧
  • 付録B 参考図書

いい感じで知りたい情報が分かります。

多少なり、プログラムの経験があればそれなりのプログラムが組めるようになります。

興味のある方は、本屋で立ち読みしてみてください。

タグ

いろんな通貨ペアを一緒に表示したい

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

最近、「いろんな通貨を一緒に表示したい」という質問をよく受けます。

たぶん、為替鬼さんの

<a href=”http://hb.afl.rakuten.co.jp/hgc/09f4ab6a.89c21c1d.09f4ab6b.318ea709/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6104387%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13214593%2f” target=”_blank”>為替鬼のFXスキャルピング入門</a>
の影響かなって思っています。

実は、月刊 FX (エフエックス) 攻略.com (ドットコム) に連載し始めた頃、気になって作ってみようと思ったことがあります。

思ったことがあるってところが味噌で、実は挫折しました。

※最後まで作りきる気力がなかった。

単純に、複数通貨をプロットしたりするのはある程度考えればできるんです。

ですが、通貨ペアによって情報が更新されない時間があって、それがまちまちなんです。

インジケーターを作るときに、過去にさかのぼればさかのぼるほど、ズレが大きくなって意味がなくなっちゃうんです。

対処方法もあることにはあります。

足ごとの時間を取得して、合わせてあげればいいんです。

でも、ここで挫折しました。

面倒なんだもん!!

ということで、誰かクリアしたらください。

いや、作らないといけないのかな。

気持ち的にやる気が出たら作ってみます。

タグ

インジケータからEAを作ってみるときに

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

かなりご無沙汰しています。

仕事が忙しくてなかなか更新できなかったり、プライベートでも子供が生まれたりと、どこにいても忙しい毎日をおくっているため、なかなか更新できないでいます。

ちょっと質問を受けたので、その回答を

 

質問:

インジケータのソースが手に入ったので、それをベースにEAを作ろうと思っていますがどこをどうしていいかわかりません。

 

まあ、こんな感じの質問です。

簡単に回答してしまうとインジケータからEAを作るのは、かなりプログラムがわかっていないと難しいです。

理由は簡単で、足単位で計算しているプログラムを必要な足の情報だけを取得するように変更する必要があるからです。

だいたい、ソースが提供されているインジケータは、サンプルみたいなものでかなり適当に作られていることが多いです。

いい感じに関数化してあり、部品として流用可能ならあまりわからなくてもEA化ができるかもしれませんが、再利用など考えていないことが多いので整理しなおす必要があります。

 

この辺は、経験がものを言うのでチャレンジしてもらうことはものすごくいいことです。

でも、難しいじゃないですか。

 

ということで、なるべく簡単にインジケータのデータをEAで利用するには、「iCustom」を利用してインジケータをそのまま利用してしまうことです。

インジケータの情報を取得する2で説明しているので、そっちの方向でまずがんばってみてください。

タグ

重要指標を表示するインジケータを作ってみる

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

今回は、重要指標を表示するインジケーターを作成します。

作成するといってもかなり難しいので、慣れてきてから応用してください。
いつもなら関数の説明などもしていますが、今回は省きます。

ダウンロードは、ここから。
ImportantNews 重要指標を表示するインジケータ

今回は、WindowsのAPIを利用してインターネット経由で重要指標を取得。
それを解析して、インジケータとして画面にプロットします。

重要指標の入手元は、

DailyFX
http://www.dailyfx.com/

で、ここはcsv形式で重要指標を入手できます。

こんな感じでcsvを入手できます。
http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv?direction=none&collector=allInFolderDateDesc&view=week&timezone=GMT

http://www.dailyfx.com/calendar/cal.csv?sort=dateDesc&timezone=&currency=|&importance=|

MT4は、英語しか表示できないので日本は表示可能です)英語のサイトのほうが都合がいいのとcsv形式でリアルタイムに入手できるので解析しやすいのが利点です。

csvファイルを入手して読み込ませる方法もありますが、せっかくなのでインターネットから直接入手します。

MT4には、外部DLLを利用する機能があるので、Windows標準のDLL(wininet.dll)を利用して、インターネットのアクセスを可能にします。
※外部DLLの利用はデフォルトなしになっているので、インジケータ組み込み時にありにする必要があります。

dll

↑赤丸のところ

 

ソースのはじめの方に

#import “使いたいDLL”
使いたい関数
#import

という宣言があると思います。

ここで、インターネット接続関係の関数を利用できるようにします。

・インターネット接続確認
InternetAttemptConnect()
・インターネット接続
InternetOpenA()
・URLオープン
InternetOpenUrlA()
・インターネット読み込み
InternetReadFile()
・インターネットクローズ
InternetCloseHandle()

オリジナルで作成している関数は、
ReadHttp()
StrToSplitArray()
の2つあります。

ReadHttp()は、インターネットに接続し、内容を文字列として読み込みます。

StrToSplitArray()は、文字列を区切り文字で分割して配列に格納します。

今回は、DailyFXへインターネット経由でアクセスして、csvファイルを取得していますから、ReadHttp()を使ってアクセスした結果がcsvファイルの内容で、戻り値にstringとしてメモリ上に展開されます。

csvファイルを取得してもらうと分かりますが、改行など無駄な部分もたくさんあるので、start()の中でStrToSplitArray()を利用して、改行を区切り文字として行データを配列へ格納、行データを「,」で分割して各項目データとして取得しています。

start()で行っていることは、
1.15分ごとの更新
2.表示データの削除
3.csvデータ(重要指標)の取得
4.データの分割
5.年月日など表示用に適した形への変換
6.タイムゾーンの一致
7.データの表示

今回のタイムゾーンは、デフォルト日本時間を採用しています。
server_timezone
show_timezone
で設定しています。

サーバ時間と表示時間を分けていますが、通常は同じでかまわないでしょう。
自分の環境に合わせてください。

データ表示で書かれている文字ですが、今の状態の上のほうから書き始めていますので、スクロールなどすると消えてしまいます。
次の更新で復活しますので、その辺は我慢してください。

デフォルトで取得している重要指標はすべてです。
URLの問い合わせで
&importanceFilter=Medium|Low|

&importance=Medium|Low|
などを追加して、Highのみにすることも可能です。
また、通貨ペアのフィルターも可能です。
¤cyFilter=GBP|CHF|CAD|AUD|NZD|

&currency=GBP|CHF|CAD|AUD|NZD|

今回は、ちょっと難しいので少しずつ理解して行ってください。

慣れてきてから、応用するのもありだと思います。

→この記事の続きを読む

タグ

CSVファイルを出力してみる。

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

今回は、ファイル出力を行いたいと思います。

タイトルでは、CSVファイルを出力することになっていますが、なるべく利用しやすいように文字列の行書きだしの関数を作ります。

CSVファイルも出力できますし、ログとして出力することもできます。

EAでもインジケータでもいいのですが、とりあえず、インジケーターで作成してみましょう。

何でもいいので、MetaEditorでインジケーターを作成してください。

別にパラメータなど入りませんので、適当でかまいません。

以下の関数をコピーして、最後にでもペースとしてください。

int LogWrite(string strFileName,string strText)
{
int handle;
handle=FileOpen(strFileName, FILE_BIN|FILE_READ|FILE_WRITE);
if(handle<1)
{
Print(”can’t open file error-”,GetLastError());
return(-1);
}
FileSeek(handle, 0, SEEK_END);
strText = strText + “\r\n”;
FileWriteString(handle, strText, StringLen(strText));
FileClose(handle);
return(0);
}

int LogWrite(string strFileName,string strText)

{

int handle;

handle=FileOpen(strFileName, FILE_BIN|FILE_READ|FILE_WRITE);

if(handle<1)

{

Print(”can’t open file error-”,GetLastError());

return(-1);

}

FileSeek(handle, 0, SEEK_END);

strText = strText + “\r\n”;

FileWriteString(handle, strText, StringLen(strText));

FileClose(handle);

return(0);

}

この関数は、

1.ファイルを開く

2.ファイルの最後に移動

3.ファイルへ出力

4.ファイルを閉じる

このことを行っています。

ちょこっと難しいというか、分かりにくいのが、

FileOpen(strFileName, FILE_BIN|FILE_READ|FILE_WRITE);

FILE_BIN|FILE_READ|FILE_WRITE

バイナリーモードで読み書きするという意味ですが、

その他にもファイルの中身を消去しないという意味があります。

今回は、書くだけなので「FILE_WRITE」だけでいいような気がしますが、

これだけだと、ファイルの中身を消してしまいます。

ということで、消したくないときは「FILE_READ|FILE_WRITE」の2つを指定する必要があります。

たぶん、ここが分かりにくいでしょうね。

FileSeek(handle, 0, SEEK_END);

は、ファイルの一番最後へ移動。

strText = strText + “\r\n”;

は、指定された文字の最後に改行コードを入れています。

これを入れないと改行されずに、連続した文字になってしまいます。

FileWriteString(handle, strText, StringLen(strText));

で、文字を指定した文字数分書き出しています。

FileClose(handle);

でファイルを閉じています。

この関数を使うと、簡単にファイルを出力できます。

LogWrite(ファイル名,出力したい文字列)

を指定すればいいだけです。

ちなみにファイルですが、

インストールパス\MetaTrader\experts\files

に出力されます。

EAのテストモードだけ出力先が変わって、

インストールパス\MetaTrader\tester\files

です。

では、関数を呼び出す部分を作ってみましょう。

int start()

の中に、以下の行を追加してください。

string strText = StringConcatenate(Year(),”/”,Month(),”/”,Day(),” “,Hour(),”:”,Minute(),”:”,Seconds(),”,”,Ask,”,”,Bid);

LogWrite(”AskBid.csv”,strText);

レートが変化したときの買値と売値を出力します。
ファイルの形式は、以下のようになります。

YYYY/MM/DD hh:mm:ss,買値,売値

CSVファイルで出力していますが、CSVファイルはカンマ区切りのテキストファイルです。

本当は、もう少し細かいルールがありますが、とりあえず問題ないはずです。

詳しく知りたい人は、ぐぐってみてください。

これで、コンパイルして適当な表にドラッグすれば、ファイルができあがっているはずです。

この関数は、文字なら何でも出力できるので、重宝すると思います。

せっかくなので、もう一つ出力例を

init()の上あたりに以下の宣言を追加してください。

datetime timeNow;

start()の中に以下の処理を追加してください。

if(timeNow != iTime(NULL,0,1))

{

timeNow = iTime(NULL,0,1);

string strTextAshi = StringConcatenate(TimeYear(timeNow),”/”,TimeMonth(timeNow),”/”,TimeDay(timeNow),” “,TimeHour(timeNow),”:”,TimeMinute(timeNow),”:”,TimeSeconds(timeNow),”,”,iHigh(NULL,0,1),”,”,iOpen(NULL,0,1),”,”,iClose(NULL,0,1),”,”,iLow(NULL,0,1));

LogWrite(”Ashi.csv”,strTextAshi);

}

今度のは、足が確定したときの高値、始値、終値、安値を出力しています。

レートが変わるたびに出力しても意味がないので、1本前の時間が変わったときに出力するようにしています。

こんな感じです。

ファイル出力は、分かりましたか?

他にも出力の仕方は、色々あるので試してみてくださいね。

タグ

インジケータの情報を取得する2

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回に引き続き、「ZigZag」インジケータを利用します。

この「ZigZag」インジケータをつかって、別のインジケータを作ってみましょう。

簡単インジケータ作成テンプレート」を使ったサンプルを作ってみます。

テンプレートを適当なファイル名にコピーして、

インストールパス\MetaTrader\experts\indicators

に入れてください。

コピーした、テンプレートのinit()を以下のように修正してください。

int init()

{

//—- indicators

SetIndexStyle(0,DRAW_ARROW, EMPTY, 4);

SetIndexArrow(0,159);

SetIndexBuffer(0,ExtMapBuffer1);

SetIndexStyle(1,DRAW_ARROW, EMPTY, 2);

SetIndexBuffer(1,ExtMapBuffer2);

SetIndexStyle(2,DRAW_ARROW, EMPTY, 2);

SetIndexBuffer(2,ExtMapBuffer3);

//—-

return(0);

}

次は、DataSet()を以下のように修正してください。

void DataSet(int i)

{

ExtMapBuffer1[i]=iCustom(NULL, 0, “ZigZag”,12,5,3,0,i);

ExtMapBuffer2[i]=iCustom(NULL, 0, “ZigZag”,12,5,3,1,i);

ExtMapBuffer3[i]=iCustom(NULL, 0, “ZigZag”,12,5,3,2,i);

}

これで終了です。

今回注目する点は、

iCustom(NULL, 0, “ZigZag”,12,5,3,2,i);

インターフェース仕様は、

double iCustom( string symbol, int timeframe, string name, …, int mode, int shift)

で、symbolにNULLを入れることで、今利用している通貨ペアを使用します。

timeframeに0を入れことで、今利用している通貨ペアの時間軸を使います。

nameは、利用したいインジケータ名「ZigZag」。

ファイル名の拡張子をのぞいた名前を使います。

問題は、次の

ここは、利用元のインジケータのパラメータを入れます。

「ZigZag」は、3つパラメータがあるので、3つ。

12,5,3

を指定しています。

利用元のインジケータのパラメータが0なら0、20なら20。

引数が可変になるので、分かりにくいところです。

modeは、何番目のバッファから取得するか。

shiftは、何番目の足の情報を取得するかです。

パラメータ設定部分が、わかりにくいので注意してくださいね。

コンパイルして、動かすと元々線が出ていた場所は、赤丸。

バッファ1が青い×。

バッファ2が緑の×。

が表示されるはずです。

この方法は、いろいろなインジケータから情報を取得できるので、おもしろいことができると思います。


タグ

インジケータの情報を取得する

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

インジケータから、情報を取得することを考えたいと思います。

 

有料のインジケータを買った(右の広告みたいなところから)ときに、そのインジケータを元にEAを作りたくなった。

インジケータとインジケータを組み合わせたときのあるタイミングで、シグナルを出したい。

 

たぶん、こんなこと思う人が結構いると思います。

 

ということで、インジケータのデータは、どうやってみるか?

ということを考えてみます。

 

リクエストにもあったので、標準で付いてくるインジケータで「ZigZag」というので考えてみます。

まず、どこの通貨ペアでもいいので、「ZigZag」を張り付けてみてください。

ほかのインジケータを使っていない状態の方が、わかりやすいので「ZigZag」だけにしてください。

 

アップダウンが、ジグザグに表示されるおもしろいインジケータですね。

「ZigZag」はソースが付いていますが、わからないと仮定します。

 

データウィンドウを表示してください。

スコープみたいなアイコンをクリックするか、「Ctrl+D」で表示できます。

datawindow

こんな感じのものが表示されたはずです。

マウスカーソルの位置のデータが表示されて、大変便利です。

 

で、「ZigZag」のデータは、

ZigZag、Value2、Value3の3つです。

実際に、マウスを動かして、データがどうなっているか調べていきます。

 

調べていくと、ZigZagというところが、山と谷の位置でデータが入っていることがわかります。

ということは、表示されている線のデータですね。

Value2、Value3は、山と思わしき場所、谷と思わしき場所の値が入っています。

 

ZigZagの値が、線のデータでほかのデータも使えそうですね。

 

次は、プログラムでデータを取得してみます。

タグ

メール送信インジケータ

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回のインジケータを派手にするで、アラートウィンドウを開いたり、音を鳴らしたりしました。

今回は、メールを送信してみたいと思います。

ですが、メールの設定は結構めんどうなので、簡単にユーザを作れるYahooメールを例に設定を説明します。

とりあえず、Yahooメールと契約してください。

で、メール設定に「POPアクセスとメール転送」があります。

「ブラウザアクセスとPOPアクセス」にチェックを入れて、設定してください。

これで、Yahooメールの設定は終了です。

次は、メタトレーダーの設定です。

メニューのツール-オプションを開いてください。

「E-メール」タブで、

「有効にする」にチェックを入れます。

SMTPサーバー:「smtp.mail.yahoo.jpsmtp.mail.yahoo.co.jp:587」

SMTPログインID:「YahooのユーザID」

SMTPパスワード:「Yahooのパスワード」

発信元:「ユーザID@yahoo.co.jp」

送信先:「送信したいメールアドレス」

これを入力して、「Test」ボタンを押してください。

テストメールが送信されれば、設定OKです。

では、プログラムの方に行ってみましょう。

前回のソースを使います。

ここから、読み始めた人は、前回のインジケータを派手にするを見てくださいね。

では、DataSetを以下のように書き換えてください。

void DataSet(int i)

{

double dBBUp = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_UPPER,i);

double dBBDown = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_LOWER,i);

if(dBBUp < High[i])

{

ExtMapBuffer1[i]=dBBUp;

if(ExtMapBuffer1[i+1] == EMPTY_VALUE)

{

if(i == 0){

SendMail(”Test BB” , “BBUp Over:” + DoubleToStr(High[i],Digits));

PlaySound(”alert.wav”);

}

ExtMapBuffer1[i+1] = ExtMapBuffer2[i+1];

}

}

else

{

ExtMapBuffer2[i]=dBBUp;

if(ExtMapBuffer2[i+1] == EMPTY_VALUE)ExtMapBuffer2[i+1] = ExtMapBuffer1[i+1];

}

if(dBBDown > Low[i])

{

ExtMapBuffer3[i]=dBBDown;

if(ExtMapBuffer3[i+1] == EMPTY_VALUE)

{

if(i == 0){

SendMail(”Test BB” , “BBDown Over:” + DoubleToStr(Low[i],Digits));

PlaySound(”alert.wav”);

}

ExtMapBuffer3[i+1] = ExtMapBuffer4[i+1];

}

}

else

{

ExtMapBuffer4[i]=dBBDown;

if(ExtMapBuffer4[i+1] == EMPTY_VALUE)ExtMapBuffer4[i+1] = ExtMapBuffer3[i+1];

}

//   ExtMapBuffer5[i]=iMA(NULL,0,14,0,MODE_SMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer6[i]=iMA(NULL,0,14,0,MODE_EMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer7[i]=iMA(NULL,0,14,0,MODE_SMMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer8[i]=iMA(NULL,0,14,0,MODE_LWMA,PRICE_WEIGHTED,i);

}

今回は、前回のアラートウィンドウの代わりにメール送信を行います。

SendMail(タイトル,本文);

を使います。

DoubleToStr(High[i],Digits)

で、High[i]の数字を文字型に変更しています。

DoubleToStr(double型の変数,有効小数点桁数)

Digitsは、現在の通貨ペアの小数点桁数を表します。

ということで、ボリンジャーバンドにタッチしたときの高値か安値をメールで送信するプログラムのできあがりです。

いままで、数回同じようなネタで行いましたが、結構簡単にいろいろなことができることが分かったと思います。

小難しいことを知らなくても意外と何とかなるでしょ!

では、また次回。

→この記事の続きを読む

タグ

インジケータを派手にする

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回のちょっと賢いボリンジャーバンドインジケータをちょっと派手にしたいと思います。

 

前回のソースをそのまま使うので、今回からお読みの方は、前回を参考にソースを作成してください。

 

で、どのように派手にするかというと、アラートウィンドウを開き、音を鳴らします。

リクエストもあったので、今回の例で説明します。

 

アラートウィンドウと音を鳴らすタイミングは、ボリンジャーバンドを抜けたときに行います。

 

では、DataSetを以下のように書き換えてください。

 

void DataSet(int i)

{

   double dBBUp = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_UPPER,i);

   double dBBDown = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_LOWER,i);

   if(dBBUp < High[i])

   {

      ExtMapBuffer1[i]=dBBUp;

      if(ExtMapBuffer1[i+1] == EMPTY_VALUE)

      {

         if(i == 0){

            Alert(”BBUp Over:”,High[i]);

            PlaySound(”alert.wav”);

         }

         ExtMapBuffer1[i+1] = ExtMapBuffer2[i+1];

      }

   }

   else

   {

      ExtMapBuffer2[i]=dBBUp;

      if(ExtMapBuffer2[i+1] == EMPTY_VALUE)ExtMapBuffer2[i+1] = ExtMapBuffer1[i+1];

   }

   if(dBBDown > Low[i])

   {

      ExtMapBuffer3[i]=dBBDown;

      if(ExtMapBuffer3[i+1] == EMPTY_VALUE)

      {

         if(i == 0){

            Alert(”BBDown Over:”,Low[i]);

            PlaySound(”alert.wav”);

         }

         ExtMapBuffer3[i+1] = ExtMapBuffer4[i+1];

      }

   }

   else

   {

      ExtMapBuffer4[i]=dBBDown;

      if(ExtMapBuffer4[i+1] == EMPTY_VALUE)ExtMapBuffer4[i+1] = ExtMapBuffer3[i+1];

   }

//   ExtMapBuffer5[i]=iMA(NULL,0,14,0,MODE_SMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer6[i]=iMA(NULL,0,14,0,MODE_EMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer7[i]=iMA(NULL,0,14,0,MODE_SMMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer8[i]=iMA(NULL,0,14,0,MODE_LWMA,PRICE_WEIGHTED,i);

}

if(i == 0)でくくっているのは、過去のラインを描画するときにもメッセージや音が出てしまうためです。

新規にボリンジャーバンドを抜けたときだけ、処理を行います。

 

Alertは、アラートウィンドウを表示する関数で、引数はコメントと同じで「,」カンマ区切りで、文字や数値を連結できます。

PlaySoundは、音を出す命令で、引数にサウンドファイル名を指定します。

インストールパス\MetaTrader\sounds

に入っているファイルを指定できます。

 

これで、好きなときに音を出したりできますね。

 

色々挑戦してみてください。

タグ

ちょっと賢いボリンジャーバンドインジケータ

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回に引き続き、「簡単インジケータ作成テンプレート」を使ったサンプルを作ってみます。

今回もボリンジャーバンドを利用します。

 

ボリンジャーバンドにタッチしたら、売ったり買ったりすることが結構あると思います。

でも、本当にタッチしているかどうか分かりにくいですよね。

なので、タッチしているときだけ色を変えるようなインジケータを作ってみます。

 

まだ、テンプレートをダウンロードしていない人は、「簡単インジケータ作成テンプレート」からダウンロードしてください。

 

indicator_temp.mq4をコピーして、適当な名前にしてください。

例として、BB_I.mq4とします。

このファイルは、

インストールパス\MetaTrader\experts\indicators

に入れてくださいね。

 

いつものようにメタトレーダーを起動して、メタエディターを開いてください。

そこで、先ほど作ったBB_I.mq4を開きます。

 

変更する場所は、一番下の関数

DataSetだけです。

 

以下のように修正してみてください。

 

void DataSet(int i)

{

   double dBBUp = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_UPPER,i);

   double dBBDown = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_LOWER,i);

   if(dBBUp < High[i])

   {

      ExtMapBuffer1[i]=dBBUp;

   }

   else

   {

      ExtMapBuffer2[i]=dBBUp;

   }

   if(dBBDown > Low[i])

   {

      ExtMapBuffer3[i]=dBBDown;

   }

   else

   {

      ExtMapBuffer4[i]=dBBDown;

   }

//   ExtMapBuffer5[i]=iMA(NULL,0,14,0,MODE_SMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer6[i]=iMA(NULL,0,14,0,MODE_EMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer7[i]=iMA(NULL,0,14,0,MODE_SMMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer8[i]=iMA(NULL,0,14,0,MODE_LWMA,PRICE_WEIGHTED,i);

}

今回は、上下2色使うので、上側にExtMapBuffer1、ExtMapBuffer2

下側に、ExtMapBuffer3、ExtMapBuffer4を割り当てます。

ボリンジャーバンドの上側のラインより高値が高い場合に、ExtMapBuffer1に値をセット。

低い場合に、ExtMapBuffer2にセットします。

下側も同様にセットしています。

 

ボリンジャーバンドで利用する足の数を変えられるように、Param1を使いました。

 

コンパイルして、描画させたいグラフにドロップしてみてください。

Param1は0になっているので、21とか適当な値にしてください。

線の太さや色もパラメータで設定できますので、いじってみてくださいね。

 

表示させた結果、ちゃんと色が変わっているのが分かりましたか?

 

 

でも、なんか線が飛んでいませんか?

データを入れていないところは、デフォルトでEMPTY_VALUEという描画しない値が、入っています。

ちょうど、書き始めに値が入っていないため抜けているんですね。

 

というわけで、ちょっと気持ち悪いので、たりない情報を別のバッファからもらうように修正してみます。

 

void DataSet(int i)

{

   double dBBUp = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_UPPER,i);

   double dBBDown = iBands(NULL,0,Param1,2,0,PRICE_CLOSE,MODE_LOWER,i);

   if(dBBUp < High[i])

   {

      ExtMapBuffer1[i]=dBBUp;

      if(ExtMapBuffer1[i+1] == EMPTY_VALUE)ExtMapBuffer1[i+1] = ExtMapBuffer2[i+1];

   }

   else

   {

      ExtMapBuffer2[i]=dBBUp;

      if(ExtMapBuffer2[i+1] == EMPTY_VALUE)ExtMapBuffer2[i+1] = ExtMapBuffer1[i+1];

   }

   if(dBBDown > Low[i])

   {

      ExtMapBuffer3[i]=dBBDown;

      if(ExtMapBuffer3[i+1] == EMPTY_VALUE)ExtMapBuffer3[i+1] = ExtMapBuffer4[i+1];

   }

   else

   {

      ExtMapBuffer4[i]=dBBDown;

      if(ExtMapBuffer4[i+1] == EMPTY_VALUE)ExtMapBuffer4[i+1] = ExtMapBuffer3[i+1];

   }

//   ExtMapBuffer5[i]=iMA(NULL,0,14,0,MODE_SMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer6[i]=iMA(NULL,0,14,0,MODE_EMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer7[i]=iMA(NULL,0,14,0,MODE_SMMA,PRICE_WEIGHTED,i);

//   ExtMapBuffer8[i]=iMA(NULL,0,14,0,MODE_LWMA,PRICE_WEIGHTED,i);

}

これで、試してみてください。

うまくいったでしょ。

ちなみにコンパイルするとパラメータの設定が初期化されてしまいます。

 

気になる人は、上の方の

#property indicator_color1 Red

#property indicator_color2 Blue

#property indicator_color3 Green

#property indicator_color4 Yellow

extern int Param1=0;

 

の値を変えてみてくださいね。

タグ