スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Re: 間のバーが抜けたときのIndicatorの値

 前回の記事に関して、貴重なコメントをいただいた。
とても興味深い内容だったので紹介させていただくと同時に、
この件に関して自分なりに調べた結果をメモがわりに補足(蛇足?)させていただく。

以下きりりさんからいただいたコメントから抜粋。

間のバーが抜けたときのIndicatorの値
今はネット遮断検出時に無条件に90秒Wait入れていますので、
GetLastError()を使うというアイデアいただき!と思い久しぶりに
チェックしてみました。

そうしたらこの前私がコメントに書いた、
しばらく間が空いてもIndicatorの値は...(途中省略)

ついでに調べた結果をご報告すると、ネット遮断時にGetLastError()は
機能しないみたいです。残念。
ちなみに、これは表示と異なるタイムフレームに
限った話しではありません。

詳しくは下のログを見ていただければわかるかと思います。 (以降省略)

検証結果ログとコメント詳細はこちら。。。

ネット遮断からの復帰後、しばらくしてからのバーの補完とBarsの変化は興味深い結果だ。

一方、検証していただいた際のMQL4記述に関して、自分が把握不足で疑問なところがあったので、
確認を兼ねてこちらでも検証してみた。

続きを読む...

スポンサーサイト

theme : MT4自動売買
genre : 株式・投資・マネー

tag : MT4 EA Indicator GetLastError() 時系列アクセス ネット遮断 タイムフレーム マルチタイムフレーム

昨日の記事、EA等でチャート表示と異なるタイムフレーム...への対処

 昨日の記事でいただいたありがたいコメントに従ってもう少しつっこんで調べてみた結果、
やはり重要な問題と思われるので対処法を決めた。

double dAtr = iATR( NULL, PERIOD_D1, nPeriod, 1 );
int nErr = GetLastError();
if ( nErr == ERR_NO_ERROR )
  OpenPositionRange( nType, dAtr*nSLRatio/100,
  dAtr*nTPRatio/100, true );
else
  Comment( "[ERROR](" + nErr + "): iATR() is Failure, "
  + ErrorDescription( nErr ) );


要点としては、
・データ更新がされておらず、iATR()の取得に失敗する可能性がある。
・最新のデータがロード済みでなくローカルPCに古いデータがある場合、
 戻り値はゼロにならないので、戻り値で判断してはいけない。
・GetLastError()でエラー値を取得し、エラーがあったことが分かれば、
 データ取得できなかった旨のメッセージを表示して、注文は次のティックに先延ばしする。

theme : MT4自動売買
genre : 株式・投資・マネー

tag : MT4EA タイムフレーム マルチタイムフレーム ATR

MT4のEA/Script/Indicatorの動作の違い?マルチスレッドの観点から

先日いただいたコメントについて自分なりに調べてみて分かったことがあるので、
それをメモがわりに記事にさせていただく。
一方、自作DLLでマルチスレッドの対応が必要となる理由について以前の記事で述べた。

EA/Script/Indicatorで表向きの動作がそれぞれどのように異なるかは、書籍、その他サイトで説明されているので周知の通り(実は意外と明確な違いについて知られていない?)だが、MT4の内部的にはどのように実現されているのだろうか?

これまで、「EA/Script/IndicatorはMT4ターミナルのメイン・スレッドとは別のスレッドを割り当てて動いているだろう。」と思っていた。スレッドを共有したり、使い回したりするかもと思っていた。
いただいたコメントについて考えてみると、スレッドの割り当てをどのようにしているかを調べることで
何かが判明しそうだ。EAとScriptは一つのチャート・ウィンドウに一つしかのせられないが、Indicatorは複数のせられる。この違いとMT4でどのようにEA/Script/Indicatorを動かしているかが密接だろうと思う。

EA/Script/IndicatorのそれぞれでWindowsAPIを使って自身のスレッドIDを取得、結果をチャートに表示させてみた。さらにタスクマネージャを起動して、"terminal.exe"のスレッド数がどのように変化するかを確認した。

結果として、EAをチャートにのせるとスレッド数が一つ増え、チャートから削除すると一つ減る。またチャートにのせる度に表示されるスレッドIDは異なる数値だった。何度やってもそうなった。Scriptも同様の結果となった。EAとScriptを二つ同じチャートにのせるとスレッド数が二つ増え、スレッドIDはそれぞれ別の値だった。

