「FXメタトレーダー
入門」
「FXメタトレーダー
実践プログラミング」
管理人の書いたメタトレーダー4プログラミングの入門書。
好評発売中!

ブルベア大賞
2008-2009特別賞受賞
管理人の書いたメタトレーダー4実践プログラミングの決定版。
好評発売中!
Amazonで売れている「システムトレード」本はこちら
Amazonで売れている「メタトレーダー」本はこちら

2007年12月19日

メタトレーダーQ&A:エキスパートプログラムで自動売買できない

「FXメタトレーダー入門」読者向けのサービスとして、メタトレーダー全般に関してちょっと注意する点をQ&A形式で記事にしていきます。

まずは、

Q:エキスパートプログラムで自動売買ができないのですが。

という質問です。単に自動売買ができないだけだと様々な理由が考えられます。
最も基本的なものは、メタトレーダーの設定でエキスパートプログラムが利用できない状態になっている、トレードを許可していない状態になっているなどがあります。これらの解決方法については、「FXメタトレーダー入門」の265ページ以降の解説をご覧ください。

ここでは、それ以外の理由として、「カスタム指標としてシグナルを表示させることはできるが、それをエキスパートプログラムにした場合に売買されない」というケースについて見てみます。

まず、サンプルプログラムとして214ページの「MACross_Ind.mq4」を取り上げます。これは単純な移動平均交差システムなので、期間の異なる二つの移動平均の交差で売買シグナルを表示させるものです。

以下のコードは2本の移動平均線を算出する部分です。

for(int i=limit-1; i>=0; i--)
{
BufFastMA[i] = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,i);
BufSlowMA[i] = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,i);
}

ここで、注意するのはiMA()の最後のパラメータ「i」です。これは最新のバーの位置を0、1つ前のバーを1、2つ前のバーを2というように、移動平均を算出する位置を表すものです。

BufFastMA[i]の[]の中の「i」とiMA()の最後のパラメータの「i」が一致していれば、それぞれの「i」の位置で正しく移動平均の値が算出されることになります。

ここで、間違った例として、iMA()の最後のパラメータを「i-10」としてみます。

for(int i=limit-1; i>=0; i--)
{
BufFastMA[i] = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,i-10);
BufSlowMA[i] = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,i-10);
}

これは、iの位置での移動平均を、iから10バーほど右側のバーから過去に遡ったバーにおける値から算出することを意味します。これは見た目としては、元の移動平均線が左に10バー移動した形になります。そうすると、売買シグナルも10バーほど早く出ることになるので、チャート上で見ると、非常に的確に売買シグナルが発生できているように見えます。



しかし、このシグナルはリアルタイムで出せるものでしょうか?答えはNOです。チャートの右端を見てください。



この図では、最新のバーから過去の10本のバーまでは、移動平均が計算できていません。そうなってくると、リアルタイム、つまり最新のバーでシグナルを出せるはずはありません。このシグナルは10バー経過した後に表示される、言わば「後だしジャンケン」のようなものです。

このようなシグナルは、カスタム指標として表示させる場合、プログラム上の問題はありません。しかし、このシステムをエキスパートプログラムとして書いた場合、どうなるでしょうか?

例えば、222ページのエキスパートプログラム「MACross_Exp.mq4」で、

double FastMA1 = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,1-10);
double SlowMA1 = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,1-10);
double FastMA2 = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,2-10);
double SlowMA2 = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,2-10);

と書いてみます。先ほどと同じく、iMA()の最後のパラメータをそれぞれ -10 します。これをストラテジーテスターで動かしても、全く売買はされません。自動売買では常に最新のバーの位置で売買することになるので、最新のバーで売買シグナルが出せないシステムでは、当然ながら一切売買できないということになります。

ここでのエキスパートプログラムで自動売買のできない理由は、「最新のバーでシグナルを発生するシステムになっていない」ということだったわけです。

