MT4って

テーマ:

MT4の開発環境もうちょっとよかったらな。。。

操作履歴でエラーでまくってても、原因解明するのに時間かかるんですよね。。。

新しい基本フォーマットみたいなの作ってるんですが、予定の半分ぐらいの達成度です。

これは来週末で終わらないかも。。。

AD

解読編③

テーマ:

前回の続きからになりますが、今までのところは大丈夫でしょうか?なにかあればコメント下さい。


今回は短い解説になりますが、大変重要なのできっちり理解していってください。


MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);


この部分を解説します。まずこの六行の=の左辺を見てください。これは変数を宣言して値を代入していなかったものです。それをこの六行で代入しています。右辺はなにやら複雑ですが、しっかりポイントを押さえれば簡単です。


MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

右辺のiMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)は、iMACDという関数です。()の中が、いくつものコンマで区切られています。このコンマで区切られた数字を引数といいます。この引数をもとにMACDの値を作って変数に代入してくれるんです。つまり引数の値を設定したらあとはチャートの値動きに応じて変数の値は勝手に変化していってくれるんです。大変便利です。

でもこの()の中に何を入れたらいいかわからないですよね?ここで役に立つのがリファレンスです。http://docs.mql4.com/indicators ここに標準のインディケータのリファレンスがあります。


double iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift)


MACDのリファレンスの最初の行にはこう書いてあります。これを参考にして引数を設定していきましょう。

その前に先頭のdouble imacdに注目です。この関数を代入する変数の型はdoubleにして下さいと書いてあります。これを間違うとエラーになる可能性があります。

では引数を見ていきましょう。最初の引数はstring symbolとなっています。通貨ペアを代入します。サンプルではNULLになっていますよね?もちろんこんな通貨ペアはありません。このNULLを入れておくとストラティティジーテスターで選択した通貨ペアが引数として設定されることになります。stringとは、intなどと同じ型名です。NULLについては説明すると長くなりますし、上記の説明のように覚えてもらって構いません。興味のある方は調べてみてください。

二つ目の引数は、時間足の設定です。ここにはゼロが入っていますが、これにより通貨ペアのようにストラティジーテスターで選択できるようになります。このあたりはstandard constantsのtimeframeのリファレンスをみるとよくわかると思います。

次の三つの引数はmacd専用のパラメータです。

その次がどの値を使うかです。終値なのか高値なのかといったことです。standard constantsのprice constantsのリファレンスでわかります。

最後の引数はどのバーを使うかです。0なら今表示されている最新のバーで数字が増えるごとにバーを一本づつさかのぼっていきます。ここは大変重要でどのインディケータにも共通するとこなのでしっかり押さえてください。

最新のバーというのが曲者なんです。最新のバーは次のバーに移るまで動き続けます。つまり、ここの引数を0にしておくとバーが出来上がるまでの動きが反映されるので、MACDがクロスしていなくても一瞬の動きでクロスしたと認識されたりして、後で結果のチャートを見るとシグナルでてないのに売買してると混乱を招きます。

このMACDサンプルの結果をジャーナルでみると、売買時間が時間足を無視した中途半端な時間で仕掛けたりするのはこのためです。

完全にシグナルでてからとするならここに0を使ってはいけません。


ここまで解説すれば後はあとはリファレンス読みながら解読できると思います。


AD

解読編②

テーマ:

二回目です。

難しくなってきますよ。ではさっそく。


int start()

からの説明になります。

具体的な売買ルールはこのスタートの後から始まる{}の中に書きます。このサンプルでいくと最後行までになります。

他のプログラムを見るとスタート以外の{}なんかも出てきますが、今はMACDサンプルの解説ということで触れません。


ではこの中身を見ていきましょう。最初の三行は前回の応用で理解できるかと思います。

一行目だけ説明します。

doubleという実数の型で、MacdCurrent, MacdPrevious, SignalCurrentという三つの変数を用意しています。今回は三ついっぺんに宣言しています。そして、具体的な値の代入はしていません。後で出てきます。


if(Bars<100)
{
Print("bars less than 100");
return(0);
}


