基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

著書のご紹介

2010年08月03日(火)

MQL5でよく出てくる構造体 [MetaTrader5]

今回はプログラミングの基礎に戻ってデータ型と構造体の話です。

C言語やMQL4では、

int a;
double b;

のように書くと、a、bという変数をそれぞれ、int(整数)型、double(実数)型として宣言したことになり、その後、そのプログラム中で使えるようになります。

MQL4の場合、データ型といっても、int、double、string、bool、color、datetime の6種類しかなかったので、覚えるのもそんなに苦ではなかったと思います。

MQL5でも同じデータ型は使えますが、さらに増えたものもあります。

特に整数を表す型が、char、short、int、long、uchar、ushort、uint、ulongの8種類と増えています。

また実数はdouble、float の2種類に増え、さらにenumという列挙型が追加されています。

ただ、これらのデータ型をすべて使いこなさなくてはいけないというわけではなく、特に数値の表現範囲や精度にこだわらなければ、整数はint実数はdoubleと覚えておけば大丈夫です。

ところで、前回、Bid、Ask を調べた際に
MqlTick tick;

のようなコードが出てきました。

これをそのまま読むと、tickという変数をMqlTick 型として宣言したという意味になります。

しかし、MQL5には、「MqlTick」 というデータ型はありません。

では、これは何かというと、「構造体」というデータ構造として定義されたデータ型の一種なのです。

そもそも「構造体」という考え方はC言語にあるもので、複数のデータをまとめて一つのデータとして扱うためのものです。

ただ、複数のデータと言っても色々なバリエーションがあるので、それぞれの構造体を区別するために名前が付いています。

MQL5で予め定義されている構造体の一つが、「MqlTick」 であり、次のように定義されています。

struct MqlTick
{
datetime time;
double bid;
double ask;
double last;
ulong volume;
};
構造体の定義はこれだけなのですが、ここで、
MqlTick tick;

としてtickという変数を宣言すると、tickには、datetime型のデータ1つ、double型のデータ3つ、ulong型のデータ1つの計5つのデータがまとめて格納されることになるのです。

そして、それぞれのデータはどのようにして区別するかというと、各データにはtime、bid、ask などの名前(メンバ名)が付いているので、tick.bid、tick.ask のように、変数名とメンバ名を「.」でつないで表します。

但し、この構造体変数は宣言するだけでBid、Askの値が代入されるわけではなく、SymbolInfoTick()という関数を介すことで実際のBid、Ask値が代入されます。

この関数は2つの引数を取り、最初の引数がシンボル名、二つ目の引数がMqlTick型の変数です。
MqlTick tick; 
SymbolInfoTick(_Symbol, tick);

のようにSymbolInfoTick()関数を呼ぶことで、tick という変数に最新のティックの情報を返します。

最後にMqlTick型のデータを使ってBid、Askの値を表示させるプログラムは以下のようになります。
void OnStart() 
{
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
double Bid = tick.bid;
double Ask = tick.ask;
Print("Bid=", Bid);
Print("Ask=", Ask);
}

このような構造体の考え方は、この後も、チャートの四本値やトレード関数などに頻繁に出てきますので、扱い方を覚えておくとよいでしょう。

Posted at 12時09分 パーマリンク


2010年07月27日(火)

MQL5でBid、Askはどう書くの? [MetaTrader5]

前回の記事では、MQL5には Bid、Askという変数が予め用意されていないということでした。

じゃあ、

double Bid, Ask;

のように直接宣言すればいいかと言うと、確かに宣言は必要ですが、それだけでは実際の売値、買値の値は Bid、Askには代入されません。

こういう場合、考えるだけでは解決できませんから、調べてみるしかありません。

まずは、MT5のメタエディターのHelpメニューに「MQL5のレファレンス」があります。またその下の「MQL5.community」からは、MetaQuotes社のMQL5のサイトを開くことができます。

画像(450x337)・拡大画像(800x600)

MQL5のコミュニティはサンプルプログラムなど多数掲載されているので、ここを調べるのがてっとり早いでしょう。

メタエディターでは、画面下の「Toolboxウィンドウ」の「Articleタブ」と「Code Baseタブ」の画面に、MQL5コミュニティの記事一覧がリストアップされています。

ここから参考になりそうな記事を探してダブルクリックすると、その記事に直接ジャンプすることができます。

今回はその中で、

Migrating from MQL4 to MQL5

という記事を見てみましょう。

ここで、「Migrating」 は「移住」という意味ですが、プログラミング用語では、「移植」を意味します。つまり、「MQL4からMQL5への移植」ということですね。

この記事、実はかなりの大作です。印刷すると20〜30ページ近くになるんじゃないでしょうか。実際、MQL4とMQL5とはそれだけ違いがあるということなんです。

ここでは、当初の目的であった BidとAskだけ調べてみます。

幸い、BidとAskは、「3. Predefined Variables」の最初の方に記述があり、以下のように書かれています。

MqlTick last_tick;
SymbolInfoTick(_Symbol,last_tick);
double Ask=last_tick.ask;

MqlTick last_tick;
SymbolInfoTick(_Symbol,last_tick);
double Bid=last_tick.bid;


これを見てなるほどと、意味がわかる人は次に進んでいって構わないのですが、「MqlTick」って何?「SymbolInfoTick()っていう関数の意味は?」「.ask .bid ってくっついているけどこれは何?」と引っかかってしまうと、ちょっと時間がかかるかもしれません。

実は、これを説明するためには「構造体」という考え方を説明しなくてはならないのです。構造体はもともとC言語に導入されている機能ですが、MQL4では導入されていませんでした。ですから、MQL4しか知らない人にとっては初めての内容になるわけです。

