2015年12月28日月曜日

[MQL超入門] その006 とりあえずやってみよう!簡単インジケータ作成2

http://mt4program.blogspot.jp/2015/12/mql-005.html

前回からの続きです。
価格チャートだけ表示するインジケータの枠だけ作成されました。

ここから、プログラムを書くことで、いろんなチャートを描くことができます。

早速やってみましょう。

前回の記事で作成したHeikinインジケータの下の部分に注目です。
OnCalculateと書いてある部分があります。そこに赤字の部分を入力して実行してみてください。

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for( int i = rates_total - 1; i >= 0; i = i - 1 )
   {
      Label1Buffer[i] = (high[i] + low[i]) / 2;
   }
   
//--- return value of prev_calculated for next call
   return(rates_total - 1);
  }
//+------------------------------------------------------------------+

前回と違い、今回は赤い線がチャートに表示されていると思います。

・図006.01 高値安値の中間を描画する。

初めての(?)インジケータ作成成功です。
高値安値の中間値を線でつなぐインジケータが完成しました。

修正箇所は4行ほどですが、インジケータ作成に大切な要素が含まれています。
一つずつ説明したいと思います。

■繰り返し制御文 for
   for( int i = rates_total - 1; i >= 0; i = i - 1 )
   {
      Label1Buffer[i] = (high[i] + low[i]) / 2;
   }

ある一定回数、同じ処理を行うときに使用します。

for( 初期化条件; 繰り返し条件; 再初期化式)
{
   繰り返し行う処理
}

といった形になっています。
・初期化条件 [ int i = rates_total -1 ]
 変数宣言と、初期化を行います。
 今回は、[i]という名前の変数を宣言したのち、[rates_total-1]の値に初期化しました。

・繰り返し条件 [ i >= 0 ]
 変数[i]の中身が0より大きい間、繰り返しを行います。

・再初期化式  [ i = i - 1 ]
 再初期化式は、一回の処理が終わるたびに呼び出される処理です。
 今回は、一回の処理が呼び出し終わるたびに、iの値を一つ減らします。

for文の下に{ } で囲われた部分があります。これをブロックと呼びます。for文の下の {}で囲われた部分を条件に従って繰り返し実行します。
図で書くと、このような流れになります。

 ・図006.02 繰り返し制御文 for の処理の流れ

ほとんどのインジケータでは、for文を使用します。


■配列操作
      Label1Buffer[i] = (high[i] + low[i]) / 2;

[ ] で閉じた中にiと指定されて、計算式が書かれています。
この[]で数字を指定して、中身を見たり書いたりできる変数のことを配列と呼びます。

この配列もインジケータ作成時にはとても重要です。

配列は、変数の箱が、たくさん横に並んだ物と考えてください。

上記の式では、
Label1Bufferのi番目の箱に、highとlowのi番目の箱の内容を足して2で割った物を入れています。

 ・図006.03 配列操作

インジケータでは、この配列操作と、繰り返し制御文を使いながら様々なチャートを描画します。

次回は、変数についてもう少し掘り下げたいと思います。

今まで説明を省略していましたが、int i; って書いてある、[int]ってなに?というあたりを予定しています。

また、今年のブログ更新は、これが最後です。皆様、よいお年を^^

次の回へ


ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ

2015年12月25日金曜日

[MQL超入門] その005 とりあえずやってみよう!簡単インジケータ作成1

プログラムを覚える基本は、とりあえずやってみることです。
作ってみて失敗して、また作るといった繰り返しができることがソフトウェアの良いところです。

※余談
リアル口座を運用しているMT4を使用する場合、ソフトウェアの作成に失敗すると、取引に影響が出ます。
そこで、プログラム開発用にMT4のデモ口座を作ることをお勧めします。

[雑記]MT4のデモ口座はどこがいい?
http://mt4program.blogspot.jp/2015/12/mt4.html
などから、プログラム開発用のデモ口座を開き、プログラムはデモ口座が動いているMT4上で作ることをお勧めします。

説明の記事が2回続きましたので、足りていないところは後回しにして、とりあえず、インジケータを作成してみましょう。

メタエディター上で下記の通りに操作してみてください。


ナビゲータ上で、[Indicators]を一度クリックして青反転表示になった所で、マウスの右クリックから[新規ファイル(N)]を選択します。

・図005.01 インジケータ 新規作成



