やまちゃんのオーディオブログ

既存のブログをこちらへ順次移動します。

mt4 fx自動売買 mql4

←|→

為替fx自動売買 mql4 alert デバッグ

投稿日:2019年11月24日 更新日:

オーディオネタではなくすいません。
オーディオでは、最近はウッドホーンを買い、実家のドライバーは持ち運ぶのが大変なので放置して、peavey44tの2インチドライバー2万円也を取り付け、ヤフオクで入手したpioneerのアルニコウーファー2万円也を入手して楽しむようになった。アナログにも手を出し、当時のフラグシップであるmr-611を入手して、sonyの空芯で針交換可能なカートリッジのvc-20を使っている。peavey44tは細かい音が出る。ウッドホーンはホーンの付帯音感が全くない。mr-611は良いのかよくわからない。

為替fxをずいぶん前からやっている。
まだ利益を得るにはなっていないが、自動売買のプログラムについて、それなりに使いこなせるようになったので、自動デバッグに使えるmt4について、若干要点を触れたいと思う。

1 最終的には、mt4用の専用サーバーを借りてということになろうが、まずは、いきなりやるのではなくて、まずはシミュレーションから始める。
2 無料のデモが利用できるので、そちらをまず使う。oandaやfx-tradeでは、mql4というc言語類似の自動売買プログラムをデモで利用できるので、それを使う。
3 売買プログラムの自作には、「iCustomで変幻自在の・・・」という本を買った場合にダウンロードできるテンプレートがおすすめ。
4 しかし、その売買プログラムをシミュレーションするのに、ストラテジーテスターを使っている方もいるかもしれないが、あまりに時間がかかりすぎる。そこで、既存のインジケータを加工してカスタマイズして用いて、DRAW_ARROWにより、売買の位置を表示させるのがポイント。どこで買い、どこで売ることがわかれば、コンパイルをした瞬間またはパラメータを変えた瞬間に、Commentにより総額を一瞬で計算・表示でき、シミュレーションの効率が格段に上がる。
5 ストラテジーテスターを使った場合、icustomなどを用いると、格段に速度が落ち、利用するインジケータのサブルーチンが同一ファイル内に設ける必要あり。
6 インジケータを使った場合、一定時間内にシステムに帰ってこないと、自動更新がされなくなる。遅い場合には、prev_culcratedを使い、すでに計算したものは改めて計算しないようにする方法もある。また、指標が1つ前のデータを利用している場合、配列の要素を外部で提供される関数を用いて1つ1つ計算していたのでは、それまでの計算結果をすべて捨てているので、非常に無駄な計算をすることになり、配列単位で計算したほうが速い場合もある。配列を計算させる場合には参照渡しを使う。int keisan(double &abc[],double &close[])などとすれば、終値closeを用いて、ファンクション内でabc[]に書き込めば、外部のメインルーチンでabcという配列の計算結果が使えるようになる。
また、移動平均のような場合、例えば毎回100個の合計をプラスするよりも、端のデータを引き算して新たなデータを足し算したほうが速いし、どうしても遅い場合には、dllを使う場合もある。dllを使う場合には、visualc++を使うが、その場合、「ロスカットに負けない男」さんの「【MT4】いちばん簡単なDLLの作り方」がおすすめ。追々書いていくかもしれない。DLLを使ってデータを渡す場合には、dll内部では最も古いデータの添え字が0としてデータが引き渡されることや、Close[]そのままでは渡せず、いったん別の配列にコピーする必要があることに注意する。
7 デバッグは、文法エラーについては、表示してくれる。実データを使ってのデバッグは一応用意されているが、よくわからない。1時間足しかデバッグできないように思える。
お勧めは、以下のalert、ボタンを利用した書き出しを使ったデバッグがおすすめ。
以下は、デバッグについて書いていく。

1 インジケータに全く描画が表示されない場合
(1)インジケータの数を確認

#property indicator_buffers 8
IndicatorBuffers(8);

最大8個までインジケータを表示できる。
数が足りていないと表示されない。

(2)データウインドウを見る。データが全く表示されていない場合、データリークにより暴走し、そこで、処理を終えている可能性が高い。
つまり配列がオーバーフロー。その場合には、何らのエラーも出ないので、やり方を知らないとお手上げになる。
ほとんどのトラブルがこのケース。
そこで、

