mt4 (MetaTrader4)使い倒シストレ

メタトレーダー、自作インジケータ、自作EAで完全自動売買。使えるものは何でも使え。
インジケーター、EA(自動売買システム)製作のご依頼はこちらへ
Googolyen FX Factory
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


にほんブログ村 為替ブログ FX システムトレード派へ
--/--/--(--) --:--:-- | スポンサー広告 | Trackback(-) | Comment(-)
Runtime errors (実行時エラー)


にほんブログ村 為替ブログ FX システムトレード派へ
スポンサーサイト
Imported functions call (インポート関数呼び出し)
MQL4プログラムが実行されている間に関数をインポートする時、いわゆる遅延結合が行われる。
つまりインポート関数が呼び出されるまで該当するモジュール (ex4かdll)は読み込まれない。
MQL4とDLLライブラリはモジュールスレッドが呼ばれて実行される。

Drive:\Directory\FileName.Extの様に読み込まれたモジュール名は完全に制限されるべきではない。
MQL4ライブラリはterminal_dir\experts\librariesフォルダから読み込まれる。
もしライブラリがなければ、terminal_dir\expertsフォルダから読み込もうと試みる。

システムライブラリ達 (DLL達)はOSのルールによって読み込まれる。
例えば、他のエキスパート、同時に動作した他のクライアント端末でもう既に読み込まれていた場合、読み込まれているライブラリを参照する。
その他の場合、以下のフォルダから検索する。
  1. terminal_dir\experts\librariesディレクトリ
  2. 動作しているクライアント端末のterminal_dirディレクトリ
  3. 現在のディレクトリ
  4. windows_dir\SYSTEM32システムディレクトリ (Windows98の場合はwindows_dir\SYSTEM)
  5. インストールされたOSのwindows_dirディレクトリ
  6. PATH環境システム変数で設定されたディレクトリ
もしDLLの動作中に他のDLLが使われ、他のDLLが使えなかった場合、動作中のDLLも読み込まれない。

システムライブラリと違ってカスタムライブラリ (MQL4)は全てのモジュールを別々に読み込み、他のモジュールで読み込まれたライブラリであろうとなかろうと、独立して読み込む。
例えば、caller.ex4モジュールがlib1.ex4とlib2.ex4ライブラリから関数を呼び出し、 lib1.ex4ライブラリはlib2.ex4ライブラリから関数を呼び出したとする。
この場合、同じcaller.ex4モジュールから呼び出したにも関わらず、 lib1.ex4ライブラリ1回と、lib2.ex4ライブラリが2回読まれる。
DLLからmql4プログラムへとインポートされた関数は、Windows API関数に応じたリンケージ規約を守らなければならない。
このような規約に基づくためには、CやC++で書かれたソースプログラム内でマイクロソフト社のコンパイラ特有の__stdcallキーワードを利用する。
上記のリンケージ規約は以下のように決められている。

  • 関数の呼び出し (この場合mql4プログラム)は、適切な方法でスタックにパラメータを設定する為に、 呼ばれた (DLLからインポートされた)関数のプロトタイプを宣言しなければならない。
  • 関数の呼び出し (この場合mql4プログラム)は逆の順序 (右から左)にスタックへと変数を設定する。順序とは関数に渡された変数を読み込む順序である。
  • 明確な関連付けによって渡された場合 (この場合、1行)を除き、変数は変数値として渡さなければならない。
  • 渡された変数を読む時、インポート関数はスタックを解放しなければならない。
インポート関数プロトタイプの説明にあるように、インポート関数へは明確に全ての変数を渡さなければならないので、デフォルト引数を用いることはできない。

もしインポート関数の呼び込みが失敗した場合 (エキスパートがDLLインポートを許可していない設定や何かしらの理由によって該当するライブラリが読み込めなかった)、エキスパートは動作を中断し、"Expert stopped"ログに該当するメッセージを吐き出す。
更にエキスパートは再初期化されるまで動作しない。
エキスパートは再コンパイルした時、エキスパートプロパティテーブルを開いた時、OKボタンを押した時に再初期化される。

にほんブログ村 為替ブログ FX システムトレード派へ
Program Run (プログラム実行)
プログラムがチャートに設置されるとすぐにinit()関数が実行される。
チャートに設置されたエキスパートアドバイザー、カスタムインジケータのini()関数は、クライアント端末が開始され過去データが読み込まれた (これはエキスパートだけに関係する)後、チャートの表示期間か通貨が変化した後、 MetaEditorによってプログラムが再コンパイルされた後、エキスパートウィンドウやカスタムインジケータのセッティングが変更された後、に実行される。
エキスパートはアカウントが変化した後に初期化も行う。

