計算結果をDBに保存するサンプルコード。

XINO 2011/09/19 21:47
はじめまして。
やっとテストできました。
取り敢えずやってみたのはMTF化。これはバーチャモードではテストできなかった。
まあ、区間方式でもよかったんですが。
適当に見た感じ2個上の時間足のMTFがよさげ。(ブレイク狙い)
こんなことしてると、MT4が重すぎて固まりすぎですTT (PCが遅いわけではない)
計算済みのDATAがあれば複数のインジで使いまわしたいわけですが、
どうやればいいかヒントをお願いします。

MTF化されたコードをここにアップして頂けたら、ヒントを用意しましょうか^^;
(多くの人がMTF化を待ち望んでいると思います..。





…とまぁ冗談はさておき、計算時間が掛かりすぎる指標の場合、やはり一度計算結果を保存して再利用した方が得策でしょう。
@bighope さんが、「MT4からDATABASEを利用する。」という記事をかかれていらっしゃいましたので、それを参考にします。ここに、BTML はまだ保存できないけれど、たぶんこんな感じ?というサンプルを置きました。


SQLiteを入れて、DB-Writer-EA を Open Price only で実行すると・・・
↓データベース(EURUSDx.db) にデータが保存されます。


↓PupSQLiteで中身を確認すると、4本値が保存されています。

DB-Reader-EA.mq4 はそれを読み出すEAのサンプルなので、これでやりたい事は実現できるのではと思います。

週明けGapを無視するEMA


FX市場では、週明けに窓 ( Gap ) があくことが良くあります。上図は 20EMA ですが、窓があいた分だけ少し遅れて価格に追従するカタチになります。移動平均使いな私にとって、この遅れをいつもじれったく感じていたのですが、最近みつけた Tim Morris MA は、上手く(?)解消していたのでその手法を紹介しておきます。


EMA の計算式は、大雑把に書くと

今回のEMA = 1つ前のEMA * 係数 + 今回の終値 * 係数

↑こんな構造の式なので、Gapが生じた時は、「1つ前のEMA」の部分を別の値にすり替えて計算を続ければ Gap が無かったかのような振る舞いになります。


↑Gap補正を組み込んだEMA が水色のラインです。
どんな値にすり替えるか?や、どのくらいの Gap から補正を掛けるか?は工夫の余地がありそうです。





ところで、この Tim Morris MA は、なかなか不思議ちゃんな挙動を示してくれます。

↑Damping = 5 では、怪しげな波形
↓Damping = 100 で、EMA系のNMAに近い動き




TSDのフォーラムでは、JMA(Jurik MA)よりラグが少ないかもしれないという噂ですが、このタイプの移動平均はラグを減らす代償として、移動平均値が価格を超えてしまう(オーバーシュートする)ことがあるのですよね..。(上図)
そういう性質をもつ移動平均…というか、平滑化方法は好きではないので個人的にはお勧めしませんが、興味のある人は入手して観察してみてください。

MT4を最小化時にタスクトレイにしまうプラグイン?

表題のサンプルが、http://codebase.mql4.com/ru/7122 にあります。libraries フォルダに mt_tray.dll を置いて、mt_tray.mq4 のインジケータを表示させておくと、MT4を最小化した時にタスクトレイにアイコンが格納されます。実際に試したところ、機能そのものは動作するのですが、mt_tray.mq4を張り付けたチャートを閉じるとエラーになる場合があるようです。(終了処理が間に合わない..?)
これが必要な人は少ないでしょうけど、参考にどうぞ。


ロシアの公式フォーラムの libraries も、プログラマにとっては宝の山なので、GoogleChrome のような翻訳機能付きブラウザで、一度見ておくと役に立つものがあるかもしれません..。


ブラウザの言語設定を変えて英語のページを見る。

昨日紹介したサイトですが、今、見に行くと日本語ページに強制的に飛ばされてしまいます。
サイト内の言語メニューでEnglish を選んでも同じく飛ばされるので、そんな時は、ブラウザの言語設定を変更すれば OK です。GoogleChrome なら、下図のように設定して英語ページを優先するようにすれば english/forex/jforex.. が見られます。



コンバータの件ですが、個人的には、やめといた方がいいと思います。ひどいです(笑)。
1年前から大して変わっていませんので、真面目に開発しているのか疑問です。

MQL4からJavaのコンバータ..ダメですか..orz
コンテスト1位のJavaのコードのダウンロード回数が約300..という時点で、世界的に見てもJForexは過疎ってるんでしょうかね...^^;

バッファ数制限を越える。

とらのこ 2010/11/23 06:11
イジケータ作成での最大の制約であるバッファ数制限ですが、
画面表示しない裏指標であれば参照する分の配列(1つ前なら
2個、2つ前まで参照するのなら3個)で良いのではないかと
考えています。
これならバッファが10個使う場合でも非表示バッファが2個
以上なら1つのファイルで設定できます。
(以下略)

…画面表示しないバッファであれば、IndexBuffer にする必要はなくなります。
ただ、「2つ前まで参照するのなら3個」とするのは無理があって、やはり Bars 個の配列を用意して、IndexBuffer と同じように準備するのが簡単だと思います。


IndexBuffer は、
・配列のサイズが自動確保される。
・新しいバーができると、自動シフトされる。
という特徴があるので、それを真似ればOKです。以下が作例です。

IndicatorCounted() がゼロの時は、全部再計算になるのでシフトは不要です。Bars-IndicatorCounted() が1の時は、バーが増えていないということなので、やはりシフトは不要です。
(ここだけの話、配列をローカルに宣言してもアレっぽいです...
過去にキリンさんが、こんな記事を書いていましたが、目的はほぼ同じなのでそちらも参考にどうぞ。


お知らせ

junaさんが、「EA{shannon}を紹介してくれるFXブロガーさんを募集します。優先的に配布します。」という記事を書かれています。...興味のあるブロガーさんはどうぞ。(^_-)-☆

5通貨の強弱比較インジ 5 Currencies in one window.mq4

ふる 2010/11/21 14:32
5通貨の強弱比較インジ  5 Currencies in one window.mq4
と言うモノをDLしてみたのですが、どうも????が出てきたのです。
どのチャートに入れても監視が出来ると言う事で検証していたのですが、
入れるチャートによって通貨間の強弱数値が変わってくるのです。
画像は下記の僕の稚拙なブログを参考頂けますでしょうか?


http://fxsupan2.seesaa.net/?1290315230


Mixi内でも日記でどなたか判る方いますか?と取り上げてはいますが、みんな判らないようで・・・
で、faiさんなら計算式から何か割り出せたりするのかな?と最後の望みで書かせて頂きました。
果たして使えるインジなのか?
忙しいところ勝手ではありますが好奇心がムクムクっと湧きましたら挑戦して貰えないでしょうか?

…好奇心は沸かないので、厳密に調べていませんが、おそらく、通貨ペア毎にバーの本数が異なる(途中で抜けている通貨ペアがある)のが原因ではないかと思います...。こちらに、ズレ補正を入れたバージョンを用意したので、これで確認してみてください。抜け自体が補完されるのではなくて、過去に遡った時にズレの影響が最小となるだけです。


他の原因としては、通貨ペアのヒストリカルデータのダウンロードが途中だった為に結果が変わっている可能性もあります。これはインジケータを初期化しなおせば確認できます。5通貨では10通貨ペアのヒストリカルデータが必要ですし、AUD を加えて 6通貨とすると15通貨ペアのデータが必要になるので、必要なデータが揃っているかどうか?注意しましょう。
(15通貨ペア揃えるのに Broco が役に立ちます..。




このインジケータが役に立つかどうかは...かなり微妙^^;
通貨の強弱を求める計算式が、移動平均の差を均等に足しただけなので、価格の大きなペアやボラティリティの高いペアの影響を受けやすいはずです。おそらく、短い時間足ではよく分からない結果にしかならなくて、4時間足〜日足で見るのが良いのではとミサカは妄想します。
それから、このインジケータだけで、鞘取りを狙って「安い通貨を買って高い通貨を売る」のは危険です。移動平均の差の足し合わせでしかないので、安い通貨が安値で停滞し、高い通貨が高値で停滞しているだけで、"鞘"らしきものは縮小して消失します..。
(割高、割安..という概念は、過去のある時点と比較した価値判断にすぎないので、今日からはその状態が普通の価格となってしまえば、まったく割高でも割安でもないんですよね...。




唯一役に立ちそうなのは、それぞれの通貨のラインの方向と方向転換で、通貨の強弱に方向転換が起きている時は、トレード対象の通貨ペアのトレンドにも遅かれ早かれ方向転換が起きやすい気がします。原理的には当たり前なのですが、トレード対象の通貨ペア単体で動きを見るよりも確実な気配があります。。

別ウィンドウにログ出力する。

http://www.fx1.net/ は、トレーダー向けにニッチなツールを配布しています。
MT4ユーザに役に立ちそうなものとしては、
別ウィンドウにログ出力するツール
EAに擬似Tickを送りつけるツール
デコンパイル対策ツール(開発中)
があります。


別ウィンドウにログ出力するツールを試したのが下図です。

5分毎にシグナルの出ている通貨をリストアップするようにしてみました。このツールでは、ログ出力時に文字色も指定できるので、トレンド転換だけ赤字で出力しています。具体的な使い方は、DLLと一緒にサンプルコードが手に入るので、それを見てください。LogAdd()とLogAddColor()という関数で、このウィンドウに出力できます。


ターミナルウィンドウのログと違って、余分な出力が無いのと、フォントの大きさを変えることができるので、便利かなと思ったのですが、使い勝手は...微妙です。^^;
最小化ボタンが無いのと、一度ウィンドウを閉じたら次の出力を待たないといけない辺りが不便です。
マルチモニタ環境で1つのモニタ上に出しっぱなしなら便利かもしれません。




ところで、いまちゃん情報によると、MT4 Build 229 が出ているらしーです。私のODLリアル口座ではアップデートされていないので未確認ですが...、229 は安定しているのかしらん。。^^;

余分なループなのか?

Travis 2010/11/12 18:47
いつもお世話になっています。
インジケータの基本的なことに関する質問です。
多くのインジケータのstart関数では下記コーディングになっています。

int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(int i=0; i普通のインジケータではカレントバーの処理だけで良いと思うのですが1本前のバーの処理をしなければいけない理由があるのでしょうか?
重いインジケータの場合処理量が半分になるので効果があると思うのですが?

多くのインジケータがそうなっている経緯は、おそらくプログラマがMT4付属のインジケータやテンプレートを真似たためだと思います。

↑MT4付属のサンプルコードでも、同じループ処理になっていて、わざわざ recounted されるとコメントまで付いています。


本来のMQL4での定義は、

Bars チャート上のバーの本数
IndicatorCounted() 最後に呼ばれてから変化のないバーの本数

なので、 limit = Bars - IndicatorCounted() 本だけ再計算すればよいはずです。

↑実際にループ数を変えてインジケータを作って比較しても、どちらも同じ表示になります。


そこで、IndicatorCounted()のヘルプを読むと、

Note: The latest bar is not considered to be calculated and, in the most cases, it is necessary to recalculate only this bar. However, there occur some boundary cases where custom indicator is called from the expert at the first tick of the new bar. It is possible that the last tick of the previous bar had not been processed (because the last-but-one tick was being processed when this last tick came), the custom indicator was not called and it was not calculated because of this. To avoid indicator calculation errors in such situations, the IndicatorCounted() function returns the count of bars minus one.

黄色の部分は、Travisさんの考えたとおりですが、EAから iCustom で呼び出す場合、赤字部分の挙動が問題となるので

//---- the last counted bar will be recounted
if(counted_bars>0) counted_bars--;

↑この一行が敢えて加えられたのかなと思いました..。


ところが、Build 226 で EA から iCustom 経由でインジケータを呼び出し、IndicatorCounted() の数値を記録したところ、

最新のバーができた最初のTick では、Bars - IndicatorCounted() が 2 となっているので、最新のバーと、その前のバーが再計算されます。
これなら、ユーザが意図的に counted_bars--; する必要はなくなります。


状況証拠から推理すると、大昔は counted_bars--; して1本余分に計算しないとEAが正しく動かなかったのだけど、現在では IndicatorCounted() の仕様が改良されて不要になったのではないかと...個人的には思いました。
英文のヘルプは最後が微妙に意味不明なのでこれ以上は分かりません。。^^;