どうやら、「EAとScriptの場合は、チャートにのせる度に専用のスレッドを作成、割り当てて処理をさせ、チャートから削除されればスレッドも削除され、スレッドを共有したり使い回したりということはない。」といえそうだ。
(安直な調べ方なので、絶対にそうなっているとはいいきれない。。。)

しかし、Indicatorの場合はEA/Scriptと結果がちがった。

続きを読む...

theme : MT4自動売買
genre : 株式・投資・マネー

tag : MT4 EA Script Indicator DLL IndicatorからDLL マルチスレッド 排他制御 同期処理

MT4EAに自作DLLを組み込む?その3(マルチスレッドの考慮)

自作したDLLを複数種類のEAから同時に共有して使う場合、またはDLLを使用する同じEAを複数同時に動作させる場合などを考慮すると、マルチスレッドの対応が必要になってくることを前回の記事で軽く触れた。

ただし、複数同時に動くEAがデータを共有したり協調したりということがなく独立して動作する関数を呼び出す場合、プログラムの記述でいえばグローバル変数や共通のクラスにアクセスするということがない関数であれば、マルチスレッドに対応する必要はない。
関数内で作成され破棄される変数やオブジェクトは、同時並行に動くスレッド間で独立したメモリ領域へのアクセスになるからだ。

DLLのグローバル変数等にアクセスする関数をEAから呼び出す場合、同じMT4ターミナルで実行される複数のEAでグローバル変数を共有して使用することができるので便利?である反面、スレッド間で同時アクセスによるデータ破壊を防ぐための排他制御、変更の通知などの同期処理が必要となる。

単純なグローバル変数でEA毎に独立でよいのならスレッド・ローカルの指定をすることで対応できるが、EA間で共有することが目的あるいはクラス・オブジェクトである場合は、WindowsAPIを使用したマルチスレッドの排他制御、同期処理が必要となる。

なお、同じPC上の別のMT4ターミナルで動作するEA間でデータを共有または協調動作させるために、DLLのグローバル変数を利用するやり方は使えない。
MT4ターミナルがそれぞれ別プロセスとして実行されており、DLLがアタッチされて使用するメモリ空間はプロセス毎に独立しているからだ。
これを実現するには何らかの方法でプロセス間通信をやる必要がある。
参考1:「MT4他業者の価格を表示させる。/共有メモリの活用。」

さらに、別のPC上それぞれのMT4ターミナルで動作するEA間でデータを共有、協調動作をさせたい場合、ネットワークでの通信処理が考えられるが実装が大変だ。
そもそもMT4がネットワーク処理をしまくっているのだから、こちらで実装することなくそれを活用できないか?
同じ口座であればメッセージやコマンド等を注文に埋め込んで、送信してしまうという手がある。
参考2:「同一口座の他PC間 MT4の通信?」

だんだんと話がズレてしまったが、MT4EAに自作DLLを組み込む場合にマルチスレッド・プログラミングが必要となる状況とその理由についてまとめてみた。。。が、十分ではないかも知れない。
WindowsAPIやマルチスレッド・プログラミングの説明については、参考書籍、参考サイトが沢山あるのでそちらに解説をゆずりたいと思う。

theme : Meta Trader 4
genre : 株式・投資・マネー

tag : C++ DLL EAからDLL MT4EAに自作DLL EAとマルチスレッド マルチスレッド プロセス間通信 排他制御 同期処理

MT4EAに自作DLLを組み込む?その2

前回の記事では、DLLの開発環境に"Turbo C++"を使用した場合のプロジェクト設定について書いた。今回は、自作DLLの関数をMQL4で記述するEAから呼び出す方法をメモしておく。

EAに限らずDLLとしてリンクする関数を外部から呼び出す場合、その関数はエクスポートされていなければならない。またEAがDLLをロードするタイミングは、EAの記述でDLLの関数を始めて呼び出すときであるようだ。よってDLLとEAの関係として明示的リンク、遅延ロードされることが前提となる。いろいろな方法や流儀があると思うが、以下のような方法を用いている。

#define mDllExport extern "C" __declspec(dllexport)

上記マクロを定義してエクスポートする関数の宣言に使用することで、DLLのエクスポート関数であることを示すと同時にCリンケージを適用させる。C++でDLLを作成する場合、エクスポートする関数をCリンケージにしておかないと多重定義に対応できるように引数情報も含めたC++規約の内部関数名でエクスポートすることになり、EAからロードすることができない。

ヘッダ・ファイル等のエクスポート関数の宣言は以下のようにする。

