2016年6月11日土曜日

[ハーモニック]残り3本になりました。6/11 21:00時点

ハーモニックパターンを自動検出するインジケータ
ハーモニックパターン検出インジケータ

大変ご好評頂いております。
980円での限定販売は残り3本となりました。

980円での販売は最初の10本のみですので、早めにご検討ください。

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

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

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

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

2016年6月10日金曜日

[ハーモニック]ハーモニック検出インジケータリリースのお知らせ

おまたせしました!!?
ブログにて少し記事にしたハーモニックパターンについて、検出インジケータを作成しましたのでV1.00としてリリースいたしました。

■ハーモニック検知インジケータ


ハーモニックパターンを自動検出するインジケータ
ハーモニックパターン検出インジケータ
ハーモニックパターン検出インジケータ | fx-on.com

まず、先着10名様限定で980円で販売いたします。6/20まで。

MT4のハーモニック検出インジケータは海外へ行くと見つかりますが、Build600以降未対応のため正しく動作しないものが多いです。
あと検出サイズなども固定であとちょっとといった感じに見受けられました。

そこで、理想のハーモニック検出インジケータを作るべく自作しました。
V1.00では検出系を整えた基本機能となります。

現在、今後下記機能の追加をバージョンアップにて予定しています。
・ハーモニック検出時のアラート機能
・外部ファイルでのハーモニック形状の追加機能

また、皆さまからのフィードバックを受けながら作成していきたいと考えていますので、ご要望等ありましたらFX-ONのコメント欄にご記入ください。
なるべく対応したいと思います。

機能アップするごとに、ちょっとずつ価格を上げていく予定です。
売り上げがある程度行きましたら、海外書籍も買って、もっと勉強してインジケータの精度を向上させるつもりですので、応援よろしくお願いします。

V1.0では、過去記事で解説した、基本の4パターンについて検出します。

[雑記]ハーモニックパターンってなに? 4つのパターン解説
http://mt4program.blogspot.jp/2016/05/blog-post_30.html

売りのパターンは赤、買いのパターンは青で描画します。

ハーモニックパターンでは、売買候補点が複数発生する場合があります。
例えば、バタフライパターンでは、XA点に対して127%と161.8%の2点の候補が発生します。
このインジケータでは、2点目以降の候補は点線にて追加描画します。
確定した足に対しての再描画は発生しないようにしました。形成中の足に対して、両方の点が発生した場合は、大きい方のみ描画します。

3つの検出粒度の異なる頂点検出から、ハーモニック形状を検知します。
これにより小さいハーモニックから大きなハーモニックまで幅広い形状を検出可能にしました。

ただし、このアルゴリズムにより、大きなハーモニックの中に小さなハーモニックが検出される場合があります。

MT4の描画の問題で、同じ背景色で図形が重なる部分は背景が削除されてしまいます。

そこで、背景色をOn・Offするボタンをチャート左端に配置しました。ボタンを押すたびに背景色をOn/Offすることができます。

■ハーモニックパターン検出インジケータV1.0 設定
・頂点ライン描画

 頂点探査結果ラインを描画する場合trueを指定します。


・頂点探査深さ1 0探査しない
・頂点探査深さ2 0探査しない
・頂点探査深さ3 0探査しない

 頂点検出のための、高値安値検出期間です。最大3つまで指定可能です。
 0を指定すると、探査を無効化します。

 初期値は4時間足を想定した値となっています。時間足の場合は24,32,40程度の値をお勧めします。


・頂点誤差Pips
・頂点書き換え期間

 頂点検出のためのパラメータです。特に修正は不要です。


・C点と比較して新高値安値が発生したら検出しない

 このインジケータでは、XABCまでのハーモニック形状が確定した場合、その後の形状にかかわらず、
指定価格まで来た場合はハーモニックとして描画します。

 例えば次のチャート形状だと、C点の後にさらに下値が形成されているため、
厳密にはハーモニックパターンとは言えません。

このような場合は、描画しないときにtrueを指定します。


・X-A点間最小Pips