今回の解読編の目玉はここです。

この文はif構文といって、条件の真偽によって動作を決めるものです。条件部分は()で囲まれた部分です。Barsというのはチャート上に表示されたバーの数です。これは事前に決められた変数です。

この場合の条件はバーの数が100未満ならということです。

この条件が真のときの動作は{}の中です。

Print()は、()の中をストラティジーテスターのジャーナルに表示させます。

その後のreturn(0)は戻り値というんですが、0を結果としてstart(){}は終了ということです。この辺りは、説明しだすと長くなるので最初はこのように覚えてもらっていいです。

バーが100未満なら、ジャーナルにbars less than 100と表示して、バックテスト終了となるというわけです。


次のif構文はこの応用で解読できると思います。

最初に用意した外部変数のTakeProfitが10未満に設定されていたら、メッセージを表示して終了ということです。



今回はここまでです。

この調子だとものすごい時間がかかるかと思いますが、気長に待ってください。


AD

解読編①

テーマ:

さてはじめていきたいと思います。

MACDのサンプルをエディタ画面で開いてください。

なにやらいっぱい書かれていますが、意味のないところもあります。では具体的に見ていきましょう。


//以降の文はコメントといってプログラムとは関係ありません。コメントはプログラムをわかりやすくするために記述されるものです。//の有効範囲は行の終わりまでです。

これで最初に記述されている会社名やURLはプログラムとは関係ないものということがわかりました。


externから始まる六行は重要ですので、きっちり覚えてください。

externは外部変数といって後で説明します。


double TakeProfit = 50;を例に説明します。

最初のdoubleは型、TakeProfitは変数名、=は代入演算子、50は値といいます。

説明しなくてもなんとなくは意味がつかめるかと思いますが、きっちりと理解していきましょう。

プログラミングしていく過程で何度も登場する値などは、この変数というものを用意してあげるのが普通です。理由は値を変更したくなったときに、プログラム全体を直さなくても代入部分だけ変更すればいいからです。


最初の型ですが、いろんな型があります。でも実際にMT4で使うのは3つなので3つだけ覚えてください。

int型、double型、bool型です。少し乱暴ですが、intは整数、doubleは実数(少数が使えるということ)、boolはtrueとfalseの真偽だけを表すものです。


変数名は任意のわかりやすい名前を好きにつけることができます。変数は前の型によって、その変数の性質が先ほど三種類に変わると思ってください。


=は注意してください。左右同じという意味で理解するとあとあとプログラミングがわからなくなります。=は右のものを左に代入するという意味です。今回の内容なら、TakeProfitに50を代入します。ということです。


文の最後は;で終わるのが原則ですので、忘れないようにしましょう。



このサンプルではbool型が登場しませんが、例を挙げるとbool TakeProfit = true;です。



少し整理と補足をします。

型 変数名 ; =と値を省略したものを宣言といいます。値の代入は後でするというものです。

型 変数名 = 値; これも宣言といいます。また、初期化ともいいます。


この宣言の頭にextrneを追加するとどうなるかですが、コーディング画面ではなく、ストラティジーテスターの画面から数字を変更できるようになります。



がんばって書いてみましたが、けっこう大変です。

このテーマでの更新頻度は高くないかもしれませんが、気長に待っていただければと思います。


MT4 学習について

テーマ:

MT4でのプログラミング方法や、注意点、MQLの基本的なAPI(関数群)の解説はこのブログでしていくつもりです。

しかし、APIすべての解説というのは分量的に無理がありますので、ご了承下さい。質問等があればわかる範囲で随時お答えいたします。


http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/

プログラミングの知識がなくても、複雑なことはできませんが、こちらのサイトで簡単なシステム作成もできます。


わたしはそれほどプログラミング技術があるわけではありません。プログラミング初めて数ヶ月といったところです。

なので説明が不十分になることが多いかと思います。コメントなどでフィードバックいただければ、反映させていただきたいと思います。



MT4使い方 基本編

テーマ:

基本的な使用法を今回は説明します。


バックテストする方法は、ストラティジーテスターという機能を使用します。虫眼鏡のようなアイコンをクリックするか、viewのメニューの中にありますので探してみて下さい。

