トレード備忘録 & MT4/MT5インディケータ及びEAの開発

日々のトレード備忘録及びMT4/MT5に関する事項

MT4/5でEAを作成、それからの世界

2020-02-12 20:33:32 | 投資

 コンピュータの知識ゼロの素人でも、FX好きが嵩じるとなんとかEAが作れるようになる。作れるようになるということは、知らない間にC言語の基礎知識が身についたということでもある。

 筆者の場合も同様で最終目的はEAの作成であるから、コンピュータ言語そのものには興味がないままメタエディター上でインディケータやEAを作り続けてきた。CやC++を使って企業向けの業務プログラム開発しようなどという考えは一切ない。

 書店を訪れると、コンピュータ関連の書籍は山とある。PythonとかRubyとか訳の分からないタイトルが無数に並んでいる。ある時、JavaScriptに関する教本を偶然手に取り、中身をのぞいてみるとなんとメタトレと同じような条件式や変数が並んでいるではないか。入門書であったためか、そこに書いてある内容はスラスラと頭に入る。

 それでは、JavaScriptでは何ができるのかと読んでいくうちに、これは主としてネットでWebページを作成するために欠かせない言語のひとつであることが分かった。しかも、GoogleやIEというパソコンで利用中のブラウザがそのままプログラム開発のプラットフォームになっている。他の高級プログラミング言語では特別な開発環境を事前に用意しなければならない。例えば、CやC++では、Visual C++ 2008 Express Edition等、面倒な開発環境整備をしておかなければならないのである。

 MT4では慣れているから、教本のコードは難なく書くことができる。簡単なプログラムを書いてグーグル画面で再読み込みをすると、簡単ながら立派にプログラムを実行してくれる。JavaScriptはホームページ作成に必要なHTMLとCSSという技術を操作することができる言語ということだ。

 グーグルやIEでWebページが作成できるようになれば、一般人にはうれしい。メタトレを苦労して勉強してきた意味もあろうというものである。因みに、JavaScriptはJava(サンマイクロシステムズ)とは何の関係もないということである。 


MT4 複雑なエントリー条件をFilter( )関数ですっきり

2020-02-03 11:39:40 | 投資

 メタトレで精緻且つ複雑なEAを作成しようとすると、そのエントリー条件は膨大な数に昇る。if ( )分の中、&&や||で連結される条件が5個程度であれば間違うこともないが、その数が20を上回るようになるともう手に負えない。出来上がったとしても形は見苦しいし、必ずと言ってよいほど、どこかで勘違いによる単純なミスを起こしてしまう。都合の悪いことには、文法上誤っていなければ、その間違いを発見することさえ難しい。

 そのような場合には、条件をその性質により数個のグループに分け、グループごとに発生する売買のシグナルを最終的に一つにまとめ上げる工夫をするとよい。

 例えば、昨年8月に「ロンドンFXディーラーの教える正しい押し目買い・戻り売り」で採用されている手法に基づいてEAを作成しようとすると、実に23個の条件を必要とする。条件が多くなるのは、5分足と1時間足の両時間足を利用することにより、必要な売買シグナルがほぼ2倍になることと、採用する移動平均線5本の各動きを判定する必要があるためである。

 そこで、グループを① int EntrySignal( )、② int FilterSignal_1(int signal )、int FilterSignal_2(int signal)の3グループに分ける。

① int EntrySignal( )

 この関数では5分足での価格の動きと、移動平均線との関係から、買いのシグナルが出れば 1、売りのシグナルが出れば -1、その他は0を戻り値として返す。

② int FilterSignal_1(int signal)

 この関数では、5分足における3本の移動平均線の並び順とその傾きを判定し、ここでのシグナルがEntrySignal()と同じであれば、EntrySignal()と同じシグナルを返す。(1、-1、0のいずれか。EntrySignal( )が0であれば、FilterSignal_1()もFilterSignal_2()も 0をかえす)

③ int FilterSignal_2(int signal)

 この関数では、1時間足における2本の移動平均線の並び順とそれらの傾きを判定し、買いであれば 1、売りであれば -1、その他は 0 の戻り値を返すようにする。(1、-1、0のいずれか。EntrySignal( )が0であれば、FilterSignal_1()もFilterSignal_2()も 0をかえす)

 3つのグループから出た売買シグナルは OnTick( )の中で次のようにまとめる。(豊島久道教授手法)

void OnTick( )

int sig_entry = EntrySignal( );

int sig_filter_1 = FilterSignal_1(sig_entry);

int sig_filter_2 = FilterSignal_2(sig_filter_1);

 こうすることによって、最初のエントリーシグナルが 1であり、且つ、FilterSignal_1( )とFilterSignal_2()がともに1を返せば、正式な買いシグナルとなる。同じようにEntrySignal()が -1で且つFilterSignal_1()とFilterSignal_2()がともに -1を返せば、正式な売りシグナルとなる。途中でシグナリが異なる場合や最初のシグナルが 0であれば、売買シグナルは出ない。売買注文は

//買い注文

if(sig_filter_2 > 0) OrderSend(_Symbol, OP_BUY,・・・);

//売り注文

if(sig_filter_2 < 0) OrderSend(_Symbol, OP_SELL,・・・);のようにシンプルな形となる。

 肝心の「元ロンドンディーラーの正しい押し目買い・戻り売り」であるが、出来上がったEAのテスト状況は思わしくない。もう10年以上も前の手法であるから、アルゴリズム全盛の前には、既にファンドの餌食にされている可能背もある。考えそのものには間違いはなさそうなので、時間足の組み合わせを変えたり、最適なインディケータをフィルターに加えたり等の考察を引き続き重ねてみることにしたい。


MT4/5 iHigh()とiHighetst()の違い分かりますか?

2020-02-02 03:05:25 | 投資

 MT4/5でプログラムを作成する過程でiHigh()やiHighest()を利用する機会が多くあります。iLow()やiLowest()についても同様です。

 EAやIndicatorを作成するほとんどの方が、iHigh(1)がチャート上、ローソク足1本前の高値の値を教えてくれる関数であることをご存じです。ところが、「それではiHighetdt(1)とどう異なるのですか」と尋ねるとどことなく怪訝な表情をされることが間々あります。

 応用問題です。過去の5本のローソク足の中で、一番の高値を知りたいという場合には、この二つの関数が大活躍します。例えば、「過去5本のローソク足の中での最高値はいくら」を知りたい場合は、iHigh(_Symbol, 0,  iHighesst(_Symol, 0, 5))であり、安値であれば、iLow(_Symbol, 0, iLowest(_Symbol, 0, 5 ))となります。iHighest()関数の戻り値は、高値の価格ではなく、高値を付けた足を特定するための関数です。 

 スキャルピングやブレークアウトに利用するEAには、必須の関数ともいうことができます。