X-A間の最小Pipsを指定します。小さすぎるハーモニックを除去します。


・買いハーモニック形状色 背景なしはclrNONE
・売りハーモニック形状色 背景なしはclrNONE
・買いライン色
・売りライン色
・ラベル色
・背景切り替えボタン位置X
・背景切り替えボタン位置Y

上記は描画に関する設定です。お好みで修正してください。


ハーモニックパターンを自動検出するインジケータ
ハーモニックパターン検出インジケータ


まず、先着10名様限定で980円で販売いたします。6/20まで。

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

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

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

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

[MQL超入門] その025 プロファイリングを使った実行速度調査&クラス呼び出し速度改善

すこし超入門からは外れるかもしれませんが、速度改善のお話しです。

インジケータを作っていて、あー遅いなー?と思うことがあります。
どこで遅くなっているのか調査する場合、ソースコードを眺めて追いかける良いツールがメタエディタにはついています。

プロファイリング機能です。

これは、プログラムを実行した際、関数毎に時間を計測してくれる機能です。これを使うと、どこで遅くなっているのかが見た目で編別可能になります。

早速使ってみましょう。
遅いなーと思うプログラムをメタエディタで開きます。
ツールバーのプロファイルスタートボタンを押します。下画像の赤丸の箇所です。

■メタエディタ プロファイル開始ボタン

計測が開始されると、赤い■ボタンに変わりますのでチャートにインジケータが表示された後に、この赤■ボタンを押します。

■メタエディタ プロファイル終了ボタン

■メタエディタ プロファイル終了したあとの表示

計測が終了すると、メタエディタ上に実行にかかった時間が表示されます。ソースコード右端にもバーで表示されます。
このバーが大きいほど時間がかかっている個所になりますので、改善方法がないかどうかを調査していく形になります。

MQLにおける速度改善の基本は

・ループの中で余計な処理をしない。
・何度もループしない。

の2点にほぼ集約されます。特にループ外へ処理を追い出す修正は効果が高いため、具体例を挙げたいと思います。

■ダメな例
for(int i = 0; i < rates_total; i++)
{
    double currentClose = iClose(NULL,0, 0);
    if( currentClose > iClose(NULL, 0, i) )
    {
        //何か処理
    }
}

上記のプログラムでは、iClose(NULL, 0, 0)の結果はループ変数のiに全く影響をうけません。このような処理はループの外に追い出す必要があります。

■修正例
double currentClose = iClose(NULL,0, 0);
for(int i = 0; i < rates_total; i++)
{
    if( currentClose > iClose(NULL, 0, i) )
    {
        //何か処理
    }
}

この修正で、処理時間が約1/2になります。

修正前処理時間 = iClose処理時間 * 2 * rates_totals

修正後処理時間 = iClose処理時間 + iClose処理時間 * rates_totals

実際プロファイリング機能で見てみましょう。

■ループ内の処理をループ外に追い出した場合の速度差

InnnerCallに対してBeforeCallは処理時間を示すバーの幅が半分になっていることが見て取れるかと思います。
このようにループの中の処理見直しは改善効果が高いため、もし表示が遅いなーということがあれば、ループ内処理を中心に見直すことになります。


プロファイリングといえば、以前MQLのクラスメソッドの呼び出しが異常に遅い!と文句たらたらだったことがあります。
[MT4プログラミング]クラスメソッドの呼び出しにご用心

そろそろ治ってないかなーとおもい、プロファイリングの記事を書くついでに、MT4 Build971にて再計測してみました。使用したプログラムは次の通りです。

//------------------------------------------------------------------
// 速度テスト
#property copyright "Copyright 2016,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

#define MAXCOUNT 10000

class COpen
{
public:
   void IndirectionOpen()
   {
         iOpen(NULL, 0, 1);
   }
};

COpen m_open;

COpen *m_pOpen;


