2015/08/08

外部エネルギーが加えられることによりエントロピーの増大が妨げられるとさ。。

はじめに

ご無沙汰しております^^;
 さてさて今回は、チャート内の特異値(Bar)を見える化する指標を作成することにしました。


手順


まず初めに、各Barの値として(高値-安値)《以下 高安値》を採用しました。
高安値を採用したことにより対数正規分布を連続確率分布として採用します。
参考記事:ベキ分布?  対数正規分布を調べてみた。  検証してみました。

あとは、分布のパラメータを推定して、各高安値を当てはめて発生確率を求めました。そして出来上がったのがコレです。。。。。なんだか全然見える化できていない。。orz


 そこで、選択情報量の定義を利用して左記のように見やすくしました。自画自賛w
※ちなみに情報量の定義などは、こちら








まとめ

  今回実施した特異値に理由付けを行ってみた結果が以下の画像です。

大きく指標が跳ね上がった部分は、何らかの理由付けができそうです。いや~黒田日銀総裁の円安是正発言は、まいりました。^^;
 さてさて、今回の指標は、高安値が高いから指標が跳ね上がるだけでなく極端に低い場合でも跳ね上がります。右のチャート部分は、時間当たり2ティックしかなく特異値として指標が跳ね上がりました。発生確率が低い値(高安値)を見える化する事が目的なのでこんな感じとなります。データの抜けが原因かな?。。
  ここでお題の話を少し。。情報エントロピーという情報量の定義指標があって(参考)、情報を受け取ると情報エントロピーは、最小となる。つまり、事象の不確かさが、最小となる。つまり、(ここからは、妄想。。)不確実さが低減されるのであれば、秩序だった動きが現れるんじゃないの?だったら∑(゚Д゚;)!! いや~妄想ってホント素敵ですねw 夏があまり好きではないおっさんの戯言でありました。


コード

DLは、ココ

//+------------------------------------------------------------------+
//|                                                       impact.mq4 |
//|                                         Copyright 2015, bighope. |
//|                        http://expertadviser-bighope.blogspot.jp/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015,bighope."
#property link      "http://expertadviser-bighope.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 5
#property indicator_maximum 20
#property  indicator_buffers 1
#property indicator_color1 Snow
#define pi 3.14159265358979
input int Startbar     =     0;     //データの取得開始Bar数
input int Range        = 2000;     //平均と偏差を導くためのデータ数
input double  wide    = 10.0;       //確率密度×○倍(特に意味がありません)

double Buf[];
string Indicator_Name ;

