2017年2月18日土曜日

[MT4プログラム]小ネタ、どうしようもなく遅いCObjectArrayを少しでも高速化

注意!
2017/05/16 この手法はMT4 Build1080から使えないようです。

ハーモニックパターン検出インジケータの中で、CObjectArrayを使用しているのですが、
この子があちこちどうしようもなく遅いです。

少しでも早くということで、コードを改造しています。

MQLについているCArrayシリーズのSearchメソッドですが、内部でQuickSearchという配列がソート済みであることを前提とした検索を行っていて、未ソート状態だと、必ず未発見を返してくるというふざけた仕様です。
(ソート済み→QuickSearch、未ソート→全量探査じゃね??)

まぁ試してみた所、試行回数が多い場合、
通常のAdd+全量探査
InsertSort+QuickSearch
だと、後者の方が多少早いようです。

InsertSortは、ソート状態を維持するデータ追加メソッドですが、この子も遅いです。

中ではInsertメソッドを呼び出しています。
MQLでは配列のブロック移動を行うメソッドがなく、ループで回して要素ごとにコピーしているわけですが、その際移動先のポインタが生きている場合Deleteするといったチェック処理が含まれています。
Insert処理ですので、配列を一個拡張してデータが入っていない所へのコピーですから、絶対データがない前提でOKのはずです。

ということで、少しだけ改造してみた結果です。

元コード
//+------------------------------------------------------------------+
//| Inserting an element in the specified position                   |
//+------------------------------------------------------------------+
bool CArrayObj::Insert(CObject *element,const int pos)
  {
//--- check
   if(pos<0 || !CheckPointer(element))
      return(false);
//--- check/reserve elements of array
   if(!Reserve(1))
      return(false);
//--- insert
   m_data_total++;
   if(pos<m_data_total-1)
     {
      MemMove(pos+1,pos,m_data_total-pos-1);
      m_data[pos]=element;
     }
   else
      m_data[m_data_total-1]=element;
   m_sort_mode=-1;
//--- successful
   return(true);
  }


修正後コード
//+------------------------------------------------------------------+
//| Inserting an element in the specified position                   |
//+------------------------------------------------------------------+
bool CCustomArrayObj::Insert(CObject *element,const int pos)
  {
//--- check
   if(pos<0 || !CheckPointer(element))
      return(false);
//--- check/reserve elements of array
   if(!Reserve(1))
      return(false);
//--- insert
   m_data_total++;
   if(pos < m_data_total - 1)
   {
      //--- copy from left to right
      //修正箇所
      int total = m_data_total - pos - 1;
      for(int i = total - 1; i >= 0; i--)
      {
         m_data[pos + i + 1] = m_data[pos + i];
      }
//      MemMove(pos+1,pos,m_data_total - pos - 1);
      m_data[pos]=element;
   }
   else
      m_data[m_data_total-1]=element;
   m_sort_mode=-1;
//--- successful
   return(true);
  }

修正前のメタエディタプロファイリング結果

修正後のメタエディタプロファイリング結果

大体60%ぐらいに処理時間が減りました。
・・メソッド名から想像がつくかと思いますがV9です。苦闘中です。なるべく消えないように探査を増やしたいのですが、ものすごく重くなってしまったため、メタエディタのプロファイリングとにらめっこしながら、遅いところを虱潰ししてます・・・。

CListを使えっていう話もあるのですが、こちらにはInsertSortメソッド無いのですよねぇ。多分Listだとソート処理が遅いんだろうな。インデックス位置を追いかけるのにカレントポインタを移動しなくちゃいかんから・・・。

自分だけで使うなら、もうC#で組んでそうです(笑)

実はその2に続く。
http://mt4program.blogspot.jp/2017/02/mt4cobjectarray2.html


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年2月16日木曜日

[ハーモニック]開発キット公開再開

バックテスト中にメモリ不足に陥る現象を何とか改善して、公開再開しました。
M15までならいけることを確認しました。

内部でバッファ36個とか使っていたので、メモリ不足に陥ったようです。
公開用の11個以外は全部内部確保に切り替えました。その分速度が遅くなりました・・。
EURUSD H1 1年分のバックテストで大体15分くらいはかかります。

EA開発者向けハーモニックパターン検出
ハーモニックパターン検出ForEAインジケータ 開発キット

デモ口座やリアル口座で動作するハーモニックパターン検出インジケータ for EA製品版はV9リリースの3月以降となります。

ファイルにはインジケータ本体となるex4ファイルと、EAサンプルコードのmq4/mqhファイルが含まれます。

サンプルEAのバックテスト結果は次の通りです。
あんまり+になることを考えず作ったのですが、意外に+でした。
サンプルEAのルールは次の通りです。

・最大10ポジション
・ハーモニック検知でポジションオープン、バー1本につき1つ
・次の売り買い方向が異なるハーモニック検知でポジション全クローズ
・40pipsでブレークイーブン設定