MQL4ウィザードにて[カスタムインディケータ」を選択した状態で、[次へ(N)]をクリックします。
 ・図005.02 MQLウィザード インジケータ 選択

名前の箇所に[Indicators\heikin]と入力して[次へ(N)]を押します。
※heikinの箇所は半角英数字であれば好きな名前で問題ありません。またブラウザの環境によってIndicatorsとheikin間の記号が¥マークではなく、バックスラッシュ(/の反対)に表示されてしまっているかもしれません。Indicatorとheikinの間は¥マークです。
 ・図005.03 MQLウィザード 名前の決定

[次へ(N)]をクリックします。
 ・図005.04 MQLウィザード カスタムイベントハンドラの選択


インジケータに描画する変数を追加します。[追加]をクリックします。
 ・図005.05 MQLウィザード プロットの追加

最後に[完了]をクリックして終了です。
 ・図005.06 MQLウィザード プロットの追加 後


とりあえず、やってみようですので、細かい説明は次の機会ということにして、これでインジケータが出来上がりました。

[MQL超入門] その002 最初の一歩。Hello world!
を参考に、実行してみてください。

MT4でインジケータを表示するときに出てくる、いつもの初期画面をOKすると、価格情報以外何もないチャートが表示されているかと思います。

プログラムを止めてみましょう。メタエディタ上で赤い停止ボタンをクリックしてください。
・図005.07 停止
MT4でチャートが消えたかと思います。

インジケータの作成~実行~停止まで、一通り行うことができました。何も表示されないインジケータでは楽しくないため、早速プログラムを作ってみましょう。

少し長くなりましたので、次回に続きます。

次の回へ


ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ

2015年12月24日木曜日

[MQL超入門] その004 コメントと、定数 変数 計算式 代入式

実際のプログラムに入る前に、最低限必要な知識として

コメントと、定数 変数 計算式 代入式

を説明したいと思います。

■コメント

これは、プログラム上何もしない文字列です。

・・・・?なぜ、こんなものがあるのかというと、作っているときは覚えているのですが、あとから見たときにわからなくならないよう、自由な文字列を入力できるようになっています。

コメントがきれいに書かれているプログラムは、後から見直したときに、なぜ、こんな処理をしたのかを思い出しやすくなります。

MQL上、コメントは、次の二つの書き方があります。

// 1行コメント

/*
ブロックコメント
*/

スラッシュを二つ続けて記入すると、その後ろの文字列は、改行が入るまで、コメントとして扱われます。

また、/* */で囲った範囲も同じようにコメントとして扱われます。

コメントは、プログラム上何もしない文字列ですので、言語に関係なく自由に記載することができます。

■定数 変数 計算式 代入式
定数から、代入式までは、一度に説明したいと思います。

定数とは、1や10など値そのものを指します。
変数は、中の値を変更できる箱と思ってください。
計算式は、+-など四則演算を含む様々な計算をしている式です。
代入式は、変数の中身を変える式です。

さて、一度に説明しましたが、中学数学の方程式を思い出すと、イメージが付きやすいかと思います。具体的なコード例とイメージ図です。

// 変数の宣言
int x;
int y;

// 変数へ、定数の1を代入する。
x=1;

// 1が設定されているxに2を足すため、yは3になる。
y=x + 2;

// yには3が入っていて、3を足すので、yは6になる。
y=y + 3;

図004.01 定数 変数 計算式 代入式

次の回へ


ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ

2015年12月23日水曜日

[MQL超入門] その003 プログラムの基本を学ぼう。入力+処理=>出力

いよいよ、プログラムに入っていきたいと思います。
超入門ということで、基本的な考え方から入ります。

プログラムは、基本的な構造が決まっています。

それは

入力+処理=>出力

という考え方です。

入力は、マウスのクリックや、価格情報のことを示します。
処理は、入力に対する計算など、何か変更や計算を行うことです。
出力は、画面の表示や、ポジション操作をことです。

図003.01 入力+処理=>出力のイメージ

プログラムは、この3つの要素を考えることが一番最初の作業です。

MQLでは、出力はわかりやすいです。

MT4としてインジケータとしてチャートを表示したいのか、EAとしてポジションを自動売買したいのかが決まるためです。

ですので、どのような入力をもとに、どんな処理をして、チャートの表示や自動売買を行うか?という事を考えます。

入力は主に価格の情報となります。もちろん、そのほかいろんな情報を入力することは可能ですが、MQLでは価格が一番簡単に入力として扱える情報となっています。

そこで、第一ステップとして

価格を入力して、何か処理をして、チャートを表示する。

という流れを勉強していきたいと考えています。

あえて、処理については説明しませんでした。
この部分がプログラムの一番大切なところであり、また難しいところです。

この処理を行えるようになるための、基礎的な知識が必要です。


次は、基礎的な

定数 変数 計算式 代入式

という、プログラムには欠かせない、計算処理について説明したいと思います。

次の回へ

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ

2015年12月22日火曜日

[MT4インジケータ]TEMAかい離率 瞬間的かい離で利食い&逆張りタイミング?


相変わらずの逆張り大好きっ子です。

えぇ日々逆張りに使えないかどうか考えています(笑)

移動平均に対するかい離率ですが、ラインからのかい離率というのは、どの程度まで行くのか予測が難しいところがあります。

もう少し瞬間値的なかい離なら、ある程度制限されるのではないかと思い、TEMAに対してのかい離率をグラフにしてみました。

計算式は下記の通りです。

TEMAかい離率[%]= 終値 / TEMA × 100 - 100

0を中心に上方向にかい離している場合は+、下方向にかい離している場合は-となります。

・・・まぁ裁量トレードの方はチャートを見たら一目なので、あまり必要ないかもしれません。どちらかというとシステムトレード派の方の利食いタイミングなどの測定向けかなぁとは思っています。Gewinn6でも利食いタイミングに使用しています。

で、これを使って逆張り仕掛けたらどんなもん?と思って、超単純にバックテストで実験してみました。

2011/1/1~2015/12/20 EURGBP 1Hにて、0.5%/-0.5%を超えたのち、0.5/-0.5を再び下回った際、ポジションを24時間保持した場合の結果です。ストップとか利食いとか全く考えず24時間後に閉じる単純ロジックです。

初期証拠金 10000.00   スプレッド 15
純益 802.24 総利益 1942.95 総損失 -1140.71
プロフィットファクタ 1.70 期待利得 17.44
絶対ドローダウン 203.32 最大ドローダウン 417.62 (4.05%) 相対ドローダウン 4.05% (417.62)

総取引数 46 売りポジション(勝率%) 23 (78.26%) 買いポジション(勝率%) 23 (60.87%)
 勝率(%) 32 (69.57%) 負率 (%) 14 (30.43%)
最大 勝トレード 202.57 敗トレード -163.02
平均 勝トレード 60.72 敗トレード -81.48
最大 連勝(金額) 7 (331.43) 連敗(金額) 3 (-216.03)
最大 連勝(トレード数) 561.87 (5) 連敗(トレード数) -248.09 (2)
平均 連勝 3 連敗 1


おぉ。利食いも損切も全く考えてない状況で、単に24時間後にクローズするだけで+引けはなかなかです。
まぁ5年で取引回数が50回を下回ってますので、かなりサンプルが足りないですよね。ただ、EURUSD 1Hでも同じく+引けしました。うん。まぁ考え方をまとめてちゃんと組めば、もしかしてそれなり?


プロぐランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ


ということで、TEMAかい離率のコードはこちらから

2015年12月21日月曜日

[MQL超入門] その002 最初の一歩。Hello world!

まずは、第一歩を踏み出してみましょう。
メタエディターを立ち上げて、下の通りに操作してみてください。

メタエディター左側にある、ナビゲーターと書いてある小さい枠内の[Scripts]と書かれている個所を、マウスでクリックします。Scriptsの文字が青く反転しますので、その状態でマウスの右クリックを行い、[新規ファイル(N)]をクリックします。

・図002.01 新規ファイルの作成


MQL ウィザードという画面が表示されますので、[スクリプト]が選択されていることを確認して、[次へ(N)]をクリックします。

・図002.02 MQLウィザード スクリプト選択


次の画面で、名前の欄に[Scripts\] と書かれていると思います。¥マークの後ろに[Test]と追加して、[完了]をクリックします。

・図002.03 MQLウィザード 名前の入力

英語っぽい、いろいろ書かれた画面が表示されれば、新規ファイルの追加は成功です。

・図002.04 テストスクリプトの画面

さて、まず日本語が入力可能かどうかを確認します。
まず、新しく追加したファイルの適当な箇所を一度クリックした後、[あいうえお]と入力してみてください。画面左上に[あいうえお]と表示されたら、[Enter]キーをおします。

・図002.05 あいうえおを入力

メタエディター上に、正しく[あいうえお]が表示されればOKです。
よくわからない文字に変化したり、□が表示されたりする場合は、フォント設定を行います。

・図002.06 あいうえおを入力

フォント設定は、オプションから行います。メニューの[ツール(T)]→[オプション(O)]を選択します。

・図002.07 オプション画面の表示

オプション画面が表示されたら、フォントと書かれているところをクリックします。フォントの設定が行えますので、[MS ゴシック]を選択したのち、スクリプトの箇所にて[日本語]を選択します。

最後に[OK]をクリックします。

・図002.08 オプション画面 フォント設定


さぁ、ここまでで準備完了です。
プログラムの世界では、一番初めはHello worldという文字列を表示するというのが恒例行事となっています。早速、Hello worldを表示してみましょう。

赤字の部分をそのまま入力してみてください。先ほど入力した[あいうえお]は消してください。
//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  MessageBox("Hello world");

  }
