トップ 一覧 Farm 検索 ヘルプ RSS ログイン

MQL4の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{outline}}

!!Operators
!if ~ else
*if文の条件式は全て評価される。
**C/C++の場合は左から順に評価され、確定した時点で評価は打ち切られる。(下の例では何も表示されない)
 void test()
 {
     if( false && hoge(1) ){}
     if( true  || hoge(2) ){}
 }
 
 bool hoge(int no)
 {
     Print( "hoge"+no );
     return (true);
 }
 
 // 実行結果
 hoge1
 hoge2

!switch ~ case ~ default
*defaultは一番最後に書かないとエラーになる。
 // 正しい例
 switch( hoge )
 {
     case 0:
     default:
         break;
 }
 
 // ダメな例
 switch( hoge )
 {
     default:
     case 0:
         break;
 }

!!Standard constants
!DRAW_ZIGZAG
*インデックス番号が連続した2つのインデックスを使用する。
**「偶数から始まる」連続した2つの‥な?
*線色/線種などはインデックス番号が小さいものの設定が有効になる。

!!Predefined variables
!Digits
*小数点以下の桁数。pipsではない。
*下のような処理が何をしているのか分からなくて考えてみた。
 if( Digits==3 || Digits==5 ) { /*10倍する*/ }
**例えばJPY(1pips=0.01円)でDigits=3(精度が1桁高い)が返って来るときの対処、ということじゃないかと推測。
**3と5は決め打ち?
***2桁/4桁の通貨しか存在しない&3桁/5桁の通貨が存在しないことが前提。
***JPYでDigits=4(精度が2桁高い)になったりするとアウト。

!!Functions
!Alert()
*日本語のメッセージは可能だが、警告ウィンドウ下部に表示される履歴では化けてしまう。

!ErrorDescription()
*ERR_NO_RESULTで呼び出すと"no error"とだけ返ってくるので注意。
**正確には"No error returned, but the result is unknown."
*stdlib.mq4参照のこと。

!GetLastError()
*呼んだ時点で内部ワーク(last_error)がクリアされるので注意。下の「ダメな例」では、後ろの呼び出しでERR_NO_ERRORが返ってくる(はず)。
 // ダメな例
 Alert( "(error#" + GetLastError() + ") " + ErrorDescription(GetLastError()) );
 
 // 正しい例
 int err = GetLastError();
 Alert( "(error#" + err + ") " + ErrorDescription(err) );

!IsTradeAllowed()
*取引が許可されているかどうかと、取引スレッドが使用可能かどうかをチェックする(っぽい)。
**IsTradeContextBusy()は、取引スレッドが使用可能かどうかチェックするだけ(っぽい)。
*'''Trading functions'''を呼ぶときにチェックが必要。
*公式サイトに実装例あり。
**[Error 146 ("Trade context busy") and How to Deal with It|http://articles.mql4.com/141]

!MathSrand()
*シードにTimeLocal()やTimeCur()を与えると、バックテストの時に同じ値になるのでGetTickCount()を使用する。
 MathSrand( GetTickCount() );

!ObjectsDeleteAll()
*自身が作成したオブジェクトだけではなく、他のインディケータやEAのオブジェクトも削除してしまう。
*違うチャートには影響なし。

!OrderModify()
*現在の設定と同じ値で呼び出した場合、ERR_NO_RESULTが返ってくる。(Modifyは実行されてないっぽい)
**例えばsl/tpを変更する場合、slは同じでtpが違うときはエラーにならない。両方とも同じだとエラーになる。

!OrderSelect()
*選択した注文はいつまで有効なのか?(調査中)
**呼び出し側が関数が終了(return)するときに無効になる疑惑。

!Trading functions
*OrderSend()、OrderClose()、OrderCloseBy()、OrderDelete()、OrderModify()の5つの関数はインディケータでは使用出来ない。
*上記5つの関数を呼び出す前にはIsTradeAllowed()でのチェックが必要。
**[MQL4 Reference - Trading functions|http://docs.mql4.com/trading]

!WindowBarsPerChart()
*なぜか1本少ない値が返って来る。
**左端のバーは含まないのか?と思ったけど、WindowFirstVisibleBar()はそのバーの番号を返すし‥。

!WindowOnDropped()
*他のサブウィンドウを削除するなどしてインデックス番号が変わっても返値は変わらない。(あくまで実行開始時のインデックス番号が返ってくる)
*インディケータの場合、init()から呼ぶと-1が返ってくる。(EAの場合は0が返ってきた)
*iCustom()で呼ばれたインディケータの場合は-1が返ってくる。

!!etc.
!インディケータの描画優先
*インデックス番号の小さい方が描画優先が低い。
 // 太いOrange線の上に細いRed線を表示する.
 #property indicator_color1 Orange
 #property indicator_width1 5
 #property indicator_color2 Red
 #property indicator_width2 2