//------------------------------------------------------------------
// 初期化
int OnInit()
{
   m_pOpen = GetPointer(m_open);
   DirectCall();
   IndirectionCall();
   ClassCall();
   ClassPointerCall();

   return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
// 直接呼出し
void DirectCall()
{
   for(int i = 0; i < MAXCOUNT; i++)
   {
      iOpen(NULL, 0, 1);
   }
}

//------------------------------------------------------------------
// 間接呼出し
void IndirectionCall()
{
   for(int i = 0; i < MAXCOUNT; i++)
   {
      IndirectionOpen();
   }
}

void IndirectionOpen()
{
      iOpen(NULL, 0, 1);
}

//------------------------------------------------------------------
// クラス呼び出し
void ClassCall()
{
   for(int i = 0; i < MAXCOUNT; i++)
   {
      m_open.IndirectionOpen();
   }
}

//------------------------------------------------------------------
// クラス呼び出し
void ClassPointerCall()
{
   for(int i = 0; i < MAXCOUNT; i++)
   {
      m_pOpen.IndirectionOpen();
   }
}


//------------------------------------------------------------------
// 計算処理
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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


OnInitの中で、次の4つの関数を呼び出して速度比較してみます。
・直接iOpenをコール(DirectCall)
・一回関数をはさむ(IndirectionCall)
・クラスの直接参照(ClassCall)
・クラスのポインタ参照(ClassPointerCall)

結果は次の形になりました。
MQL プロファイラレポート - SpeedTest.mq4
関数 カウント 時間 パーセント グラフ
OnInit 27 1 2 422 99.71%
COpen::IndirectionOpen 20000 730 30.05%
IndirectionCall 31 1 686 28.24%
ClassCall 32 1 686 28.24%
ClassPointerCall 33 1 686 28.24%
iOpen 40000 419 17.25%
IndirectionOpen 54 10000 365 15.03%
DirectCall 30 1 363 14.94%
@global_initializations 1 6 0.25%
OnCalculate 86 26 1 0.04%
COpen::~COpen 1 0 0.00%
COpen::COpen 20 1 0 0.00%
@global_deinitializations 1 0 0.00%
GetPointer 29 1 0 0.00%
Copyright 2001-2013, MetaQuotes Software Corp.



直接参照が一番早いのは当然として、関数呼び出し~クラス呼び出しについては差がなくなっています。以前はクラス呼び出しが異常なほど(それこそ10倍ぐらい)遅かったのですが改善したようです。

これでもっと積極的にクラスが利用できます。

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

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

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

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

2016年6月9日木曜日

[雑記]対OANDA BEEKS-NY4より、つかえるネットのほうが早い・・・だと? & VPS過去記事まとめ

TACAさんのブログのVPS速度測定記事をみていて、OANDAのNYサーバーと同じビルに入っているBEEKS-NY4の速度測定が載っていました。

自分がつかっているつかえるネットの速度を比較してみると・・・・・・

※参考記事
FX MT4自動売買EA作成 ソースコード無料公開中KYOTO

【ボランティア募集中】 VPSとFX会社の距離測定について
http://mt4kyoto.blogspot.jp/2016/06/vpsfx.html

VPS SPEED TEST from BEEKS-NY4 to OANDA JAPAN
http://mt4kyoto.blogspot.jp/2016/06/vps-speed-test-from-beeks-oanda-to.html

BEEKS-NY4  69.404ms(TACAさんのブログ記事より引用)
つかえるネット 56.318ms

あれ?
つかえるネットのほうが早い・・。

ちなみにPingで、つかえるネット アメリカリージョンからOANDAサーバーへの反応速度を調べてみると2msとかなり高速です。間11個ほどルーターを経由しているようですが、間のルータはかなり高性能のようです。

ping mt4-jp-trade.oanda.com
mt4-jp-trade.oanda.com [198.105.26.56]に ping を送信しています。
198.105.26.56 からの応答: バイト数 =32 時間 =2ms TTL=117
198.105.26.56 からの応答: バイト数 =32 時間 =2ms TTL=117
198.105.26.56 からの応答: バイト数 =32 時間 =2ms TTL=117
198.105.26.56 からの応答: バイト数 =32 時間 =2ms TTL=117

私の考察として、「BEEKS-NY4」と「つかえるネット」 で10ms近い差が出たのは、測定したタイミングによるOANDA側のサーバ負荷の差ではないかと考えています。お昼の時間帯にEURUSDにて測定しましたが、この時間帯はEURUSDは注文が薄い時間帯です。

10msの差になるとサーバー側の受付待機時間による誤差と考えたほうがしっくりきます。通常クライアント側の性能差はマイクロ秒の世界になります。もしくは、プロ口座とスタンダード口座の差かもしれませんね。

TACAさんから頂いたコメントにて、つかえるネットへの乗り換えも検討されているようですので、追加の調査記事に期待です^^

BEEKS-NY4と比較して、つかえるネットは、1/2~1/4(6月は半額キャンペーン中)ぐらいの値段で契約できます。速度も大して変わらないのであれば、日本語サポートもつかえる、つかえるネットのほうがお得のようです。

ちなみに1年前VPS契約するにあたり、私も少し調査しましたので、リンクまとめしておきます。
■VPS調査 過去記事

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

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

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

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

2016年6月8日水曜日

[MT4プログラム] MT4 Build971記念 MT4サーバーとの通信速度を取得する/DRAW_NONEを確認する。

MT4のBuild970アップデートが入りました。
再度確認してみたらBuild971がインストールされていました。

ex4の後方互換がなくなりましたので注意です。Build971でコンパイルしたex4はBuild960以前では動作しないようです。

ビルド970:デモ口座開設の簡素化およびMQL4の機能の拡張
https://www.mql5.com/ja/forum/86990

さて、MQL回りにあれこれ修正が入りました。詳細はフォーラムの投稿を見てもらうとして、プログラマ的には純粋仮想関数の導入が肝でしょうか? これで実装忘れがかなり減らすことができますね。フォーラムに詳細が記載されていますので、そちらにお任せします。

それ以外で気になった所を試したいと思います。

MQL4:クライアントターミナルのプロパティENUM_TERMINAL_INFO_INTEGERにTERMINAL_PING_LAST(マイクロ秒単位の取引サーバーまでのPingの最新の既知値)が追加されました。1秒は100万マイクロ秒です。
ちょっとやってみました。

//------------------------------------------------------------------
// ターミナルまでの最新PING値
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

int OnInit()
{
   return(INIT_SUCCEEDED);
}
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[])
{
   int ping = TerminalInfoInteger( TERMINAL_PING_LAST );
   Comment(StringFormat("Lasted Ping: %d ms", ping / 1000));
   return(rates_total);
}