//+------------------------------------------------------------------+


赤字の部分を入力したら、メタエディターの実行ボタンをクリックしてみましょう。
緑色の再生ボタンのようなマークです。

・図002.09 実行ボタン


画面にHello worldと書かれたメッセージが表示されたら成功です。
さぁまず第一歩を踏み出すことができました。

・図002.10 実行結果

このように、文字列を書いて、それを動かすことを「プログラムを実行する。」と言います。

MT4では、MQLと呼ばれる言葉を使ってプログラムを書くことができます。
この言葉を駆使して、さまざまな取引や解析を行うことで、一歩進んだトレードが可能になります。

ちなみに実行ボタンを押しても、エラーと書かれた箇所に、赤いびっくりマークが出て実行できない場合は、もう一度、MessageBox("Hello world");と書いた部分を確認してしてください。すべて半角文字の必要があります。全角文字が入力されていると正しく実行できません。全角スペースと半角スペースは見分けが付きませんので、特に注意してください。

次の回へ

2015年12月18日金曜日

Gewinn6をFX-ONに送信しました。

先ほど、FX-ON様に登録してきました。
FX-ON様のフォワードで成績が良ければ、またご案内させていただきます。

最終的にはこんな感じ。寝ている間に損切のアルゴリズムを思いついた為、先日実装してみました。効果がありそうでしたので、これでいったん公開します。