構造体の説明は別の機会に説明することにして、今回はもう少し簡単に書ける方法として、
double Ask=SymbolInfoDouble(Symbol(), SYMBOL_ASK);
double Bid=SymbolInfoDouble(Symbol(), SYMBOL_BID);
という書き方を紹介しておきます。

ここで、「SymbolInfoDouble()」という関数は、シンボル(FXでは通貨ペア)の情報のうち、double、つまり、実数の情報を取得する関数です。

Symbol()」はMQL4と同様、プログラムをアタッチしたチャートのシンボル名を返す関数です。MQL5の場合、「_Symbol」と書くこともできます。

その次の「SYMBOL_ASK」、「SYMBOL_BID」がそれぞれ、AskとBidを意味する記号定数(MQL5では列挙型識別子というのですが、これも話すと長くなるので省略)です。

細かいことはさておき、MQL5でBidとAskを表示させるプログラムは以下のようになります。
void OnStart() 
{
double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
Print("Bid=", Bid);
Print("Ask=", Ask);
}

このスクリプトプログラムを適当なチャートにアタッチすると、その結果は、下図のように「Toolboxウインドウ」の「Expertsタブ」の画面に表示されます。

画像(450x142)・拡大画像(611x193)

ちなみに ToolboxウィンドウはMT4ではTerminalウィンドウと呼んでいたものです。

次回は「構造体」あたりを説明しておいた方がいいかな。

Posted at 14時21分 パーマリンク


2010年07月20日(火)

MQL5スクリプトプログラム [MetaTrader5]

今回からMT5に搭載されているMQL5プログラムについて紹介していきます。

但し、更新のペースはゆっくりなので、急いでMQL5入門したい方は、以下のサイトなどをご利用ください。

「とあるMetaTraderの備忘秘録」のMQL5カテゴリー
http://d.hatena.ne.jp/fai_fx/archive?word=*[MQL5]

では今回は、プログラムをチャートにアタッチすると、1回だけ実行されるスクリプトプログラムについて見ていきます。

スクリプトのサンプルプログラムもMT5にインストールされていますが、このサンプルプログラムは、MQL5で導入された「クラス」という機能を使ったものが多いので、C言語、あるいはMQL4しか知らない人にとってはさっぱりわからないかと思います。

クラスという機能は、そもそもC言語を拡張した「C++」という言語に導入されているものです。これは、独自のデータ構造やそれに関連する関数を作っていく場合に効果を発揮しますが、とりあえず、初心者向けの説明は後回しにします。

「class」というキーワードが入っているプログラムについては、今回は飛ばしていただいて結構です。

では、実際に簡単なスクリプトプログラムを作ってみましょう。

MetaEditorの「File」メニューから「New」を選ぶと、下図のようなWizard画面が現れます。MQL4の場合とほとんど一緒です。

画像(450x269)・拡大画像(609x365)

ここで「Script」を選択してプログラム名(ここでは「test」)を設定すると、次のようなプログラムの雛形が出来上がります。

画像(450x223)・拡大画像(589x292)

このプログラムで、//から始まる行はコメント行#から始まる行はプリプロセッサ命令といったところは、MQL4と同じです。

すると、OnStart()というのが関数のようですが、このOnStart()とは何でしょう?

MQL4の場合、プログラム中に必ず出てくる特殊関数は start()でした。プログラムはstart()関数からスタートするようになっていました。

MQL5のスクリプトプログラムでは、start()の代わりに、OnStart()という関数を使うように変わったのです。

但し、OnStart()を使うのはスクリプトプログラムだけで、カスタム指標プログラムやEAでは、別の関数を特別な関数として使うので注意してください。

詳しくは以下のMQL5のHELPサイトをご覧ください。

http://www.mql5.com/en/docs/runtime/running

では、スクリプトの簡単な例として、売値Bidと買値Askを表示させてみましょう。

MQL4の場合、

Print("Bid=", Bid); 
Print("Ask=", Ask);

と書けばよかったところですが、MQL5では、同じ書き方にすると、コンパイル時にエラーとなってしまいます。

エラーメッセージは
'Bid' - undeclared identifier
'Ask' - undeclared identifier

となります。つまり、BidとAskが宣言されていないという意味です。

実は、MQL4で BidやAskが宣言せずに使えたのは、予め宣言されていて自動的に値が代入される定義済み変数だったからです。

MQL5では Bid、Askは定義済み変数ではありません。では、別の変数名に代わったのかというと、そうでもありません。代わりの変数はないのです。

こうなってしまうと、何も参考資料がなければお手上げです。やっぱり、サンプルプログラムやMQL5のHELPを探していかなくてはなりません。

ということで、続きはまた次回。

Posted at 13時47分 パーマリンク


過去の記事へ

ページのトップへ ページのトップへ

Sponsor AD

シストレナビモバイル

シストレナビモバイル
ケータイでバーコードを読み取りアクセス(詳細はこちら

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

活動状況・Website

ToyolabFX
Toyolab FX-手ぶらで為替取引
FXトレーディング研究所。
FXメタトレーダー入門
FXメタトレーダー入門
最先端システムトレードソフト使いこなし術。
FXメタトレーダー実践プログラミング
FXメタトレーダー実践プログラミング
システム開発過程を段階的に学ぶ。

2010/8

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

PHOTO

ランダムウォークとランダムトレード(5)

ランダムウォークとランダムトレード(5)

カテゴリーリスト

最近の記事

スポンサードリンク

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.