・・・・・・・
AlpariとOandaデモで試しましたが、両方とも、10000000が固定で帰ってきます。使えないです。EAでも試してみましたが同じでした。デモで発注を掛けた後、再取得してみましたが同じでした。
・・・・・・・・うん。現状、使えないです。

2016/06/09追記
MT4起動時の操作履歴で、ログイン履歴が出てきます。
login datacenter on Alpari-Demo through demo.uk.6 (ping: n/a)

ここで、(ping n/a)となっているとアウトのようです。
Orandaのリアル口座の方では、ここがぴping 2.84msとなっていて、値が取れます。デモ口座だからダメなのかな?


MQL4: カスタムインディケータのDRAW_NONEバッファ(チャート構築なし)は、これからはチャートウィンドウの最大/最小値の計算に関与しません。

子ウィンドウに出すようなバッファの場合、描画していないラインに引っ張られて困っていたので、これはいいですね。ちゃんと動けば。ということでやってみました。

//------------------------------------------------------------------
// DRAW_NONEが最大最小値に影響を与えない
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

//バッファーを指定する。
#property indicator_buffers 2

#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_type2   DRAW_NONE

double buffer1[];
double buffer2[];

int OnInit()
{
   SetIndexBuffer(0, buffer1);
   SetIndexBuffer(1, buffer2);
   return(INIT_SUCCEEDED);
}
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 - prev_calculated - 1; i >= 0; i--)
   {
      buffer1[i] = close[i];
      buffer2[i] = 10000;
   }
   return(rates_total);
}
お!こちらは書いてある通りに動作しているようです。