複利運用と利益状態を見てのロット制御を入れています。
複利運用のリスクは、最大損失の130pipsが発生した場合、口座残高の3%が失われる初期設定となっています。

5%とかにすると、5年間の利益が3000万とかになります・・・。恐ろしや複利運用。まぁドローダウンも600万とかになるため、あまりお勧めしません(笑)

Alpari デモ口座2011/1/1~2015/12/18

通貨ペア EURUSD (Euro vs US Dollar)
期間 15分足(M15) 2011.01.03 00:00 - 2015.12.18 10:30 (2011.01.01 - 2015.12.31)
モデル 全ティック (利用可能な最小時間枠による最も正確な方法)
テストバー数 124062 モデルティック数 75880955 モデリング品質 90.00%
不整合チャートエラー 1
初期証拠金 10000.00 スプレッド 15
純益 77936.49 総利益 156987.80 総損失 -79051.31
プロフィットファクタ 1.99 期待利得 119.90
絶対ドローダウン 734.88 最大ドローダウン 10380.39 (12.73%) 相対ドローダウン 14.82% (1965.40)
総取引数 650 売りポジション(勝率%) 316 (73.10%) 買いポジション(勝率%) 334 (65.27%)
勝率(%) 449 (69.08%) 負率 (%) 201 (30.92%)
最大 勝トレード 4560.00 敗トレード -1620.00
平均 勝トレード 349.64 敗トレード -393.29
最大 連勝(金額) 18 (24251.24) 連敗(金額) 4 (-1976.26)
最大 連勝(トレード数) 24251.24 (18) 連敗(トレード数) -3002.51 (2)
平均 連勝 3 連敗 1



[MQL超入門] その001 メタエディターを立ち上げてみよう

ブログネタが手持ちで尽きたのもあり、せっかくなので、勉強した成果を公開したいと思います。
MQL超入門記事を連載始めます。

まず、皆さまMT4はインストール終わっている所からスタートです。
MT4の導入については、各業者様のページに詳しく掲載されていますので、そちらをご覧ください。

MT4ではプログラムと呼ばれる物を使い、自分で考えた様々なことを実行できます。