■サンプルEA バックテスト2016 EURUSD H1 alpari 0.01lot / pos

通貨ペアEURUSD (Euro vs US Dollar)
期間1時間足(H1) 2016.01.04 00:00 - 2016.12.30 18:00 (2016.01.01 - 2017.01.01)
モデル全ティック (利用可能な最小時間枠による最も正確な方法)
パラメーターSep00=""; MagicNumber=86298629; IsCountdong=false; SpreadFilter=5; Lot=0.01; Slippage=1; MaxPosition=10; Comment="Harmonic For EA"; Sep10=""; HarmonicInd="22_FXON_NONREG\Harmonic4EABackTest"; Sep20=""; LowHighBars=4; PipsDiff=2;
テストバー数7233モデルティック数28723624モデリング品質90.00%
不整合チャートエラー0
初期証拠金10000.00スプレッド20
純益332.65総利益573.59総損失-240.94
プロフィットファクタ2.38期待利得2.08
絶対ドローダウン2.12最大ドローダウン149.73 (1.46%)相対ドローダウン1.46% (149.73)
総取引数160売りポジション(勝率%)80 (85.00%)買いポジション(勝率%)80 (72.50%)
勝率(%)126 (78.75%)負率 (%)34 (21.25%)
最大勝トレード38.12敗トレード-26.83
平均勝トレード4.55敗トレード-7.09
最大連勝(金額)21 (206.06)連敗(金額)4 (-56.68)
最大連勝(トレード数)206.06 (21)連敗(トレード数)-60.64 (3)
平均連勝6連敗2

2016 EURUSD H1に関しては、あまり何も考えず、ハーモニックが出たらトレードってやっても勝てたようです・・・(笑)
ポジションを取る際に、最低M1での逆行を確認したり、トレイリングストップを実装するなりすれば、もうちょっと行きそうです。
今だとナイフがまっしぐらに落ちている時でも取りに行ってしまうロジックです(汗)
まぁ急騰・急落時はスプレッドフィルタが効いて実際には取れない(取らない)かもしれません。

ちなみにEURUSD M15で動かすとこんな感じ。

■サンプルEA バックテスト2016 EURUSD M alpari 0.01lot / pos

通貨ペアEURUSD (Euro vs US Dollar)
期間15分足(M15) 2016.01.04 00:00 - 2016.12.30 18:45 (2016.01.01 - 2017.01.01)
モデル全ティック (利用可能な最小時間枠による最も正確な方法)
テストバー数25929モデルティック数28730479モデリング品質90.00%
不整合チャートエラー0
初期証拠金10000.00スプレッド20
純益561.95総利益1260.47総損失-698.52
プロフィットファクタ1.80期待利得1.17
絶対ドローダウン66.87最大ドローダウン252.07 (2.40%)相対ドローダウン2.40% (252.07)
総取引数482売りポジション(勝率%)223 (74.89%)買いポジション(勝率%)259 (71.04%)
勝率(%)351 (72.82%)負率 (%)131 (27.18%)
最大勝トレード31.20敗トレード-27.87
平均勝トレード3.59敗トレード-5.33
最大連勝(金額)22 (68.95)連敗(金額)9 (-69.05)
最大連勝(トレード数)115.85 (9)連敗(トレード数)-108.44 (8)
平均連勝7連敗3

・・・・M15でも+引けとは、いや、ちょっと、いや、かなりハーモニック見直しました。っていうかサンプルEAで売れるんじゃなかろうかw
※なお、開発キットはリアル口座・デモ口座では動作しません。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

[ハーモニック]for EA 開発者キット公開開始

ちょっと来週は、忙しいため、今のうちに慌てて作業中です。

ハーモニックパターン検出インジケータ For EAインジケータを作成しています。

自分向けですが、メッセージなどで、一部の方からも、ほしいというご要望をいただいていますので、皆さんにも使っていただける形を考えています。

■ハーモニックパターン検出インジケータ for EA(下)

ハーモニックパターン検出インジケータと同じアルゴリズムを利用した
iCustom関数で値が取りやすくしたEA向けインジケータです。

バッファインデックスの内容は次の通りです。
0 売買フラグ(-1売り、1買い)
1 ハーモニックタイプ Pattern00~Pattern19で指定した0~19の値が入ります。
2 D点価格
3 C点価格
4 C点時間(D点を基準にした相対バー数)
5 B点価格
6 B点時間(D点を基準にした相対バー数)
7 A点価格
8 A点時間(D点を基準にした相対バー数)
7 X点価格 AB=CD形状の場合無効
8 X点時間(D点を基準にした相対バー数) AB=CD形状の場合無効

こーやってみると、最近のEURUSD H1においては、なかなかいいところでシグナルを出していることがわかりますね。

・・・・が、iCustomにぶち込んで計算させると遅い・・・。一回の呼び出しに50msぐらいかかるため、全ティックでは、バックテストが終わる気がしません。
どうしましょう?