//+------------------------------------------------------------------+
//|GetData
//|out[Ns]     データの取得配列
//|Ns            データの取得数
//|St            開始インデックス
//+------------------------------------------------------------------+  
int  GetData(int St,int Ns,const double &hi[],const double &lw[],double &out[]){
   int i;
   double pt = MathPow(10,Digits);
   for(i=0;i<Ns;i++) out[i]=(hi[St+i] - lw[St+i])*pt;
   return(i);
}
//+------------------------------------------------------------------+
//| Logsd_likelihood 対数正規分布 最尤法によるパラメータ推定
//|data[Ns]     対象データ
//|Ns           データの取得数
//|mu           対数正規分布パラメータ
//|sigma2       対数正規分布パラメータ (sigma^2) 
//+------------------------------------------------------------------+  
void Logsd_likelihood(int Ns,double &data[],double &mu,double &sigma2){
   int i;
   mu =0.0;
   sigma2 = 0.0;
   for(i=0;i<Ns;i++)mu += MathLog(data[i]);
   mu /= Ns;
   for(i=0;i<Ns;i++) sigma2 += MathPow((MathLog(data[i])-mu),2);
   sigma2 /= Ns;
}
//+------------------------------------------------------------------+
//|Logsd_dist  対数正規分布の確率密度
//|dt              データ
//|w               対象データの幅
//|mu              対数正規分布パラメータ
//|sigma2          対数正規分布パラメータ  (sigma^2) 
//+------------------------------------------------------------------+ 
double Logsd_dist(double dt,double w,double mu,double sigma2){
    double A,B;
        A = 1/MathSqrt(2*pi*sigma2);
        B = MathPow((MathLog(dt)-mu),2)/(2 * sigma2);
    return(w*A*MathExp(-B)/dt); 
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,Buf);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
    int i,limit;
    double d;
    ArraySetAsSeries(high,true);
    ArraySetAsSeries(low,true);
    //対数正規分布 最尤法によるパラメータ
    static double Mu     = 0.0;
    static double Sigma2 = 0.0;
    //初期設定 
    if(prev_calculated ==0){
        double date[];
        ArrayResize(date,Range);
        //データの取得
        if(GetData( Startbar,Range,high,low,date)<(Range-2)){
            Print("データが設定分取得できませんでした。");
            return(0);
        }
        
         //パラメータ推定
        Logsd_likelihood(Range,date,Mu,Sigma2);
        if(Mu >0 && Sigma2 >0){
          Print("mu=",Mu,"  Sigma^2=",Sigma2);  
        }else{
               Print("パラメータの推定に失敗しました。");
               return(0);
        }
    }
    
    limit = rates_total-prev_calculated-1;
    if(prev_calculated>0)limit++;
    for(i=0;i<limit;i++){
      d = (high[i+1]-low[i+1])* MathPow(10,Digits);
      if(d>0) Buf[i] = -MathLog(Logsd_dist(d,wide,Mu,Sigma2));
    }
    return(rates_total);
  }
//+------------------------------------------------------------------+

2014/09/05

なんとな~くWebRequest()が使ってみたくなって。。。イベントタイマーを作ってみました。

新MT4で新たに追加されたWebRequest()関数を使うことで、外部のサーバーにリクエストを送ることが可能となりました。(DLLを使用したり、ほかの言語を使用すれば、もちろん可能ですが。。^^;)ということで、今回は、DLLや多言語を使用することなく、外部サーバーから指標データを取得し、表示させてみました。

準 備

まず、WebRequest()関数のリファレンスを確認すると、この関数を使用する場合は、【ツール(T)】-【オプション(o)】―【エキスパートアドバイザー】で《Allow WebRequest for listed URL:》にチェックを入れ、外部サーバーのアドレスを追加しておきます。
今回は、DailyfxJapanを使用させて頂くので以下のようにしています。
opustion
その他の注意事項として、WebRequest()関数は、非同期関数で、EAもしくはスクリプトのみ使用可能。インジケーターで使用すると【error 4060 – "Function is not allowed for call".】と怒られます。∑(゚∀゚ノ)ノキャー今回は、EA上で使用することにしました。

 


実行してみると・・・

karenda
今回作成したEAをココに置いておきます。使用する際はEAとして使用してください。※2014/9/8EAを一部変更しました。
また、サーバーから取得したhtmlファイルは、MQL4/Filesに保存されます。


課題やら留意した点やら問題点

1.結局WebRequest()関数のテストをしようと思って作り始めたのですがリファレンスの例をそのまま使用しています。..orz
2.保存したHTMLファイルは、Shift_JISで保存しているのでブラウザで開くと文字化けする。(本来は、UTF-8)
3.StringSetChar(A,B,'文字')関数の文字部分は、”ストレートクォーテーションマーク”を使用するとバグが発生しましたので
  ’アポストロフィー’を使用しました。リファレンスも ’アポストロフィー’を使用しています。
4.終日イベントの時間を00:00としているので、00:00を過ぎると表示されなくなる。。orz
5.LABELオブジェクトを使用したので、表示させる文字数が多すぎるとすべてが表示されない。。orz
6.週末すべてのイベントが終了すると寂しい。土曜日に実行しても同じ。。。


まとめ

ん~なんだか中途半端な気がします。。^^;