とりあえず、体験してみましょう。準備としてメタエディターと呼ばれるソフトウェアが必要です。

・図001.01 メタエディターの起動


MT4のメニューから[ツール(T)]→[メタエディタ-(E)]を選択します。

もしくは、MT4の適当な箇所をマウスでクリックした後F4キーを押します。

そうすると、英語で書かれた、何かウィンドウが立ち上がってます。
これがメタエディターと呼ばれるソフトウェアです。このメタエディター上で様々なプログラムを作ることができます。

・図001.02 メタエディター


メタエディターですが、最初は英語となっていて、少し使いにくいです。日本語モードが用意されていますので、日本語に切り替えたいと思います。
メニューから[View]→[Languages]→[Japanese]を選択します。

再起動を確認する英語のメッセージが表示されますので[Restart]ボタンをクリックします。

・図001.03 メタエディターの言語を日本語に切り替える。

・図001.04 再起動の確認


すると、日本語になってもう一度、起動します。

・図001.05 日本語のメタエディター

これで準備は完了です。
フォント設定という物が必要な場合がありますが、これは問題があった場合のみで構いません。デフォルトの設定でも日本語表示および入力可能です。そしてデフォルトが一番綺麗です。

さて、メタエディタの準備が終わりましたので、次回、早速なにか動かしてみたいと思います。
フォント設定についても、次回に説明します。

次の回へ

2015年12月17日木曜日

Gewinn6 このあたりで、いったんリリースします。

Alpari デモ口座2011/1/1~2015/12/17

初期証拠金 10000.00 スプレッド 15
純益 25622.96 総利益 56978.00 総損失 -31355.04
プロフィットファクタ 1.82 期待利得 41.26
絶対ドローダウン 889.17 最大ドローダウン 3504.22 (9.82%) 相対ドローダウン 10.34% (1194.78)
総取引数 621 売りポジション(勝率%) 306 (71.90%) 買いポジション(勝率%) 315 (65.71%)
勝率(%) 427 (68.76%) 負率 (%) 194 (31.24%)
最大 勝トレード 1800.00 敗トレード -723.06
平均 勝トレード 133.44 敗トレード -161.62
最大 連勝(金額) 15 (3680.29) 連敗(金額) 5 (-330.83)
最大 連勝(トレード数) 4888.53 (6) 連敗(トレード数) -1140.82 (4)
平均 連勝 3 連敗 1


FX-ONの計測期間のことも考え、明日いったんFX-ONに登録したいと思います。

1ポジション両建てなしで運用します。
波を測定して、反転のタイミングで逆張りを仕掛けます。波形が崩れて強いトレンドと判定したときは取引を中断します。

損切は、65pips~130pipsを基準に、前回高値安値±5pipsのところに設定します。
ATRを使用したトレイリング機能が付いています。利益がある程度で始めたところからトレイリングが開始されます。

Gewinn2での反省点も含めて、まず基本ロジックで、FXDD、TickStory、Alpariとある程度データがそろっている物から、いちばん成果が悪かったAlpariを基準でバックテストを行いました。



2015年12月16日水曜日

[MT4プログラミング]小ネタ サブウィンドウ型インジケータ 名前の横の現在値を消す。

(追記)ごめんなさい。プログラムミスってました。 記事修正しました。 小ネタです。



サブウィンドウタイプのインジケータを作成すると、名前の横に現在値が表示されます。
結構邪魔なときがありますよね?

サブウィンドウ 名前横に現在値を表示しない方法です。

現在値ですが、SetIndexBufferで指定したバッファの数分だけ表示されます。

表示する値は各バッファの[0]の値です。

ただし、バッファ[0]の値がEMPTY_VALUEの場合、表示されないという特徴があります。これを利用して表示を消したいと思います。

公開しているDrawSimpleLineを使って試してみたいと思います。元のコードは過去記事をご覧ください。
http://mt4program.blogspot.com/2015/10/mt4drawsimpleline_8.html

プログラムの修正点は、各バッファのインデックス0の値は、EMPTY_VALUEにして、インデックスを一つずらしてバッファに設定してしまうことです。

一つずらしてバッファに設定すると、表示も一つずれそうなものなのですが、インデックス0がEmptyValueの場合、MT4が自動的に一つだけシフトして表示するようです。
SetIndexShiftでの指定は不要です。
(たぶん…明確なドキュメントは見つからないのですが、動きがそのようになっています。)

