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);