mDllExport int WINAPI DllFunction( HWND hWnd );

WINAPIの指定は関数の呼び出し規約を__stdcallにすることと同等で、MetaEditorのヘルプにこの呼び出し規約を指定することが必要である旨が書かれている。
前回の記事では、プロジェクト・オプションで呼び出し規約を変更するように書いたが、それでは全ての関数が一括して変更されてしまう。プロジェクト・オプションをデフォルトのままにして、エクスポートする関数についてのみWINAPIまたは__stdcallを指定すればよく、それで動作確認済みである。

DLL関数を呼び出すEA側の記述は、includeフォルダにある"WinUser32.mqh"をまねすればよい。

#import "MyTest.dll"             // 自作DLLのファイル名
int DllFunction( int hWnd );       // 上記のエクスポート宣言した関数
#import

以上を記述したヘッダ・ファイルを作成してインクルードするか、EA記述の冒頭部分などに書くことで、DLLからインポートして呼び出す関数の宣言となる。

ここまでで自作DLLを作成してEAから呼び出すことができ、通常のWindowsプログラミング同様の処理をEAですることが可能になる。思ったより簡単で少ない手順で済むものだと思わないだろうか?

この他にもいろいろな引数(型の種類、配列、ポインタ、参照など)を渡す場合にどうするか
さらに同じDLLを使用するEAを複数動作させる場合はDLLのインスタンスが共有され、各EAはそれぞれ別スレッドで動作するのであるから、マルチスレッドの対応が必要になってくるなどクリアするべき問題が沢山あった。

記事に対する反響が大きければ、それに応じて続きを書くし、少なければ自分のメモとして気が向いたときに続きを書こうと思う。。。

theme : システムトレード
genre : 株式・投資・マネー

tag : MT4EAに自作DLL EAからDLL DLL C++ エクスポート関数

☆当ブログとFX取引に関するご注意☆

もし、当ブログを閲覧、参考にしていただいた上で、FXまたはその他取引に関心を持たれた方は、以下の点にご注意して下さい。

・FX取引(外国為替証拠金取引)は元本や利益が保証された商品ではなく、市場環境の変化や相場の変動により損失が発生する場合があること。

・FXおよびその他取引をする場合は、各種のリスクを理解し、十分に検討し、かつ慎重に行う必要があること。

・当ブログで掲載、紹介している情報は、FXおよびその他取引、投資に関する勧誘、助言等ではないこと。

・当ブログで掲載、紹介している取引手法、ソース・プログラム等を用いた結果、いかなる損害が生じても当方は一切の責任を負わないこと。

投資、取引をされる場合は、必ずご自身の責任で行って下さい。
よろしくお願いいたします。
プロフィール

Dr.ヘパ


Author:Dr.ヘパ

カテゴリ&検索
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
月別アーカイブ
カレンダー
07 | 2017/08 | 09
- - 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 - -
つぶやき
★DailyImpact(有償版)★
リアル口座で運用できる有償版
販売開始しました!

ご購入、お申し込み等の詳細については、下記リンク先のブログ右上にショッピング・カート「ブーボーのトレーディングキット工房」へのリンクがありますので、お手数ですがそちらをご参照下さい。

ブーボーの
トレーディングキット

Ⅰ.経済指標トレード向けEA、DailyImpactは、経済指標発表による突発的な値動きを捉えることで、利益を得ることを目指したセミオートEAです。

Ⅱ.経済指標トレードは、「指標トレード」「News Trading(ニューストレード)」とも呼ばれ、最近注目されている手法です。

Ⅲ.経済指標発表によるトレードは、いつ大きく動く可能性があるかわかっているので有利です。

Ⅳ.一方、瞬時に大きな値動きが発生するので、手動での仕掛け、手仕舞いは難しいことが多いです。

Ⅴ.高速に計算・発注可能なEAであるDailyImpactにより、手動よりも素早く、同時に多くの通貨ペアで、しかもその場にいなくても経済指標トレードができます。
★DailyImpact(DL版)★
ダウンロード版
期間限定で試用できます!!

ダウンロード、使用方法の詳細は
以下のブログを参照して下さい。



DailyImpact(ダウンロード版):ブーボーのトレーディングキット

   ☆ブーボーの
トレーディングキット

↓↓↓アンケートにご協力お願いします。↓↓↓
ブログ・ランキング
リンク&ブロとも申請
アクセス・カウンタ
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。