クリックするとバックテストのセッティング画面が表示されます。ここでいろんな調整をしてスタートボタンを押すとバックテストをして結果を表示してくれます。


サンプルで移動平均線のシステムとMACDのシステムが付属されていますので、そちらでどんなものか確認してください。グラフと細かな結果が表示されると思います。

いろいろ触ってみて下さい。それほど複雑なものではないですし、英語も簡単ですので、使い方はすぐにわかると思います。


コーディング(プログラムを記述すること)画面は、エクスクラメーションマークのアイコンをクリックするか、toolsの中のメタクォートラングエージエディタをクリックしてください。

試しにMACDサンプルのファイルを開いてみてください。

ここまででわからないことがあれば、コメント下さい。


次回からはMACDサンプルを使ってプログラムを解読していきます。

おそらくこの解説はかなり長期に渡るかと思いますし、更新頻度も低いかと思います。気長に待っていただければと思います。

質問の件

テーマ:

allazwardさん、どうもです。


質問の件ですが、これらはバックテストの結果、評価にかかるものでプログラミングに関することではないので、リファレンスには載ってないかと思います。


簡単にわたしの解説を書きます。



bars in test これはバックテストに使用したバーの数です。 日足での検証なら日足の数になります。


ticks modelled これは実際のプライスデータ数です。日足を例にすると、データとしては高値、安値、始値、終値の四本しかありません。この四本だけで検証してしまうと、日中の動きが無視されてストップや指値などが指定した価格で約定されなくなってしまいます。 これを防止するために日足でも使用可能な最小単位のデータを使って検証しています。そのデータ数ということになります。わかりにくくてすいません。わかりにくければ、またコメントください。


modeling quality これはticks modelledと関係します。つまり最小データが豊富で穴がないようなら、そのプライスデータは信頼性が高いということで、このパーセンテージがあがります。


initial deposit これは開始証拠金の額です。


total net profit これは純損益です。



バックテストする際に気をつけることは、豊富なデータを用いて、信頼性を高めた上でバックテストすることです。

けっこうバックテストを公開している中には、この信頼性が40%程度のものもあります。これでは意味がありません。


ちなみに最近MT4がバージョン2.00を公開しまして、ヒストリーのところから1999年からの一分足データをダウンロードすることができます。うわさでは、一分足ではなく完全なティックとも言われています。

そのせいかバックテストがやたら重くなった気がします。


ご不明な点があればまたコメントください。

externを利用する

テーマ:

メタトレーダーを使い倒すという新しいテーマを元にこれからすこしづつ書いていきたいと思います。

以前に人のプログラムを解読したり、改良しようと言いました。

いきなりそんなんできないよ。って言われそうですが、そんなことはありません。

簡単に出来てなおかつ有益なものを紹介します。


まずプログラムを眺めて見ましょう。プログラムの上のほうにexternで始まるものが列挙されていますよね。

このexternの意味ですが、これを使って変数を宣言すると、その変数をバックテスト画面のプロパリティーから数字を変えることができるんですね。

人のプログラムで移動平均線の日数なんで固定されてるんだよ!なんでストップは50pipsで変えられないんだよ!って思ったことありません?ひょっとしてプログラムからそこの数字を探して変えたりしていませんでした?



移動平均線を例にしますね。


iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1) 移動平均線の記述部分です。期間のパラメータは10のところです。ここを自由にプロパリティー画面から変更するには、externの記述部分にこんな一文を追加します。

extern int MaPeriod = 10

externの説明はもういいですよね。

intですが、これは変数は整数ですよ。ということです。小数点の数字を使いたいなら、doubleにします。

MaPeriodは、変数の名前です。わかりやすいものにしましょう。

10というのは初期値ですので、好きな数字を入れてください。


この一文を追加したことで準備は整いました。あとはiMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1)の10の部分をMaPeriodに変えて終了です。これで常に移動平均線の期間は変数MaPeriodの期間になり、その数字は外部から変えることが出来るようになりました。


お役に立てたでしょうか?

もし、わからないことがあればコメントください。