(追記)プログラムがバグってただけでした^^;;;; すみません。
SetIndexShiftにて表示のシフトが必要です。

赤字の部分が修正点となります。
・バッファにインデックスを指定するときに+1する。
・インデックス0には必ずEMPTY_VALUEを設定している。
・ループ範囲を一つ少なくする。
・SetIndexShiftで表示をずらす
の4か所です。

ソースコードはこちらから

2015年12月15日火曜日

MQL5.comで行列代数ライブラリが公開されている!!!その他

行列代数ライブラリ「 LIBMATRIX 」
https://www.mql5.com/ja/articles/1365
https://www.mql5.com/ja/forum/68627/unread#unread

MQL5.comを見てたら、行列計算用のライブラリが公開されているではないですか!!!!
相場状況に応じて動的にパラメータを変化させるようなEAを開発する場合、多項式に対して演算が行えると、とても便利です。

以下 行列代数ライブラリ記事からの抜粋です。


多項式回帰モデルが、degree次のf(x)=a[0]+a[1]*x+...+a[degree]*x^degree 多項式を求めることにあります。以下のように指定されているA[degree+1][degree+1]行列、または以下のように指定されているB[degree+1][1]右側のベクトルをもつ連立線型方程式を解くことで作成されます。A[i][j]=(x[0]^(i+j)+x[1]^(i+j)+...+x[numPoints]^(i+j))/numPointsB[i]=(y[0]*x[0]^i+y[1]*x[1]^i+...+y[numPoints]*x[numPoints]^i)/numPoints
この連立線型方程式を解くために、スクリプトを書きました(LibMatrixEx.mq4という添付ファイルをご覧ください)。このスクリプトは、多項式の外挿を実行します。多項式の値を求めて価格を予想できます。
スクリプトが3つの縦線で操作されます。前の2つの縦線により分析される間隔を設定します。3つ目の縦線は、多項式が表示される最終点を設定します。 
チャートにスクリプトをドラッグアンドドロップして、以下のパラメータを設定します。delay - チャートの再生期間;degree - 多項式の次数;linesMargin - 操作を行う線の差 linesWidth - 操作を行う線の幅。その上、線の色を変えることができます(colVLineInt colVLineExtなど操作を行う線、またはcolIntcolExtというチャートの線)。
スクリプトの機能の例


ここまで

こんな複雑な回帰行列が計算できてしまうなんてなんて素晴らしい。あーライブラリ無いなー。GPLパッケージだといろいろ問題あるしなー。.NetのDLL呼び出そうかなー、どーしようかなーとか思っていたらMQL5.comに公開されていました。

恐るべしMQL5.com
MetaQuotes社 日本語スタッフの皆さま本当にありがとうございます。

といっても、まだ試してないのですが、Gewinn6がひと段落したら、早速試してみたいと思います。

あと、TEMA平滑化版S/RオシレータをMQL5.comアップロードしました。
https://www.mql5.com/ja/code/14359

ここにアップロードすると、MetaEditorからダウンロードできるのかな?と思っていたのですが、現在MetaEditorからは日本語の記事は検索できない予感がします・・・・。

日本語入れても一つもヒットしないので・・・・。


2015年12月14日月曜日

[MT4プログラミング]複利運用時のロットを求める計算式(損切値ベース)

ネタがないため、小ネタで・・・・。

複利運用時のコードですが、複利運用にもいろいろ考え方があります。

一つは、損切値があるPipsの場合、余剰証拠金の?%に限定するやり方です。
今回は、余剰証拠金の?%に限定するコードを書きたいと思います。

口座の余剰残高 / (1pipsあたりに動く金額 * 損切値)
で、損切になった場合、余剰残高がすべて消えるロット数が求まりますので、そのロット数に対してリスク値の%を掛ける計算です。


基本的には、まず、口座の余剰証拠金残高と1Pipsあたりに動くお金を計算します。
MarketInfo(symbol, MODE_TICKVALUE)
にて、1Tick/Lot あたりの口座通貨での動くお金の量が取得できます。業者の小数点桁数により1Tcik=1Pipsではないため、桁数をみてPipsあたりに変換しています。

その後、計算式に当てはめロット数を算出する形です。業者の最小ロットと最大ロットを超えないように制限をかけているのと、ロット数のステップあたりに丸めて最終ロット数を計算しています。

