2017年2月25日土曜日

[ハーモニック]ベータ版アップデート

V9ベータ版をアップデートしました。

少々遅れたため3/11まで使用期限を延長しています。
延長したインジケータを利用するためには最新版のダウンロードが必要ですのでご注意ください。

皆様からのバグ報告お待ちしております。

修正内容はメモリ使用量の削減と、処理高速化、インジケータリロード時に消えてしまうハーモニックが存在する件などの対策です。

ハーモニックパターン検出インジケータV9 ベータテスト版
ハーモニックパターン検出インジケータV9 ベータテスト版

P.S.
おもったより風邪が長引いております。
皆様も体調にはお気をつけください・・・・。

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

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

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

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

2017年2月22日水曜日

[雑記]プログラマの単価

熱出して寝込んでいる、だいすけです。

明日から客先出張なのですが、それまでになんとかしないと・・・栄養ドリンクと解熱剤で今日中になんとかすべく布団の中に潜り込んでいます。

まぁ、こんなブログを書いていると、FX-ONにて、たまにこんなプログラムを作ってくれませんか?1万円で。

というご依頼があります。

皆様のソフトウェアのイメージだと、大体1万円ぐらいが相場ですので、そのようにおっしゃるのだろうと思います。

ただ、この価格は開発に関する費用を、購入人数で割っている為、実現可能な値段です。

では、プログラムにかかる人件費はどの程度でしょうか?
これは、都市部と地方でかなり異なるのですが、ざっくり行くと1日分の作業で最低3万円です。

ですので、3万円でこの程度のプログラム作れます?っていわれると、あぁこの人1日分の作業依頼してきているのだなぁと感じます。

ハーモニックパターン検出インジケータの場合、どうでしょうか?
大体開発に20日、改造に20日程度かけています。大体120万ぐらいかかっているイメージですね。これを100人程度の方に買っていただける前提で18000円前後の値付けをしています。18000円のうち、宣伝費とFX-ON手数料として35%ぐらいとられますので、100人に売れてやっとトントンといったところです。

お金のイメージついていただけたでしょうか?

ですので、プログラマさんにお願いする時に自分がほしいものを素直にお金を出して作ってもらうのは、個人感覚では、なかなか単価が合いません。

その為、こーいうインジケータがあると売れると思うんだけどどう?あったら買うよとか、こーいうデータくれたら解析結果渡すよみたいな提案の方がじゃぁやっていようかな?ってなること多いです。

あまり落ちのない話ですが、熱のせいってことで。それでは皆様おやすみなさい・・。

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

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

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

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

[MT4インジケータ]高速版簡易Zigzag

■高速版簡易ZigZag

需要があるかどうか、さっぱりわかりませんが、高速版簡易Zigzagです。
MT4にZigzagインジケータついていますが、実は結構遅いです。

ハーモニックパターン検出インジケータの検知にもZigZagのアルゴリズムだけ一部拝借していたのですが、インジケータ再描画時に、消えちゃうパターン対応にするために、全バーに対してZigzag演算していたら処理が返ってきません。

(MT4ですが、いつの間にか3秒以上処理時間がかかると強制的にインジケータをアンロードするような?)

ということで、どうせZigZagは過去の書き換えが発生する前提なので、書き換え範囲を前1頂点に絞り、なるたく高速にそれっぽい情報を描画するインジケータです。

別にZigZagで不満がない人は全く不要なインジケータです。多分EA開発者向け。
FX-ONにアップロード予定も特にありませんが、ex4ファイルでほしいという方がいらっしゃったら改めて考えます^^;;

あ、あと本家のZigZagですが、たまに、頂点間に頂点より大きい別の高値や安値があるのに無視してしまう件だけ対策しています。

共通処理の関数化とかあえて行っていません。なるたけ高速化するためです。

//------------------------------------------------------------------
// 簡易版ZigZag

#property copyright "Copyright 2017,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1