Alert(“ok1”);

を行に入れる。
ここで音が鳴った場合、少なくとも、ここまでは動作していたことがわかる。

Alert(“A=”,close[1]);

など文字列や値を表示させて、適切な値になっているかを調べることができる。要するに、debug用のprint文と同様な機能を利用できる。
音が鳴らない場合、それ以前にオーバーフローになって、処理が異常終了している。
このAlertデバッグは、かなり使える。
なお、このようにオーバーフローになる場合には、2通りの原因・対策があって、
A 1つは、ループの添え字が1つ間違えている。つまり、データ数-1が配列の最後の文字であるのに、データ数がそのまま添え字になっている
B 2つ目は、配列の大きさを定義していない。厳密にはresizeをしていない。1つ、2つぐらいの変数のインジケータなら、自動的に配列のサイズを変更してくれてオーバーフローにならないが、4つ以上の配列変数を設定するとなるとArrayResizeにより配列のサイズを定義しないと、まず動かない。なので、

double xx[];

と定義した場合でも、グロバール変数で

int bars;

と定義し、init()のところで、

bars=Bars;
ArrayResize(xx,bars);

と配列の数について、初期設定を行う。
ここで、Barsは、システムが記憶している過去のインデックスの数であって、予約語であるところ、barsへ代入するのではなく、そのままBarsを使えばいいのではないかと思うかもしれない。しかし、Barsは、時間がたつごとに増えていくので、オーバーフローやその後の配列数変更による時間を食うことを避けるため、初期設定で要素数のbarsを設定したら、今後もその数を固定し、変動が起こらないようにする。また、OnCalculateの中でインデックスの数の変動を起こらないようにしたほうが好ましい。また、ArrayResizeも結構時間がかかるようである。なので、その当時のbarsを覚えて、固定する。

(2)データウインドウを見て、データが入っている場合、
内部的にはデータは生成され、計算を終えているが、インジケータの表示設定がおかしい。

SetIndexStyle(3,DRAW_LINE);
#property indicator_color1 Red

色の設定をしていなかったり、ラインの設定をしていないと、表示できない。

2 データがでたらめの場合
もちろん、数値計算が間違っている場合もあるが、

ArraySetAsSeries(ExtOpenBuffer,false);
ArraySetAsSeries(ExtCloseBuffer,false);

となるように、他のインジケータを利用しようとコピペすると、SetAsSeriesがオフになっている場合がある。
SetAsSeriesは、これをtrueにすると、最新のデータが添え字0から始まり、最も古いデータのインデックスがインデックスの最大数のようになっており、
時間が進むと、自動的に古いデータは添え字が1つ繰り上がりシフトするようになっている。
5分毎の足なら5分経つと自動シフトがかかる。
これに対し、シフトをオフにすると、最も古いデータが添え字0から始まり、最も新しいデータのインデックスが0のようになっており、
データの並びが想定と逆転する。
たいていのインジケータがSetAsSeriesをオンにしているので、
オフにしているインジケータを利用するとすると、そのままでは、インジケータの添え字が、一番前と一番後ろで逆転し、
ほかのインジケータを引用していた場合、整合が取れなくなりデータがでたらめになる。
他との親和性の観点から、すべてArraySetAsSeriesをtrueにして、これに対応できるようにforなどの繰り返し演算の添え字を書き換える必要がある。
その他、Comment();を使う方法や、ボタンを設けて、FileWrite(handle,・・・によりすべてを書き出すようにする方法もある。「とある技術者の金融工学」さんの「(MQL4)MT4のチャート上にボタンを作るやり方[EA自作]」がおすすめ。

3 グローバルに・・・しているとのエラー
{}の数がおかしい、)を閉じていないことが多い。
部分的に一部の行数をカットしてみて、エラーが出ないか確認する。

Follow me!

-mt4 fx自動売買 mql4

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

関連記事はありませんでした

[最近の記事]
2019年11月
« 9月   12月 »
 12
3456789
10111213141516
17181920212223
24252627282930

3PR エリア3 タイトル