この手の間違いは、ネット上に公開されているシグナル指標をそのままエキスパートプログラムに移行しようとする場合によく陥ります。しかし、それもそのはずで、もし、このシグナル指標から移動平均線が消えていて、シグナルの場所だけ表示されていたらどうでしょう? 特に初心者にとっては、プログラムを見てこれが自動売買できないということがすぐにわかるでしょうか?

実際に、そういうプログラムを意図的に公開、もしくは販売しているケースもあるのです。そういう悪質なプログラムに引っかからないためにも、シグナル指標プログラムやエキスパートプログラムにおいて、シグナルを発生させる位置や、そのシグナルの計算のためにどの範囲のデータを使うかということを正確に理解しなければいけないのです。

にほんブログ村 為替ブログへ上位ランキングのブログ記事はこちら
マネポケ金融投資ブログランキングここにも為替ブログ記事が満載!
posted by toyolab at 15:42| 「FXメタトレーダー入門」

2007年12月12日

MQL4入門(2) - 文字列の連結

前回データ型の説明の中で string(文字列)型を説明しました。そこで、文字列の連結として、「+」でつなぐ方法と、StringConcatenate()関数を使う方法を紹介しました。

違いはStringConcatenate()の方が高速で省メモリだと説明しましたが、色々と試してみるとそれだけはありませんでした。

どちらの方法でも、文字列だけでなく、整数や実数の数値もそのまま書くだけで連結されるのですが、実数の場合、ちょっと結果が違うようです。

StringConcatenate()のように、複数のパラメータをいくつでもコンマ「,」で区切って指定する関数は、他にもAlert()、Comment()、Print()などがあります。

例えば「FXメタトレーダー入門」の190ページで紹介した Comment()関数を使って、

Comment("Bid=", Bid);

と書くと、チャートがEUR/USDの場合だと、

Bid=1.4717

と表示され、チャートがUSD/JPYの場合だと、

Bid=111.93

と表示されます。特にそのままで問題ないように見えます。
276ページで説明した Alert()も同様で、Ask をそのまま指定するだけで、買値がそのままの形式で表示されます。

しかし、

double x=0.123456789;
Comment("x=", x);


のように小数点以下9桁もある実数を同じように表示させると、

x=0.1235

と四捨五入されて小数点以下4桁までしか表示されません。

一方、281ページで説明した SendMail()では、文字列を予め「+」で連結したものをパラメータとして指定します。このような関数は他にも MessageBox()などがあります。

この場合、

SendMail("Subject","Ask="+Ask);

と書くと、メールの内容を表す部分が、

Ask=111.93000000

と小数点以下8桁までが0を含めて強制的に表示されます。

このように、同じ文字列の連結でも、実数に関しては、

・StringConcatenate()で連結する場合、小数点以下4桁まで0を切り捨てて変換
・「+」で連結する場合、小数点以下8桁まで0を含めて変換


という違いがあるのです。

FXレートのような数値データの場合、どちらかというとStringConcatenate()の方が扱いやすいので、

SendMail("Subject",StringConcatenate("Ask=",Ask));

と書くと、

Ask=111.93

のように変換され、小数点以下の0はカットされます。

あるいは、小数部の桁数を明確に指定したい場合は、278ページでの説明のように小数部の桁数を指定して文字列に変換するDoubleToStr()という関数を使って

SendMail("Subject","Ask="+DoubleToStr(Ask, Digit));

と書くこともできます。

文字列の連結に関してはいくつかの方法があるので、色々と試してみて自分の好みの方法を見つけてください。

最後に文字列に関連するMQL4の関数を挙げておきます。これらの関数を駆使すれば、さらに複雑な文字列の操作を行うことができます。(今回は詳細は省略します)

文字列関数
string StringConcatenate( ...) 文字列の結合
int StringFind(text, matched_text, start) 文字列の検索
int StringGetChar(text, pos) 文字列中の文字コード
int StringLen(text) 文字列長
string StringSetChar(text, pos, value) 文字列の変更
string StringSubstr(text, start, length) 部分文字列の抽出
string StringTrimLeft(text) 文字列の左詰め
string StringTrimRight(text) 文字列の右詰め

