さて前回は、「OrderSelect問題」の仮説検証の結果、仮説が間違えていたところまで書きました。今回は、今まで作ってると書いていた、MT4用EA共通部品のベータ版リリースについてのお知らせです。(ダウンロードのリンクは本記事後半にあります)
まずは共通部品の命名
「ahfw」
#命名のゆえんは、「AHaha_fxtrader FrameWork」を略しただけという短絡的な命名。。
そんな事、どうでもええやん。。。
ま、まぁともかく共通部品は、インクルードファイル形式で、「ahfw.mqh」というファイル名。
つまり、共通部品のソースを見れる様になっていて、ユーザーズガイドとサンプルも付けています。
今回の共通部品ベータ版リリースの主旨は以下の通りです。
【共通部品ベータ版リリースの主旨】
----------------------
1.MT4用EA開発のブログ記事を具体的にどうプログラミングしている
のか判れば、今の段階でもブログを読んでる方に役立つと思った。
2.「テスト計画」で予定していた設計書が途中まで書けた
→ 共通部品を利用する側の観点までは書けた
3.最近はデモ口座上でEAを動かして発生したバグ件数が収束してきた。
→ テストは完了してないけど、そこそこの品質になってきた
4.ちょっとでも早めに多くの人に使ってもらう事で品質向上につながると思った。
5.ソースを見てもらう事で、バグを見つけてもらう事ができるかもしれない。
6.最近ブログ記事の投稿が滞っていた
----------------------
つまり本音は
「人柱になって
バグを見つけて欲しい」
という事。
ともかく、共通部品が今どういう実績/状況かを整理してみた。
【実際検出したエラーの整理】
-------------------------
「●」マークは、基本的に期待通りの動作をし、問題が発生しなかった箇所
赤マークの箇所については後述。
-------------------------
デモ環境でもいろんなエラーを体験できてよかった!!
ではさっそく、上記で「赤マーク」の箇所について補足説明
【「赤マーク」の補足説明】
-----------------------------
※1「ERR_COMMON_ERROR」
以前のブログ記事では、「ODL」だけで発生していて、「ODL」固有の問題かと
思っていたけど、「Forex.com」でも発生。
つまり、SL/TPで決済されていたオーダにOrderClose()すると、この
エラーコードが返却されるという「仕様」みたい。
でも隙間を防ぎようが無い事を考えると、「仕様バグ」だと思う。
これは、デモ口座の有効期限切れが原因。
ただ、現状の設計では「クリティカル・エラー」扱いというところまでは
いいけど、「新規発注停止状態」になるだけで、OrderModify()とかOrderClose()
は延々と実行されてしまい、結果、大量のエラーメールが送信されてしまう事が
現状の問題。
これは以前のブログ記事で検討した対処を行った後に発生。確かに期待通りの動作となったが、
実装方法をよく考えると、良くないケースがある事に気付いた。
何かと言うと、1分間の時間を計る際、リトライ開始可能時間をファイル上の大域変数に
保存して途中でMT4再起動しても問題無い様にしようとしていた。
でも時間計測にGetTickCount()を使用していたが、これはPC起動後を基点とした経過ミリ秒。
つまりPC再起動したら、保存したデータ全く意味の無い値に。
なので、TimeCurrent()を使用する様に変更したけど、それ以降まだ「ERR_TRADE_TIMEOUT」
が発生してないので、実績がある様な無い様なという状態。
これはECN業者なのに誤ってECN業者対応じゃないプロパティ設定をしてしまっていたから。
この設定ミスは残念ながら、成行き注文するEAだけ。
まぁ少なくとも、ECN対応業者でOrderSend()時に成行き注文でSLを指定すると、この
エラーコードが返却される事が判った。
たいした話じゃなくて、start()関数を排他制御する前に発生していたという話だけ。
排他制御を入れた後は発生していない。
-----------------------------
そして今認識しているEA開発上の課題を、ブログに載せたもの以外も含めて列挙すると。
【残課題】
-----------------------------
1.「OrderSelect」問題の原因が不明
あれからいろいろ試しているが結局まだ原因不明。再発もしてない。
2.「zero divide」の原因が不明
以前のブログ記事の通り、ロジック上の除算の母数がゼロだったらエラー通知する様に
修正しただけ。でもその後再発してなくて、結局原因不明なまま。
3.ファイル上の大域変数に格納する関数でリトライ制御していない
start()を排他利用してる場合は問題にならないはずだけど、
排他利用しない様にすると、リトライが必要かもしれない。
4.IsConnected()の挙動がヘン
「ERR_NO_CONNECTION」が発生した場合に、IsConnected()が成功するまで
ループさせて成功したら、本来のオーダ関連関数をリトライするロジックにしている。
でも、「ERR_NO_CONNECTION」が連続して多発していたケースがあった。
他の発生箇所では、設計通りの動作になっている。
つまり、IsConnected()が上手く機能しないケースがあるという事。
これは原因判明しなくても問題にならないので、どうでもいいけど。。
5.start()関数直後のIsTradeAllowed()は本当に必要か
意味の無いロジックだったら消したほうがいいけど、start()直後の
IsTradeAllowed()は存在意義に疑問が。
6.イベントが発生したバーを覚えておくのにBarsを使用
最大値を超過した場合の動作が不明。
7.前述の「ERR_INVALID_ACCOUNT」で記載した件
-----------------------------
こんな状況で、しかも「テスト計画」に基づく
テストもまだしていない状況。
そんな中、共通関数「ahfw」ベータ版1.00リリースに関してです。
【MT4用EA開発共通関数「ahfw」ベータ版1.00リリース】
------------------------------
1.ダウンロード
以下のリンクをクリックすると、40MBぐらいのzip形式ファイルのダウンロード
が始まります。
→ ahfw0100.zip(40,521KB)
★改版版リリース済みです。以下から最新版をダウンロードしてください。2011/6/26 16:05★
→ 「MT4用EA開発用共通部品「ahfw」」
2.ダウンロードしたファイルの中身
●共通部品本体(ahfw.mqh)
空白行やコメント行含めて、2000行ぐらい
●テンプレートmq4形式ファイル
この共通部品を使うためのテンプレートファイル
●ユーザーズ ガイド(PDF)形式
「MetaTrader4EA開発用フレームワーク「ahfw」ユーザーズ ガイド.pdf」
というファイルがアーカイブの直下にありますので、ご一読ください。
EA開発にあたって必要な事は網羅しているハズです。。
今後もっと増量していく予定です。今でも40ページぐらいありますが。。
●サンプル2種類
・SmoothMADILong
「旧SmoothMADI」システム。実際に使おうとしているEA。
独自インジケータもソース込みで入ってます。
今回のトレーディング・プラン通りに最適化したプロパティは以下の通りになります。
USDJPY ・・・ PrShortPeriod(17)、PrLongPeriod(24) → 年末まで
GBPJPY ・・・ PrShortPeriod(9)、PrLongPeriod(51) → 年末まで
USDCHF ・・・ PrShortPeriod(11)、PrLongPeriod(24) → 年末まで
AUDUSD ・・・ PrShortPeriod(11)、PrLongPeriod(36) → 今年8月末まで
・Sample1
成行き注文で、決済指値を使用したサンプル。とっても綺麗な資金残高曲線を描きます。
しかも、サンプル通りのルールでも、逆のルールにしても、とっても綺麗な右肩下がりです。
まさにマジック!!
3.機能概要(ドキュメントからの抜粋)
1.処理順序制御機能
オーダの発注、ポジションのストップ・ロス(以下SL)/テイク・プロフィット
(以下TP)価格変更、ポジション決済という一連の処理の順序を制御します。
この部品を使ってEAを開発する場合は、既定された関数を用意するだけで、自動的に
共通部品側から呼び出されるので、複雑な処理順序を考えなくてもEAを開発
することが可能になります。
2.監視/運用機能
・システムやトレード結果で異常を検出した場合は、メールとアラート音で通知し、
ログを出力します。
・「トレードログ」として、トレード結果をCSV形式でログに出力できます。
・システムの異常レベルに応じて新規発注を停止させます。
・特定の通貨ペアのみ新規発注を手動で計画的に停止させる事ができます。
・ポジション保有中にMT4を再起動させても、停止前の状態からトレードを再開する
ことができます。
3.マネージメント管理機能
・「最大ドローダウン率」が指定した一定率をオーバーした場合、自動的に新規発注を停止
するとともに、メールで通知することができます。
・「証拠金維持率」が指定した値を下回った場合、自動的に新規発注を停止するとともに、
その旨をメールで通知することができます。
・ロット数を計算する関数を用意しており、また、ロット数を証拠金維持率の一定率以下
に制限することができます。
4.通信/エラー制御機能
・トレードサーバから返却されるエラーの種類毎に、必要に応じてオーダ操作のリトライを
行います。
・リトライ回数が一定回数を超過した場合や、リトライ中に次のバーに進んでしまった場合
は、その旨がメールで通知されます。
5.価格計算/補正機能
・価格計算時に、桁数やAsk/Bidとの上下関係を考慮しなくても、自動的に補正する
関数を用意しています。
・発注やSL/TPの変更時に、実際の市場価格との不整合によるエラーが発生した場合は、
補正される様な仕組みになっています。補正された場合はその旨をログ出力します。
4.共通部品の関数間の関係
以下の図の赤字箇所は、以前のブログ記事からの修正箇所です。共通部品のソースを解析
する場合は、ご参考いただければと思います。#ドキュメントにはまだ載せていません
する場合は、ご参考いただければと思います。#ドキュメントにはまだ載せていません
誰か人柱になって、
バグ報告を
お願いいたします。
ドキュメントの不明瞭な点、誤りも、変更して欲しい仕様も、コメントお願いします。。。
そして、ブログを読んでる方に無茶振りして「FXシステムトレード初心者奮闘記」の「MT4用EA開発時代」は、「OrderSelect問題」の調査を継続するのでした。。
#本当に、バグ報告コメントお願いします。。。。切なる願いです。。。
PDF拝見いたしました。
返信削除以下に修正点ぽいものを僭越ながら挙げさせて頂きます。
8ページ 図「操作利益」は「操作履歴」の間違い?
8ページ エラーレベルの分類「警告エラー」の「説明」が途中で切れている。
13ページ 大域変数コールバック関数3の1~2行目 「初期か」ではなく、「初期化」?
41ページ 表の項番が途中から無くなっている。
すぐに直す必要も無いかもしれないですが。
すごいフレームワークですね。これだけ膨大なソースコードはMQLで見たことが無いです。
今度試しに何か作ってみたいですね☆
【旧ブログから転記】
※ このコメントは、旧ブログで頂いたコメントを、ブログ筆者が転記したものです。
さとしぃ様
返信削除さっそくのフィードバックありがとうございます!
ドキュメントをかなり読みこんで頂いた様で、本当に嬉しく思います!
指摘頂いた点は、さっそく、全て原本を修正いたしました。(まだダウンロードできませんが。。)
> 8ページ エラーレベルの分類「警告エラー」の「説明」が途中で切れている。
修正後は以下の様になります。
「トレード継続可能だが、オーダ操作に失敗した場合や、資金レベルが危険域に達した場合等の異常検出時に出力されます。このエラーが発生した場合、1回だけログ出力/メール通知がされます。」
> すごいフレームワークですね。これだけ膨大なソースコードはMQLで見たことが無いです。
> 今度試しに何か作ってみたいですね☆
ぜひぜひお願いします(使用感とかもコメント頂ければ嬉しいです)!
#ここが判りづらいとか、使いづらいとか。
また、何か気付きましたら追加コメント頂ければ幸いです!!!
今後とも、よろしくお願いします!
【旧ブログから転記】
※ このコメントは、旧ブログのコメントを、ブログ筆者が転記したものです。