まぁ、発注時ベースの金額となっているため、実際にはレートが動いて実際の損切が発生した場合、指定のリスク分ちょうどにはなりませんが、そのあたりは誤差ということで・・・。

   // リミットは100pipsとする。
   double limit = 100.0;
   
   // リスクは2%
   double risk = 2.0 / 100.0;

   string symbol = Symbol();
   // ロットステップ
   double lotUnit = MarketInfo(symbol,MODE_LOTSTEP);
   // 最大ロット
   double maxLot = MarketInfo(symbol, MODE_MAXLOT);
   // 最小ロット
   double minLot = MarketInfo(symbol, MODE_MINLOT);
   
   //Pips計算 小数点桁数が3or5の場合、Point()*10=1pips
   int digit = (int)MarketInfo(symbol, MODE_DIGITS);
   // 1ロット取引したときに、最小Tickあたりに動く口座通貨ベースの金額
   double tickValue = MarketInfo(symbol, MODE_TICKVALUE);
   
   // 桁数を見てPips値に変換する。
   double pipsValue = tickValue;
   if( digit == 3 || digit == 5 )
   {
      pipsValue = tickValue * 10;
   }
   
   // 余剰証拠金
   double freeMargin = AccountFreeMargin();
   
   // 0除算対策
   double lot = 0;
   if( lotUnit > 0 && limit > 0 && pipsValue > 0 )
   {
      // ロット値の計算
      lot = freeMargin / ( limit * pipsValue ) * risk;
      
      // ステップ単位に丸める。
      lot = MathFloor(lot / lotUnit) * lotUnit;
   
      if( lot < minLot ) lot = minLot;
      if( lot > maxLot ) lot = maxLot;
   }
   
   Print("lot = ", lot);

2015年12月11日金曜日

複数バーを使ったATRをFX-ONにアップロードしました。