そして、フォーラムコメントには早速不具合報告が・・・・・。

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

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

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

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

[フラクタルバンド]GBPUSD4時間足 運命の6/23に向けてレンジ帯へ


■2016/6/7 GBPUSD 4時間足

イギリス国民投票に向けて世論調査で一喜一憂する相場状況。レンジ相場っぽくなってきました。若干上向きということで、相場参加者全体としては残留とみていることがなんとなく読み取れますね。6/23までは、ある意味わかりやすいレンジ相場になるかも知れません。

FX業者からは6/23付近のGBPに関する証拠金の変更お知らせも入ってきていますね。

私が主に使用しているOANDAからも証拠金を20倍に変更するお知らせが来ていました。

------------------------------
2016年6月23日(木)にイギリスのEU離脱の是非を問う国民投票が予定されており、
その動向による市場への影響が大きくなることが予想されるため、当社では2016年
6月17日マーケットクローズ~2016年6月24日マーケットクローズの間、GBPを含む
通貨ペアの証拠金率を5%に変更いたします。

GBPに関する通貨ペアのポジションを保有されているお客様は、2016年6月17日マー
ケットクローズ以降も保有し続けた場合、証拠金率の変更によってマージンコール
またはロスカットが発生する場合がございます。
あらかじめポジションを縮小していただく、または口座資金に十分な余裕を持って
いただくことをお勧めいたします。

また、GBP関連以外の通貨ペアの変動や流動性にも影響を与える可能性もあります
ので、GBP関連以外の通貨ペアをお取引されているお客様におかれましても、通常
時以上のリスク管理を行っていただければと存じます。

http://oanda.jp/cms/index.php/announcement/news/351
------------------------------

私としては、6/23は全ポジション決済、GBPが絡むEAはすべて停止することをお勧めします。特に離脱なんて結果がでたら、長年鉄板だった、USDGBPの瞬間値ではない1.4割れとか、瞬間値で1.3割れとかも見れそうです・・・。逆指値トラップ系EAでもスプレットが拡大しすぎて、瞬間的にはおかしな動きをしそうなぐらいのインパクトです。
上方向へは、それなりにおとなしい上がり方をしそうですので、投票当日に1.47付近に逆指値で買いポジとかもありそうですね。

ユーロも影響が出ると思われるため、6/23付近はGewinn7/8を動かしている方も、6/23付近はいったん停止することをお勧めします。

フラクタルバンドは試用版を公開中です。
フラクタルバンド2016/06/24まで使用可能な試用版
フラクタルバンド 試用版

フラクタルバンド 1680円 認証コードなしの売り切りにて販売中です。
頂点位置からレンジ帯を表示する
フラクタルバンド


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

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

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

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

2016年6月7日火曜日

[雑記]VPS速度測定調査 ボランティアに参加してみる。


ふらっとブログをサーフィンしていたら、

FX MT4自動売買EA作成 ソースコード無料公開中KYOTO
【ボランティア募集中】 VPSとFX会社の距離測定について
http://mt4kyoto.blogspot.jp/2016/06/vpsfx.html


ということで、早速やってみました。
つかえるネットVPS for FX アメリカ リージョン → OANDA Japan プロ口座


56.318msです。
ブログ主は最近FX-ONで記事を連載している方かな?

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

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

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

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

[Gewinn8]6月は調子よくスタート

Gewinn8が順調に利益を上げています。日足フラクタルの回帰直線の下側を超えたあたりで、雇用統計がネガティブサプライズだったため、いい感じにアルゴリズムとマッチして大きく利益を取れました。

Gewinn8(EURUSD) | fx-on.com

こちらのOanda デモ口座のバックテストでは、もっと利益を上げているのですが、たまたまバージョンアップのタイミングと合致したところでポジションシグナルが出たため、ポジションを持たなかったようです。

Gewinn7/8では、EA起動/再起動後2時間はポジションを持たないようなフィルタが含まれています。再起動と同じタイミングでシグナルが立った場合、何個もポジションを持ってしまうことを防ぐためです。

このルールに引っかかったようです。

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

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

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

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