MQL5メモ

MQL5についての個人的なメモ。不完全な内容のため注意。非推奨記事

mql4からmql5への移植

mql4 mql5
#property mql5では冒頭の#propertyでindicator_plotおよびindicator_buffersの宣言をしないとコンパイル時にwarningが出る。
Ask mql5では廃止。以下の2つのいずれかの方法で取得できる
Ask MqlTick last_tick;
SymbolInfoTick(Symbol(), last_tick);
double Ask=last_tick.ask;
Ask SymbolInfoDouble(Symbol(), SYMBOL_ASK);
Bars mql5では廃止。Bars()またはiBars()関数を使う。mql4とmql5の両方で使用できるiBars(NULL,0)を推奨。ただし下記に注意。
//iBars()を使ってBarsを求める処理(MT4 MT5共通で使えるようにしたもの)
//MT5では、なぜか実際のバー本数よりもiBars()の方が値が大きい(本数が多い)場合がある。例えばチャートのバー本数は1000本のはずなのに、iBars(NULL, 0)で求めると1003という実際のバー数よりも過剰な値が返ってくることがある。過剰なバー数のせいで計算処理が上手くまわらない。
//その過剰なバーにはプライスデータが入っていないことから、iClose()で価格を求めて、価格がゼロだった場合はバー本数から1本ずつマイナスしていくことで正常なバー本数を求めている。
//かなりまわりくどい処理になっている。
int bars = iBars(NULL, 0);
for(int i = bars - 1; i >= 1; i--){
   if(iClose(NULL, 0, i) == 0) bars--;
}
DoubleToStr() mql5では関数消滅。DoubleToString()を使うこと(MQL45共用)。
OBJPROP_HIDDEN mql4ではfalseがデフォルトだったが、mql5ではtrueがデフォルトになっているっぽい。常に宣言するのが無難。
OBJPROP_SELECTABLE mql4ではtrueがデフォルトだったが、mql5ではfalseがデフォルトになっているっぽい。常に宣言するのが無難。
StrToDouble() mql5では関数消滅。StringToDouble()を使うこと(MQL45共用)。
TimeToStr() mql5では関数消滅。TimeToString()を使うこと(MQL45共用)。
StrToTime() mql5では関数消滅。StringToTime()を使うこと(MQL45共用)。
WindowFirstVisibleBar() mql5では関数消滅。ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0)を使うこと(MQL45共用)。
AccountCurrency() mql5では関数消滅。AccountInfoString(ACCOUNT_CURRENCY)を使うこと(MQL45共用)。
AccountBalance() mql5では関数消滅。AccountInfoDouble(ACCOUNT_BALANCE)を使うこと(MQL45共用)。
AccountCredit() mql5では関数消滅。AccountInfoDouble(ACCOUNT_CREDIT)を使うこと(MQL45共用)。
WindowScreenShot() mql5では関数消滅。ChartScreenShot()で代用する。ChartScreenShot()はMQL45共用であるが、MT4で使用するとチャート最右端のインデント量(空白の幅)がスクショ画像にした際に固定幅となってしまうため、MT4では位置ずれが生じないWindowScreenShot()の方が使いやすい。まとめると、MQL4ではWindowScreenShot()、MQL5ではChartScreenShot()をそれぞれ使い分けるのがベター。
TimeYear() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
TimeMonth() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
TimeDay() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
TimeHour() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
TimeMinute() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
TimeSeconds() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
TimeDayOfWeek() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
MarketInfo() mql5では関数消滅。同名の関数を作成して再現する。(汎用) 使用回数が少なければ、SymbolInfoInteger(), SymbolInfoDouble(), SymbolInfoTick()を使ってMQL4とMQL5を共通化できる。
SetIndexStyle() mql5では関数消滅。同名の関数を作成して再現する。(汎用)
インジケータバッファのインデックス並び順 【これは間違いかも。要再調査】mql5では最古バーのindexが0となっている。mql4のように最新バーのindexを0にするにはSetIndexBufferの後でArraySetAsSeries(buffer_name, true)を宣言する。
iMA() mql4では引数で指定したパラメータの移動平均線の値を取得する関数であったが、mql5では引数で指定した移動平均線のバッファ(A)を生成しそのハンドル値を返す関数となった。当該バッファ(A)の値を取得するにはCopyBuffer()でバッファ(A)の値を別途宣言したバッファ(B)にコピーする。つまりバッファ(A)の値を直接使うのではなく、常にバッファ(B)に値をコピーしてバッファ(B)の値を使用するという流れになる。とにかく面倒、。
ObjectName() パラメータにチャートIDが必須となった。ObjectName(0, index)でMT4/5共用化するのが良い。注意:なぜかMQL4リファレンスには載っていない。
ObjectsTotal() パラメータにチャートIDが必須となった。ObjectsTotal(0, -1, -1)でMT4/5共用化するのが良い。
ObjectDelete() パラメータにチャートIDが必須となった。ObjectDelete(0, obj_name)でMT4/5共用化するのが良い。
複数オブジェクトの一括削除 MT5では、全オブジェクトのうち、特定の文字列が含まれるものをfor nextループを使って削除する方法はNG。ObjectsDeleteAll()を使うこと。理由等は後述。
ObjectSetInteger() 関数自体はMT5でも有効。ただし引数のOBJPROP_TIME2はMQL5で廃止されたためOBJPROP_TIMEを使うこと。その際に別の引数(アンカーポイント:0,1,2などと指定する)で何番目のTIMEかを指定する。
ObjectSetDouble() 関数自体はMT5でも有効。ただし引数のOBJPROP_PRICE2はMQL5で廃止されたためOBJPROP_PRICEを使うこと。その際に別の引数(アンカーポイント:0,1,2などと指定する)で何番目のTIMEかを指定する。
BarsCalculated(handle) handleで指定した指標の計算済みバー数を取得する。これとチャートのバー数(rates_total)を比較することにより指標バッファが準備済みかどうかを判定できる。
IndicatorRelease(handle) 作成した指標ハンドルを解放する。OnDeinit()内で宣言するのが一般的か。
ChartRedraw() MQL5ではChartRedraw()を宣言しないとラベルの文字列が更新されないことがある。値がおかしい時はChartRedraw()を入れてみる。
TimeCurrent() MQL4、MQL5ともに最後にティックを取得したサーバー時刻を取得する。最終ティック受信時刻ではなく、現在のサーバー時刻そのものを取得したい場合はMQL5で新設された関数TimeTradeServer()を使用すること。

オブジェクトをまとめて削除する場合

for nextのループで全オブジェクトの名前を検索して削除する方法はMT5では使わないこと。MT5のOnDeInit()中でfor nextによるオブジェクト削除を行うと時間足変更時に干渉が発生してチャートの切り替えが異常に遅くなる。複数のオブジェクトを削除する場合はDeleteObjectsAll()関数を用いること(引数にオブジェクト名のprefixを指定できる)。原因などの詳細はMQL5.comの下記ページを参照

MQL5有用ページ(外部サイト)

コメント

この記事へのコメント(0 件)