変換関数
string CharToStr(char_code) 文字から文字列へ変換
string DoubleToStr(value, digits) 実数から文字列へ変換
double NormalizeDouble(value, digits) 実数の正規化
double StrToDouble(value) 文字列から実数へ変換
int StrToInteger(value) 文字列から整数へ変換
datetime StrToTime(value) 文字列から時間へ変換
string TimeToStr(value, mode) 時間から文字列へ変換

にほんブログ村 為替ブログへ上位ランキングのブログ記事はこちら
マネポケ金融投資ブログランキングここにも為替ブログ記事が満載!
posted by toyolab at 18:20| 「FXメタトレーダー入門」

2007年12月10日

MQL4入門(1) - データ型(変数)

拙作「FXメタトレーダー入門」では、サンプルプログラムをもとにして、その理解に必要な項目だけをその都度解説する形式をとっています。初心者が手っ取り早くプログラムを理解するにはこの方法がいいと思ったからです。

ただ、ある程度色々なことがわかってくると、それらをつなぎ合わせるための系統だった理解が必要でしょう。このような内容も本書に盛り込みたかったのですが、下手をすると単にレファレンスマニュアルの和訳だけになってしまいかねないこともあり、採用にはいたりませんでした。

その代わりといっては何ですが、本書の内容を補足する記事を 「MQL4入門」ということでブログに掲載していきたいと思います。一応、「FXメタトレーダー入門」の読者向けのサービスですので、本を片手にご覧いただけると幸いです。

まずは、データ型からです。

MQL4ではデータを表す型として以下のような種類があります。

 ・Integer (int)
 ・Boolean (bool)
 ・Literals (char)
 ・Strings (string)
 ・Floating-point number (double)
 ・Color (color)
 ・Date and time (datetime)

ただし、プログラム中に変数として使う型は

 ・Integer (int)
 ・Boolean (bool)
 ・Strings (string)
 ・Floating-point number (double)

の4つに絞られます。今回の記事はこれらの4つの型についてです。

int型とdouble

「FXメタトレーダー入門」では、まず、数値を表す型として int(整数型)とdouble(実数型)を紹介しました。(128ページ参照)

基本的に数値計算ができればカスタム指標は作れます。
ただ、全く説明しないのもなんなので、残りの string(文字列型)と bool(論理型)もサンプルプログラムに登場させて簡単に説明しています。ここでは、もうちょっと説明を追加しておきます。

string

string(文字列型)は、データウィンドウに指標のラベルを表示させる部分で簡単に説明しています。(192ページ参照)

文字列を表す型はC言語にはないので、MQL4独自の型というわけです。これがプログラミング言語的にいいのかどうかわかりませんが、初心者にとっては結構扱いやすい便利な仕様になっています。

文字列を扱う関数もいくつか用意されています(358ページ参照)が、よく使うのが、文字列の連結だと思います。これが「+」の記号でできるのは便利です。

"ABC"+"XYZ"

と書くと、二つの文字列が連結されて "ABCXYZ" となります。さらに意外だったのが、数値を連結すると、勝手に文字列に変換されて連結される点です。

つまり、

int Period=21;
string label="ABC"+Period+"XYZ";