#property indicator_label1  "SZG"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input int Depth = 12;   // 探査深さ
input int BackStep = 5; // 確定インデックス

//バッファ
double m_zigzag[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   if( Depth < BackStep ) return INIT_PARAMETERS_INCORRECT;

   //インジケーターバッファを初期化する。
   SetIndexBuffer(0, m_zigzag);
   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 startIndex = rates_total - prev_calculated - 1;
   if( startIndex >= rates_total - Depth )
   {
      startIndex = rates_total - Depth - 1;
   }
   
   // 前頂点の検索
   int beforeFlg = 0 ;
   int beforeIndex = 0 ;

   for( int i = startIndex  + BackStep + 1; i < rates_total && beforeFlg == 0 ; i++ )
   {
      if( m_zigzag[i] != EMPTY_VALUE )
      {
         if( m_zigzag[i] == high[i] ) 
         {
            beforeFlg = 1;
            beforeIndex = i;
         }
         if( m_zigzag[i] == low[i] )
         {
            beforeFlg = -1;
            beforeIndex = i;
         }
         break;
      }
   }
   
   for( int i = startIndex; i >= 1; i-- )
   {
      int backStepIndex = i + BackStep;
      m_zigzag[backStepIndex] = EMPTY_VALUE;
      int highest = iHighest(NULL, 0, MODE_HIGH, Depth, i);
      int lowest =  iLowest(NULL, 0, MODE_LOW, Depth, i);
      if( highest != lowest )
      {
         if(lowest == backStepIndex )
         {
            if( beforeFlg == -1 )
            {
               if( low[beforeIndex] > low[backStepIndex] )
               {
                  m_zigzag[beforeIndex] = EMPTY_VALUE ;
                  m_zigzag[backStepIndex] = low[backStepIndex];
                  beforeFlg = -1;
                  beforeIndex = backStepIndex;
               }
            }
            else
            {
               m_zigzag[backStepIndex] = low[backStepIndex];
               beforeFlg = -1;
               beforeIndex = backStepIndex;
            }
         }
         if( highest == backStepIndex )
         {
            if( beforeFlg == 1 )
            {
               if( high[beforeIndex] < high[backStepIndex] )
               {
                  m_zigzag[beforeIndex] = EMPTY_VALUE ;
                  m_zigzag[backStepIndex] = high[backStepIndex];
                  beforeFlg = 1;
                  beforeIndex = backStepIndex;
               }
            }
            else
            {
               m_zigzag[backStepIndex] = high[backStepIndex];
               beforeFlg = 1;
               beforeIndex = backStepIndex;
            }
         }
      }
      if( highest == lowest && highest == backStepIndex )
      {
         //同時に発生した場合、
         //とりあえず、陽線なら安値、陰線なら高値とする。
         if( open[backStepIndex] < close[backStepIndex] )
         {
            if( beforeFlg == -1 )
            {
               if( low[beforeIndex] > low[backStepIndex] )
               {
                  m_zigzag[beforeIndex] = EMPTY_VALUE ;
                  m_zigzag[backStepIndex] = low[backStepIndex];
                  beforeFlg = -1;
                  beforeIndex = backStepIndex;
               }
            }
            else
            {
               m_zigzag[backStepIndex] = low[backStepIndex];
               beforeFlg = -1;
               beforeIndex = backStepIndex;
            }
         }
         else
         {
            if( beforeFlg == 1 )
            {
               if( high[beforeIndex] < high[backStepIndex] )
               {
                  m_zigzag[beforeIndex] = EMPTY_VALUE ;
                  m_zigzag[backStepIndex] = high[backStepIndex];
                  beforeFlg = 1;
                  beforeIndex = backStepIndex;
               }
            }
            else
            {
               m_zigzag[backStepIndex] = high[backStepIndex];
               beforeFlg = 1;
               beforeIndex = backStepIndex;
            }
         }
      }
   }

   return rates_total - 1;
}


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

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

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

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