FX-ONで公開している、無料インジケータに昨日の記事で作成したインジケータを追加いたしました。
[MT4インジケータ」ATR君・・ほしい値はそこじゃない!複数バーを使ったATRを表示する。

ブログMT4開発日記で公開しているインジケータです
MT4開発日記で公開中の無料インジケータMT4開発日記で公開中の無料インジケータ | fx-on.com

ちなみに、あれこれ検証してみましたが、EAを使った取引タイミングで使うのはやっぱり難しそうです。 ただ通常のATRよりはダイバージェンスがはっきりと見て取れますので、もしATRのダイバージェンスを有効シグナルとして使っている方は、お試しいただく価値ありかとは思っています。

簡単に取り入れることができたトレイリングのベース値として試したところ、今作成しているGewinn6で少しだけPFが伸びました。こちらのほうがわかりやすそうな雰囲気です。

2015年12月10日木曜日

[MT4インジケータ」ATR君・・ほしい値はそこじゃない!複数バーを使ったATRを表示する。

 昨日、S/RオシレータとATRの連動をやっていて思ったのですが、確かに5分足を見て取引していますが、あくまでポジションオープンするタイミングのために使っているのであり、平均1時間ぐらいは保有するイメージです。とすると、ATRの値としてほしいのは1時間足です。

 1時間足チャートでATRを表示してその値を見ればよいのですが、取引のために、せっかく5分足を表示しているので、5分足をつかって現在位置を基準に1時間分のATRを描画することで、高速反応を目的にしたマルチバーATRを作成してみました。

■線のなめらかさ比較:マルチバーATR(上)と普通のATR(下) EUR/USD 5M

 まず、通常のATRですが、線がギザギザしていてはっきりと転換をつかめないときが多々あります。期間を長くすると、今度はなだらかになりすぎて反応が遅くなります。

 そこで、マルチバーATRでは、TEMAとEMAによる二つのラインを描画しています。
赤い線がTEMA(α=0.1)、水色の線がEMA(α=0.05)です。

 1時間で動く価格幅 予想値としてはEMA(水色)を、ダイバージェンスなどを見るときはTEMA(赤色)を使用するといったイメージで考えました。

 ATRとマルチバーATR(赤線:TEMA)を比較した場合、マルチバーは12本の値をとっているのにも関わらず、ほぼ5分足のATRと同じ反応を示している事がわかります。かつ、グラフはなめらかに描画されており判定として使用しやすいと思います。


■ダイバージェンス現象確認の容易さ比較:マルチバーATR(上)と普通のATR(下) EUR/USD 5M

 FXの教科書などでは、ATRのダイバージェンス現象を利用した天井圏や底値圏での逆張りが紹介されていますが、実際ATRを見てみるとグラフが不安定すぎて、どうとでも取れてしまうことが多々あります。

 そこで、具体的に赤枠内の値で見てみたいと思います。

 ATRでは、第1波と第2波はグラフ上に現れていますが、第3波は表れていません。

 マルチバーATRのTEMAでは、第3波が描画されています。その上、第1波~第3波にかけてきれいにダイバージェンス現象の発生が見て取れます。

 TEMAと、表示時間足より長い時間からATRを生成することで、高追従性と平滑化効果を両立した効果が表れています。このようにATRの分かりにくさを解消して、取引タイミングを計るインジケータとして作成してみました。

 ATRは、価格レンジをチャート化したもので、この値がトレンドと逆行し始めると、売り買い疲れの症状であるというのは直観的にわかりやすいと思いっています。ただ、ダイバージェンス現象って、EAで判定させようとすると、結構面倒なんです・・・・。バックテストでの検証ははっきりできていません。パッと見、普通のATR使うよりははるかによさそうと思い、公開しちゃいました。

 FX-ON様の無料配布も、近日アップデートいたしますので、コンパイルが面倒な方はしばしお待ちください。

ブログでソース公開中無料インジケータのダウンロードはこちらから
MT4開発日記で公開中の無料インジケータ
MT4開発日記で公開中の無料インジケータ | fx-on.com

 ソースコードはこちらから。

2015年12月9日水曜日

[雑記]S/RオシレータとATRを使った逆張り考察

S/Rオシレータですが、TEMA平滑化を行っても、取引のタイミングを計るのは難しいです。

ATRがピークアウトすると価格の移動余力が低くなってきて転換点が近いことを示すといわれています。
そこで、ATRと組み合わせての取引できないかなーとか思い昨日のチャートで確認してみました。




画像は2015/12/8のEUR/USD 5分足です。
ATR(24)とTEMA平滑化S/Rオシレータを表示しています。24の理由は特にありません。なんとなく5分足なので、x24で2時間だなーとおもっただけです。

積極的に仕掛けることを前提に、積極的に仕掛けるなら、天井圏ではレジストラインが100から立ち下がった箇所、底値圏では、サポートラインが0から立ち上がったところをシグナルと仮定します。

画像の赤丸・青丸の部分です。

ATRでのピークアウト/ダイバージェンスと、S/Rオシレータでのシグナルが同時に発生している個所を確認します。

・①②
 チャート前半で発生している、①②は、ATRがピークアウトしている状態でのシグナルです。確かにそのあと少し価格が下がっていますが、値動きが少なすぎて、ほとんど値幅をとれません。ピーク時と判断するATRが小さすぎる場合は、取引しないようが良いように思われます。

・③④
 ATRが上昇していく中でのシグナルとなります。
 実際には④の後、いったんの調整が発生していますが、④の時点のチャートと③の時点のチャートでは区別がつきません。ここは取引を控えるところとなります。

・⑤
 このチャート唯一の買いシグナルです。
 ATR的には④の段階でピークアウトして⑤の買いシグナルにつながっています。ATRのルールで行くと買いです。・・・が、上昇中の価格で押したピークをATRがピークアウトしたといってしまってよいのかは疑問・・・・^^;;;

・⑥
 再び価格が上昇して売りシグナルです。ATR的には上昇を続けている段階ですので、ここは手を出さないということになります。

・⑦
 ATR的には⑥でピークアウトして、⑦で再度売りシグナルです。ただし⑦のあとは取引終了時間帯ですので、ここでポジションをとるのかどうかは悩みどころです。

うーん。こーやってみると、ATRと組み合わせるとシグナルとして成立しているのは⑤ぐらいですね。それもちょっと疑問が残る内容です。

1日だけですので、何とも言えないですが、ほとんどがフィルタにはじかれてしまいました。逆に考えると押し目狙いには効果ありってことかもしれません。

S/Rオシレータのもう一つのシグナルとして、サポートラインの100からの立下り、レジストラインの0からの立ち上がりという、どちらかというと追従型のシグナルもあります。こちらはATRとの組み合わせはどうなんでしょうね?

さて、ここまであれこれ書いたのですが、ATR(24)という期間がもしかして長すぎるのかも?というのが1点、そしてATRそのものが変動が細かすぎて、とても使いにくいことが1点あります。
ということで、このATRを改善したらもっとわかりやすくならないでしょうか?

明日に続きます。