2015-04-12|MT4でFXを勝ち抜く研究をするブログMT4でFXを勝ち抜く研究をするブログ新ブログはこちらへhttps://trv-and-mt4.blogspot.com/ハーモニックパターン検出インジケータV10取説2015年4月17日金曜日クラスを作成する。改造版EAのサンプルを作成してみようと思いましたが、前回アップしたクラスがあまりにバグだらけだったため、とりあえずバックテストを通して一応^^;;動作したクラスをアップしなおします。以降のEA関係の記事は、このファイルがInclude/Customフォルダの下にTradingWrapper.mqhというファイル名で保存されている前提です。全ポジションを成行き決済を行う。すべての注文を変更する。すべての注文を変更する。現在のポジション数を取得する。現在のポジション数を取得する。最大のポジション数を取得する。最大のポジション数を取得する。1pipsあたりの値を取得する。ポジションリストを更新する。ask;//pips値からストップロス値、利益確定値を取得する。リトライしても仕方がないエラーの時は終了してしまう。オーダーが選択できない状態(すでに存在しない)場合は、リストから削除して終了する。リトライしても仕方がないエラーの時は終了してしまう。全ポジションを成行き決済を行う。オーダーが選択できない状態(すでに存在しない)場合は、リストから削除して終了する。ask;//pips値からストップロス値、利益確定値を取得する。リトライしても仕方がないエラーの時は終了してしまう。すべての注文を変更する。すべての注文を変更する。ポジションリストを更新する。クラスのコードを修正しました。新しい記事をアップしています。テンプレートを確認する。ウィザードから作成されたテンプレートコードを確認したいと思います。OnInit()初期化関数です。EA初期化処理を記述します。ウィザードではEventSetTimer(60);とOnTimerを60秒に一回起動する設定が記述されています。戻り値などは、インジケータと同じようです。reason)インジケータのウィザードでは自動生成されなかった、終了処理が自動生成されています。reason引数には終了理由が入ってきます。Codesタイマーの停止やバッファの解放、ポジションの解放などEA終了時処理を記述します。ウィザードでは、EventKillTimer()というタイマーを停止する関数が記述されています。OnTick()EAではOnTickに売買シグナルによる注文判断処理を記述するのが一般的なようです。OnTickは気配値の変更があった場合に呼び出される関数です。OnTimer()一定時間ごとに呼び出される関数です。呼び出し間隔はEventSetTimer(秒)で指定します。OnTester()バックテスト時に呼び出される関数です。OnDeinitの直前に1回呼び出されます。ここでテスト結果の独自評価式を記述することができます。パラメータ最適化を行う際、ここでの戻り値が最大になるように最適化できるそうです。利益の出た取引回数を戻すようにすると、利益が出る取引回数が最大になるような最適化が実行可能ということになります。詳しくはEAをバックテストする記事を書く際に調査したいと思います。&sparam)EAが登録されているチャート上のイベントを取得する関数です。マウスクリックやオブジェクトの登録・削除などUIに関するイベントが取得可能です。EAを作成する分にはあまり関係なさそうです。テンプレートで出来上がったコードはなんとなくわかりましたので、次回まずはEAを作ってみたいと思います。ウィザードを確認します。EA作成してみたいと思います。ナビゲーターウィンドウのExpertsというを選択して右クリックを押します。Fileを選択すると作成ウィザードが開始されます。今回はあらかじめExpertsの下にテストフォルダを作成しておき、その中にSample1というEAを作成します。Advisorが選択されています。このまま次へボタンを押します。インジケーター作成と同様に名前やパラメーターを入力する画面となります。ここではNameの欄にSample1と追加して次へボタンをおします。パラメーターは後からコードで追加したいと思います。テンプレートとして作成されるソースコード上に、どのような関数を追加するかのチェックボックスです。どのようなテンプレートが作成されるか確認するためにチェックをつけれるものはすべてつけます。チェックをつけることができない関数はMT5用の関数でMT4では使用できない物です。イベントハンドラOnTimer:一定時間ごとに呼び出される関数です。呼び出し間隔はEventSetTimer関数で指定します。OnChartEvent:チャート上の操作イベントで呼び出される関数です。テスト用関数を追加するかの選択です。こちらもどのようなメソッドが追加されるか見る為にチェックします。チェックをつけることができないものはMT4では使用できない関数です。OnTester:バックテストやパラメータ最適化の際、DeInitコールの直前に呼び出されます。テスト結果を数値化したい場合に、ここに評価式を入力しておくと結果として出力されます。次回はウィザードで作成されたテンプレートのコードを確認したいと思います。MT4プログラミング2015年4月14日火曜日クラスを作成する。Build600以降のMT4では、なんとクラスを作成できます。プログラマの大好物(?)オブジェクト指向プログラミングが可能です!とりあえず、コンパイルが通るレベルで書いてみました。書き方はC++に基本準拠していますが、アロー演算子が無いようですので、参照であろうが実体であろうが、.でメンバーにアクセスします。このあたりはC#っぽい?サンプルとして売買サポートクラスのさわり部分だけアップします。全ポジションを成行き決済を行う。現在のポジション数を取得する。現在のポジション数を取得する。最大のポジション数を取得する。最大のポジション数を取得する。;//pips値からストップロス値、利益確定値を取得する。リトライしても仕方がないエラーの時は終了してしまう。全ポジションを成行き決済を行う。true;}使い方はこんな感じになります。2);}Tickの度に注文する恐ろしいプログラムですので実行禁止です(笑)たとえば、通貨ペアごとにCTradingWrapperを宣言して、ポジション管理をクラスに任せることで、実際の売買アルゴリズムの部分を単純化できたりします。複雑なプログラムになるほどクラス化の効果が表れるといわれています。1からオブジェクト指向について学習するのは、かなり手間ですので初心者の方にはおすすめしません。プログラム経験者でクラスの作成に慣れているようでしたら、あらかじめクラス設計をしておくことをお勧めします。設計しておくだけでも将来の開発速度向上の効果が見込めます。将来EAアルゴリズム部分の開発に集中するために、最初に少しだけ手間をかけておくという考え方です。プログラム的には、豊嶋先生の本を参考にしながら記述しました。GetTickCount();を受ける引数はuintという負数をとらない整数を指定してください。GetTickCountの特性で40日ほど放置すると0に戻ります。intで計算してしまうと、いつまでも終わらない症状が発生する場合があります。startは必ず整数の差分となります。(詳しく知りたい方は、補数というキーワードで調べてみてください。新しい記事をアップしています。2015.4.16サンプルで乗せたクラスのコードですが、実行してみたらバグだらけでした(^^;;;あくまでクラスの書き方サンプルとしてご参照ください。デバッグ終わったら乗せなおしたいと思います。移動方向をグラフ化する。長期・短期の移動平均が2本あった際、両方の移動平均の方向がそろった場合、取引したいとします。それが本当に効果があるかどうか含めて検討する為にもインジケーターとして実装して、実際のグラフと比較してどうだろ?考え方足りていないか?などを検討できます。今回は、移動平均がどちらの方向に移動中かのグラフを2本引きます。両方ともに+or-になった際、取引を開始するという事を考えます。下側の子ウィンドウが移動平均線の移動速度です。移動速度が両方+Or-になったということは中央の0の線を両方超えた場合という風にとらえることができます。チャート右側の長期にトレンドが出ている場合は、有効ですが、左側のチャートが暴れている箇所は、だましとなるシグナルが上下に複数発生している事が見て取れます。移動平均の方向だけを見て取引をするのは危険ということがわかりました。(^^;;;;今まで使用してきた関数などを使用してコードを作成しました。新しいことは特にしていないため、今回はコードの解説とばします^^;;ちなみに、移動平均の種類をEMAやWMAにしたり、平均期間を変えたりすると、また違ったグラフになります。興味のある方はいろいろ試してみてください。個人的には、EMA長期12、短期5でぐらいだともしかして、5分足の判断の一つとして使えるかも?とか思ってたり・・・。indicator_separate_window//バッファーを指定する。2//プロット数を指定する。OnInit(){//インジケーターバッファを初期化する。&spread[]){//現在チャートの選択時間幅を秒で取得する。60;//元となる値を計算する。通貨/分)の値を入れる。通貨/分)の値を入れる。MT4プログラミング子ウィンドウタイプのインジケーターを作成する。今度は子ウィンドウを表示して、それっぽいデータを描画したいと思います。意味があるかどうかはわかりませんが、価格移動の分速を求めて表示したいと思います。indicator_separate_window//バッファーを指定する。1//プロット数を指定する。OnInit(){//インジケーターバッファを初期化する。&spread[]){//現在チャートの選択時間幅を秒で取得する。60;//(2)元となる値を計算する。通貨/分)の値を入れる。period;}return(rates_total);}じつは、チャート上に表示するのも、子ウィンドウに表示するのもコードはほとんど変わりません。��1)にてindicator_separate_windowを指定していますが、基本これだけで子ウィンドウが表示されてチャートが描画されます。��2)にて計算のもととなる値を求めて、(3)にてバッファに設定する流れはほぼ同じです。インジケーターが挿入されているチャートの秒数を取得する為、PeriodSeconds関数を使用しました。これは指定の足を秒単位で戻してくれる関数です。引数を省略すると現在チャートの足の秒数を戻します。��例:5分足で表示していた場合、300が戻ってきます。period);サブウィンドウには、チャート上と単位が違い扱えないデータを表示するのに向いている仕組みです。この場合は価格/分という速度ベースのデータを表示してみましたが、通常は指数値などオシレーター系のデータを表示するのに使うようです。オシレーターを自力で開発というと結構数学的知識が必要で大変ですよね。私もあれこれ考えるのは好きですが、どうしても確率論や集合論との格闘になってしまい、頭が固まってしまいます。EA開発の前段階として自分なりのオシレーターが作れるよう日々努力です。★相互リンク募集中★トレードステーションと株・FX自動売買で暮らす茶トラがFX検証中。人気の投稿[MT4プログラミング]MT4のチャート上に矢印を表示する。(6)クラスを作成する。テンプレートを確認する。ウィザードを確認します。移動方向をグラフ化する。子ウィンドウタイプのインジケーターを作成する。