2017年2月21日火曜日

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

[MT4プログラム]小ネタ、どうしようもなく遅いCObjectArrayを少しでも高速化
http://mt4program.blogspot.jp/2017/02/mt4cobjectarray.html

の続きです。
ループのたびにチェック処理が入ると遅くなるため、チェック不要なことがはっきりしているのなら、チェックなんてやめてしまえばいいというのが前回の趣旨でした。

そもそもMQLには配列ムーブはありませんが、配列コピーなら存在します。
元の配列がそれほど大きくないことがあらかじめわかっているのであれば、バッファ用の配列を用意して、そこにいったんコピー後、一つずらして元に戻すという処理をおこなうともしかしたら早くなるかもしれません。
 MQLが〇〇で、内部でForループでコピーしているような、〇〇だと効果はないどころか逆効果になりますが・・・。果たして結果は!(〇〇は自己規制w)

修正前コード
//+------------------------------------------------------------------+
//| 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);
  }

修正後コード
//+------------------------------------------------------------------+
//| 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;
      CObject *destArray[];
      ArrayResize(destArray, total);
      ArrayCopy(destArray, m_data, 0, pos, total);
      ArrayCopy(m_data, destArray, pos + 1, 0, total);

      m_data[pos]=element;
   }
   else
      m_data[m_data_total-1]=element;
   m_sort_mode=-1;
//--- successful
   return(true);
  }

■修正前

■修正後

おお。ちゃんと早くなりました。
内部はちゃんとメモリのブロックコピーで実装されているようで安心しました。

この手法は、コピー対象のバッファサイズが増えると一時的なメモリ量が増えるという問題もあります。余計なスワップが発生して処理が遅くなる可能性があるためそれはそれで注意です。

ハーモニックパターン検出インジケータV9ですが、このような、小手先の高速化では限界が近くなってきました・・。

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

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

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

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

2017年2月20日月曜日

[ハーモニック]予告 V9から旧探査モードを削除します。

ただいま、ハーモニックパターン検出インジケータV9の改造をこつこつと行っています。

メモリを食べすぎる件と消えてしまう件が何とかならないか対策中です。

そのあたりの処理を変更する際、どうしても旧処理と共存が出来なくなってしまいました。

いま、ご利用のインジケータの探索方法はV8までとなります。
V9からは新探索方法のみとなります。

購入された方で、V8までの方がよかったという方は、V8インジケータを消してしまわないようにご注意ください。

よろしくお願いいたします。

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

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

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

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

[書評]WORLD END ECONOMICA

久しぶりの書評です。
それも、超ライトなやつ。ライトノベル(笑)
WORLD END ECONOMICA(1~3完結)
異色のライトノベル作家、支倉凍砂著のライトノベルです。

狼と香辛料という小説が、中世ヨーロッパ風のファンタジー世界を舞台とした、商人がバリバリの先物や為替証書を使った駆け引きを行うライトノベルとしては異色内容で人気になりました。(ヒロインのホロがかわいかったという話もありますがw)

その方が書いた、月面都市を舞台としたSFです。

えぇ、月面都市なのは世界を小さくするめの舞台装置で、株式を中心とした投資用語満載の相変わらず(?)の内容です。
ヒロインは天才クオンツ。自分で市場を開設した電力会社(この段階で内容にピンとくる人いるかも?)とか、アナリストの利益相反とか、仕組債とか、絶対通常のラノベには出てこない単語満載の世界を生き抜く主人公たちのお話です。

紙の本があまりに分厚いため手を出していませんでいたが、電子書籍で目についたため読み進めています。ファンドの世界にラノベ風味を付け加えた、その世界に興味がある人向けの楽しい小説です。あぁあと、テクニカル分析を主に考える私としては、やっぱり「予言の自己実現」というキーワードはとても身に染みる言葉でした。

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

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

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

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