チャートに設置された全プログラムはdeinit()関数によって終了する。
deinit()関数はクライアント端末が終了する時、チャートが閉じられる時、チャートの表示期間や通貨が変化する前、プログラムの再コンパイルが成功した時、設定が変化した時、アカウントが変化した時に実行される。
deinit()関数が実行されている間、UninitializeReason()関数を用いて初期化されない原因を見ることができる。
deinit()関数は2.5秒以内に実行終了しなければならない。
もしこの時間内に実行終了しなければ、強制的に終了させられる。
通常は外部からの命令無しで独立的に動作終了するスクリプトもこのルールで実行される。
もしスクリプト実行に多大な時間がかかる (無限ループや、悪いプログラムが原因)なら外部命令 (チャートメニューからのスクリプト削除、同一チャートへの新スクリプトの設置、チャートの終了、チャート表示期間や通貨の変化) によって終了される。
この場合でも、deinit()関数は2.5秒の制限を持つ。

相場価格が更新された時、エキスパートとカスタムインジケータのstart()関数は実行される。
もし相場価格が更新された時に、前の相場価格を用いてstart()関数が実行されていたら、更新された相場価格はエキスパートで処理されない。
プログラムが実行されている間に更新された全相場価格は、start()関数の現在の処理が完了するまで処理されない。
その後、最新の相場価格を用いてstart()関数は処理を行う。
カスタムインジケータにおいては、相場価格と独立した通貨や時間枠の変更ではstart()関数は再計算を行う。
エキスパートプロパティウィンドウが開いている間はstart()関数は実行されない。
エキスパートプロパティウィンドウはエキスパート実行時、開くことはできない。

チャートからプログラムを削除すると、通貨変更、時間枠変更、アカウント変更、チャートを閉じる、クライアント端末終了、と同様にプログラムの実行を遮断する。
もし実行中断の命令を受けた瞬間に、start()関数が実行していたなら、2.5秒以内に終了させられる。
プログラムは標準関数であるIsStopped()関数を用いてプログラムを終了するようにしなければならず、正確に動作を終了しなければならない。 スクリプトの実行は相場価格と独立ではない。通貨変更、チャート時間枠の変更において、スクリプトは処理を終わらせ、クライアント端末のメモリを解放する。スクリプトとエキスパートの処理は同一スレッドで行われる。カスタムインジケータでは主スレッドで処理が行われる。もしカスタムインジケータ内でiCustom()関数が呼ばれていたら呼ばれたプログラムのスレッド内で処理が行われる。ライブラリ関数も同様に呼ばれたプログラムのスレッド内で処理が行われる。

にほんブログ村 為替ブログ FX システムトレード派へ
Program Run
MQL4プログラムを動作させる為にはコンパイル ("コンパイル"ボタンかF5ボタン)をしなければならない。
そしてどんなエラーもあってはならない (警告は許されるが、その原因を分析しなければならない)。
terminal_dir\expertsterminal_dir\experts\indicatorsterminal_dir\experts\scriptsフォルダ内に、同一名で拡張子がEX4の実行ファイルが生成される。
これが動作することができるファイルである。

エキスパート、カスタムインジケータ、スクリプトは"Navigator"ウィンドウからチャート上にマウスでドラッグすることによって設置することができる。
MQL4プログラムはクライアント端末に設置されない限り動作しない。

エキスパートの動作を止めるには、メニューの"Expert Advisors - Delete"から削除する。
"Enable Expert Advisors"の状態はエキスパートの実行に関係する。

カスタムインジケータを止めるには、チャート上から削除すればよい。

カスタムインジケータとエキスパートアドバイザーはチャート上から明確に削除されるまで動作する。
エキスパートとカスタムインジケータの設置情報はクライアント端末を立ち上げている間、保持される。
スクリプトは一度だけ実行され、実行後、現在のチャートが閉じられた時、スクリプトの状態が変わった時、クライアント端末が終了した時に、自動的に削除される。
スクリプトの情報が保持されない為、端末の再スタートではスクリプト動作しない。

一つのチャートにおいて、エキスパート、スクリプト、インジケータは同時に実行される。



にほんブログ村 為替ブログ FX システムトレード派へ
Designed by aykm.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。