ある程度頑張ってサンプルEAを組みました。利益うんぬんより、ちゃんとバックテストが終わるように・・・(笑)、初期状態だと、1時間足の1日のバックテストに5分とかかかるという恐ろしいことになっていました。
多分15分足とかだともっと厳しいかもしれませんが、終わらないという事はないと思います。1分足では多分終わりません。確定足でのみ動作するなどの工夫が必要かと思います。

で、作ったEAを2016年EURUSD H1で試してみたら+引けしました・・。いや負けるだろうと思って作ったのですが・・・。

サンプルコード込で、バックテストのみで動作するインジケータを公開開始します。
需要があるのかどうかはわかりません。
EA開発者向けハーモニックパターン検出
ハーモニックパターン検出ForEAインジケータ 開発キット
ハーモニックパターン検出ForEAインジケータ 開発キット | fx-on.com
「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年2月15日水曜日

[ハーモニック]取扱説明書、書き終えました!

書いておかなくちゃいけないと思った内容はすべて書き終えました!

結構書いたよね・・・。うん。

ハーモニックパターン検出インジケータ 取り扱い説明書

日本語WEB上で、2番目ぐらいにはハーモニックについてまとめて書いているんじゃないかというぐらいの内容になっていると思います!

ハーモニックパターン検出インジケータを使っていない、ハーモニックパターンに興味がある方にも、0~3章や5章などは読み応えのある内容になっていると思います。

例えば3章はこんな感じの内容です。

3.ハーモニックパターンにおけるトレードルール例
ハーモニックパターンは特にポジポジ病の方にはとても有効な処方箋です。値ごろ感などの感覚だけで頼るよりもはるかに有効なツールです。ただし、反射的にトレードして勝てるようなインジケータではありません。
書籍Harmonic Trading, Volume Oneのトレーディングチェックリストには10個のチェックが掲載されています。
1.Is there a pattern?(Harmonic Trading, Volume Oneより)
その1個目が、パターンが検知されているかどうかで、この後ろに9個ものチェックがあります。ここでは深くは取り上げませんが、チェックリストの中では、時間間隔は何を示唆しているか?警告のサインは出ているか?有効なPRZかどうか?という事が書かれています。つまり、トレードの有効な時間か?、他のインジケータはどうか?、ハーモニック(PRZ)が有効か?という3点は最低確認が必要です。
紹介したい内容はたくさんありますが、このあたりは取り扱い説明の範囲外ということで、別の機会にします。
ここでは、ブログにも書いた、EURUSDにおける最低限の意識する内容をベースにトレードルールの候補を書いていきたいと思います。



5章では、検出インジケータが対応している形状毎に、過去トレードからの経験談っぽい内容を記載しました。
そのため、ばりばり主観的な内容を含んでいますがご了承ください。

内容に不備や勘違いなどありましたら、ご指摘ください。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年2月14日火曜日

[MT4インジケータ]スプレッドを記録する。

■EURUSD M1 Alpari-Demo スプレッド

朝方の時間帯はスプレッド大きいですね。朝スキャ対策でしょうか?

いや・・・・役に立つかどうかわからないのですが・・・(笑)
スプレッドを延々記録するインジケータです。

MT4でスプレッドは、過去データでは配信されていませんので、実時間で観測し続ける必要があります。いや、FX-ONにスプレッドを比較する超いいページがあるのですがマイナー通貨とか、対応していない業者のスプレッドも記録しておきたいこともあるかもしれません。
FX-ON 各社スプレッド比較

Pips単位に置き換えて表示します。

あとファイルに保存する機能も持っています。
バー切り替えのタイミングで保存するため、週末最終バーなどは次の週にならないと記録されないので週またいでの記録が必要な場合はMT4を落とさないように気を付けてください。
■インジケータを立ち上げた直後

立ち上げ直すと、また最新バーからの描画となります。
1分足チャートに入れておくと1分毎のスプレッドがspred_シンボル名_1.csvファイルに保存されます。

20017/2/15 追記
なんか勝手にインジケータが消えるときがありますね。
ファイルハンドルの持ち方を変えてみました。

FX-ONからのダウンロードはこちらから
スプレッドを表示・記録する。
スプレッドビュアー
スプレッドビュアー | fx-on.com

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

2017年2月13日月曜日

[ハーモニック]取り扱い説明 執筆中


ブログ記事はちょっとお休み中です。

というのも、コツコツと取り扱い説明を書いているためです。

ハーモニックパターン検出インジケータを使うにあたって最低限の内容だけ取り合ず書きました。
ハーモニックパターン検出インジケータ 取り扱い説明書(作成中)

細かい設定とかはそっちのけで、トレードルールなどとりあえず使ってみる系を記述しました。

といっても最低限のルールは書き終えたため、次はあまり皆様興味ないかもしれませんが、CSVファイルの編集ルールも書いておこうと思います。

しばらくブログ更新しないなーと思ったら、たまに目次見てもらえれば増えていると思います。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。