と書くと、labelが "ABC21XYZ" と数値部分まで連結されるのです。この機能は初心者にとってはそんなに意外なことではないでしょうが、個人的にはちょっとびっくりしました。ただ、本書では、このように著者が動揺したことについては触れていません(^^;

いずれにしろ、「+」で文字列や数値データまで連結できると覚えておいて問題ありません。ただ、もし、大量のデータを連結(そういうケースがあるかどうかわかりませんが)する場合などで、動作がおかしくなったときに、次のようにStringConcatenate()という関数を使う手があるということも覚えておくといいかと思います。

string label=StringConcatenate("ABC", Period, "XYZ");

この書き方は276ページで説明している Alert()関数のパラメータの書き方と同じです。内部では同じルーチンを使っているのだと思います。

MQL4のヘルプによると、「+」で連結するより、StringConcatenate()関数を使う方が「高速で使用メモリが少ない」とあります。一応、ご参考まで。

bool

最後にbool型です。

bool型についても、221ページ、322ページで簡単な使用例を紹介しています。二つの状態を二者択一で表すものです。
bool型というのは論理型と言って、if文中で出てくる AND(&&)とか OR(||) とかの論理演算を使った論理代数を提唱したブールさんという人名から名づけられたものです。
と言っても、そう難しく考える必要はありません。

簡単に言うと、bool型で宣言したときに代入される値は、false=0、true=1 と同じことなのです。
じゃあ、わざわざbool型にしなくても int 型で0と1を使えばいいじゃないかと思う方も多いでしょう。(私もプログラムを始めた頃はそういう使い方をしてました)
確かにint型で表しても間違いじゃありません。なぜ、boolを使うかと言うと、「プログラムの間違いを少なくするための工夫」と言ったところでしょうか。

プログラム中には数値としての0、1もよく現れます。その中で二者択一を表す場合にも0、1を使うと、プログラムを見直すときに0、1の意味が数値なのか、二者択一なのか、いちいち考えなくてはいけなくなります。
それを一目でわかるようにするためにbool型として true、false という記号を使うというわけです。
最初はよくわからなくても構いません。プログラミングに慣れてくると、どういう場面で bool型を使えばいいかがわかってくることでしょう。

にほんブログ村 為替ブログへ上位ランキングのブログ記事はこちら
マネポケ金融投資ブログランキングここにも為替ブログ記事が満載!
posted by toyolab at 15:32| 「FXメタトレーダー入門」

2007年12月07日

サンプルプログラムのインストール方法

「FXメタトレーダー入門」に掲載されたプログラムはすべてパンローロング社のサイトからダウンロードできます。ダウンロード先は本書の113ページに掲載されています。

サンプルプログラムは、mq4.zip という圧縮されたファイルとしてダウンロードされるのですが、それをお使いのメタトレーダーにインストールする方法が詳しく書かれていませんでした。以下に補足しておきます。

mq4.zip ファイルのフォルダ構成は以下のようになっています。



まず「mq4」というフォルダがあります。そしてその下に「experts」というフォルダがあります。自動売買用のエキスパートプログラムは、この experts フォルダの下に格納されています。
そして、さらにその下の「indicators」フォルダの下にカスタム指標プログラムが格納されています。

このようにexperts フォルダから下は、メタトレーダー上のフォルダと同じ構成となっています。

ですから、mq4.zip をファイルエクスプローラなどで閲覧してフォルダを開いていく(Windows XP以降の場合、特に解凍する必要はありません)とexperts フォルダが現れるので、この「experts」フォルダを、お使いのメタトレーダーがインストールされているフォルダにコピー(マウスでドラッグ&ドロップ)すると、サンプルプログラムをインストールすることができます。



なお、メタトレーダーは、起動時にインストールされたファイルの再構築を行うので、サンプルプログラムのインストールは、メタトレーダーを終了した状態で行ってください。

プログラムの保存場所の詳細については、本書の109ページ以降をご参照ください。
posted by toyolab at 14:43| 「FXメタトレーダー入門」

2007年12月04日

「FXメタトレーダー入門」明日発売!

パンローリング社の直販サイト、トレーダーズショップによると、「FXメタトレーダー入門」明日発送予定と変わっていました。

ということは、もう普通に注文できるということですね。

「FXメタトレーダー入門」の注文はこちらから

しかし、実は私、まだ本を見ていません(^^;
もしかすると、作者より先に本を目にする人もいるのかもしれません。
早く見たいです。

にほんブログ村 為替ブログへ上位ランキングのブログ記事はこちら
マネポケ金融投資ブログランキングここにも為替ブログ記事が満載!
posted by toyolab at 18:45| 「FXメタトレーダー入門」