アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog
2013年08月12日
第16回 RSI





今回はRSI (Relative Strength Index、相対力指数) についてです。
0%から100%までの値をとる指標です。80%を上回ると買われすぎ、20%を下回ると売られすぎをあらわします。メーンチャートの下に補助チャートとして表示します。




(1) RSI の計算式



いいかえると

RSI=分子×100÷分母
分母=n日間の日々の値幅の合計
分子=n日間のなかで値上がりした日の値幅の合計

n日間、毎日上がり続けた場合は100になり、毎日下がり続けた場合は0になります。
n日間で値上がりした日の割合を日々の値幅で加重平均したものといえます。

(2) RSI の計算

Function RSI算出(データ配列, 周期, 実表示本数)

n = UBound(データ配列)
ReDim a(1 To 実表示本数, 1 To 1)

j = 1
For i = n - 実表示本数 + 1 To n
  開始行 = i - 周期 + 1
  終了行 = i
  If 開始行 < 2 Then 開始行 = 2

  分子 = 0
  分母 = 0
  For k = 開始行 To 終了行
   価格差 = データ配列(k, 1) - データ配列(k - 1, 1)
   If 価格差 > 0 Then
     分子 = 分子 + 価格差
     分母 = 分母 + 価格差
   End If

   If 価格差 < 0 Then
     分母 = 分母 - 価格差
   End If
  Next k

  If 分母 > 0 Then a(j, 1) = 分子 * 100 / 分母
    j = j + 1
Next i

RSI算出 = a

End Function


入力引数のデータ配列は終値の配列です。
入力引数の周期は14等の期間です。プロパティシートで設定します。
入力引数の実表示本数はチャートに表示する本数です。
出力はRSI の配列です。

(3) RSI の表示

Sub RSI表示(終値配列, 実表示本数)

Set ch = 補助チャート追加("RSI")

i = 2
周期 = 配列プロパティ取得("RSI", i)

While 周期 > 0
  RSI配列 = RSI算出(終値配列, 周期, 実表示本数)

  Set sr = ch.seriescollection.NewSerie s
  sr.ChartType = xlLine
  sr.Values = RSI配列
  sr.Name = "RSI" & 周期

  i = i + 1
  周期 = 配列プロパティ取得("RSI", i)
Wend

ch.Axes(xlValue, xlPrimary).MinimumScale = 0
ch.Axes(xlValue, xlPrimary).MaximumScale = 100
ch.Axes(xlValue, xlPrimary).MajorUnitIsAuto = False
ch.Axes(xlValue, xlPrimary).MajorUnit = 50

補助チャート後処理 ch

水平線表示 ch, 20, RGB(255, 0, 0)
水平線表示 ch, 80, RGB(255, 0, 0)

End Sub


指定された期間の折線を複数表示します。
20%と80%の位置に横線を引きます。


(4) プロパティシートの設定



B11セルをTRUE にするとRSIを表示します。FALSE で非表示です
C11セル以降は周期です。何本でも表示できます


エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 02:18 | この記事のURL
2013年08月02日
第15回 ボリンジャーバンド






(1) ボリンジャーバンドの計算式


移動平均線よりもローソク足が上にあれば市場参加者が強気、下にあれば弱気と推測されますが、どのくらい強気なのか弱気なのか判断する目安をボリンジャーバンドは与えてくれます。標本標準偏差=σ とすると信頼区間は下記のとおりです。

移動平均値±σ       0.6826
移動平均値±2σ     0.9544
移動平均値±3σ     0.9974
移動平均値±4σ     0.99994
移動平均値±5σ     0.999994
 
例えば 移動平均値±3σ であれば21等の期間の終値の傾向から推測して99.74%はこの区間に終値がはいるということなので、この範囲からでていたら何か異常なことが起こっていると推測されます。

(2) ボリンジャーバンドの計算

Private Function 標準偏差算出(データ配列, 周期, 実表示本数)

n = UBound(データ配列)
ReDim a(1 To 実表示本数, 1 To 1)

j = 1
For i = n - 実表示本数 + 1 To n
   開始行 = i - 周期 + 1
   終了行 = i
   If 開始行 < 1 Then 開始行 = 1

   sx = 0
   sxx = 0
   For k = 開始行 To 終了行
     sx = sx + データ配列(k, 1)
     sxx = sxx + データ配列(k, 1) * データ配列(k, 1)
   Next k

   a(j, 1) = Sqr((周期 * sxx - sx * sx) / (周期 * (周期 - 1)))

   j = j + 1
Next i

標準偏差算出 = a

End Function


入力引数のデータ配列は終値の配列です。
入力引数の周期は21等の期間です。プロパティシートで設定します。
入力引数の実表示本数はチャートに表示するローソク足の本数です。
出力は標本標準偏差の配列です。1σです。

(3) ボリンジャーバンドの表示

(3-1) ボリンジャーバンドの表示

Sub ボリンジャーバンド表示(ch, データ配列, 実表示本数)

周期 = 配列プロパティ取得("ボリンジャーバンド", 2)

単純移動平均配列 = 単純移動平均線算出(データ配列, 周期, 実表示本数)
標準偏差配列 = 標準偏差算出(データ配列, 周期, 実表示本数)

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 単純移動平均配列
sr.Name = "移動平均" & 周期

s = 1
k = 3
For i = 1 To 5
   If BOOL配列プロパティ取得("ボリンジャーバンド", k) Then
       Set sr = ch.SeriesCollection.NewSeries
       sr.ChartType = xlLine
       sr.Values = 配列加算(単純移動平均配列, 標準偏差配列, s)
       sr.Name = s & "σ"
       色 = sr.Border.Color

       Set sr = ch.SeriesCollection.NewSeries
       sr.ChartType = xlLine
       sr.Values = 配列加算(単純移動平均配列, 標準偏差配列, -s)
       sr.Name = -s & "σ"
     sr.Border.Color = 色
   End If
   s = s + 1
   k = k + 1
Next i

End Sub


単純移動平均配列と標準偏差配列を算出します。
単純移動平均線を1本表示します。
単純移動平均線±標準偏差配列×倍率 で必要なだけの折線を表示をします。

(3-2) 配列加算

Private Function 配列加算(a, b, 倍率)

n = UBound(a)
ReDim c(1 To n, 1 To 1)

For i = 1 To n
   c(i, 1) = a(i, 1) + 倍率 * b(i, 1)
Next i

配列加算 = c

End Function


入力引数 aとbは配列です
出力は a+b×倍率 の配列です

(4) プロパティシートの設定



B9セルをTRUE にするとボリンジャーバンドを表示します。FALSE で非表示です
C9セルは周期です
D9セルを TRUE でを表示。FALSE で非表示です
E9セルを TRUE でを表示。FALSE で非表示です
F9セルを TRUE でを表示。FALSE で非表示です
G9セルを TRUE でを表示。FALSE で非表示です
H9セルを TRUE でを表示。FALSE で非表示です


エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 02:32 | この記事のURL
2013年08月01日
第14回 月足チャート




MT4からデータを取得して月足チャートを表示します。
日足や週足と同様です。

(1) MT4のカスタムインディケータ

月足用に下記のカスタムインディケータ MNCSV28 を作ります。

//*******************************************************************
//
// MNCSV28
//
// CopyRight 2013 VBAFAN.
//
//*******************************************************************
#property indicator_chart_window
//---- input parameters
extern int OutputBars = 1000;

int timecounter=0;

//*******************************************************************
// init
//*******************************************************************
int init()
{
     quote_write();
     return(0);
}

//*******************************************************************
// start
//*******************************************************************
int start()
{
     if (Minute()==timecounter) return(0);
     timecounter=Minute();
     quote_write();
     return(0);
}

//*******************************************************************
// quote_write
//*******************************************************************
int quote_write()
{
     datetime dt;
     bool flag;
     string str;

     Comment("start");

     dt=outputCSV("USDJPY");
     flag=true;

     if (outputCSV("EURJPY")!=dt) flag=false;
     if (outputCSV("GBPJPY")!=dt) flag=false;
     if (outputCSV("AUDJPY")!=dt) flag=false;
     if (outputCSV("NZDJPY")!=dt) flag=false;
     if (outputCSV("CHFJPY")!=dt) flag=false;
     if (outputCSV("CADJPY")!=dt) flag=false;

     if (outputCSV("EURUSD")!=dt) flag=false;
     if (outputCSV("GBPUSD")!=dt) flag=false;
     if (outputCSV("AUDUSD")!=dt) flag=false;
     if (outputCSV("NZDUSD")!=dt) flag=false;
     if (outputCSV("USDCHF")!=dt) flag=false;
     if (outputCSV("USDCAD")!=dt) flag=false;

     if (outputCSV("EURGBP")!=dt) flag=false;
     if (outputCSV("EURAUD")!=dt) flag=false;
     if (outputCSV("EURNZD")!=dt) flag=false;
     if (outputCSV("EURCHF")!=dt) flag=false;
     if (outputCSV("EURCAD")!=dt) flag=false;

     if (outputCSV("GBPAUD")!=dt) flag=false;
     if (outputCSV("GBPNZD")!=dt) flag=false;
     if (outputCSV("GBPCHF")!=dt) flag=false;
     if (outputCSV("GBPCAD")!=dt) flag=false;

     if (outputCSV("AUDNZD")!=dt) flag=false;
     if (outputCSV("AUDCHF")!=dt) flag=false;
     if (outputCSV("AUDCAD")!=dt) flag=false;

     if (outputCSV("NZDCHF")!=dt) flag=false;
     if (outputCSV("NZDCAD")!=dt) flag=false;

     if (outputCSV("CADCHF")!=dt) flag=false;

     str=TimeToStr(dt,TIME_DATE)+" "+TimeToStr(dt,TIME_MINUTES)+" finished";
     if (flag) str=str+" All updated";

     Comment(str);
     Print(str);

     return(0);
}

//*******************************************************************
// outputCSV
//*******************************************************************
datetime outputCSV(string symbol)
{
     int handle;
     bool ret;

     handle=FileOpen(symbol+PERIOD_MN1+".csv",FILE_CSV|FILE_WRITE,',');
     if(handle<1) return(0);

     for(int i=0;i < OutputBars;i++)
     {
       ret = FileWrite(handle,
       TimeToStr(iTime(symbol,PERIOD_MN1,i),TIME_DATE),
       TimeToStr(iTime(symbol,PERIOD_MN1,i),TIME_MINUTES),
       iOpen(symbol,PERIOD_MN1,i),
       iHigh(symbol,PERIOD_MN1,i),
       iLow(symbol,PERIOD_MN1,i),
       iClose(symbol,PERIOD_MN1,i),
       iVolume(symbol,PERIOD_MN1,i) );

       if(ret<1) return(0);
     }

     FileClose(handle);

     return(iTime(symbol,PERIOD_MN1,0));
}



MT4から月足のCSVファイル取得するインディケータです。取得する通貨ペアは主要通貨ペア28種類です。上記のコードをコピーしてMT4フォルダ下の experts フォルダの indicators フォルダにファイル名 MNCSV28.mq4 で保存して下さい。

(2) カスタムインディケータのコンパイル

MT4のツールメニューのメタエディターをクリックするとメタエディターが起動します。
file メニューから MNCSV28.mq4 open して下さい。



メニューの compile ボタンをクリックして下さい。
0 error(s),0 warning(s) と表示されればOKです。

terminal ボタンを押すとメタエディターが終了します。
コンパイル後の実行可能ファイル名は MNCSV28.ex4 になります。ソースファイルと同じフォルダに作成されます。

(3) チャートへカスタムインディケータを貼り付ける

コンパイルが完了するとナビゲーターカスタムインディケータMNCSV28 が表示されます。いずれか1つのチャートにドラッグして貼り付けて下さい。月足チャートでなくともかまいません。   
以上でMT4の準備作業は終了です。


(4) プロパティシートの設定




B2セルの足種類を月足にして下さい

(5) MT4を起動します


(6) MT4の画面でCSVファイル取得完了のメッセージが表示されるのを待ちます



MNCSV28 ... initialized  の次に
MNCSV28 ... finished All updated が表示されればOKです。

MT4のカスタムインディケータをセットしたチャートにも finished All updated が表示されます。カスタムインディケータはどれか1つのチャートにセットすれば必要な通貨ペアのCSVをすべてを取得することができます。

(7) エクセルでデータ更新ボタンを押します


A3セルのデータ更新ボタンを押すとデータの取込を行い、月足チャートを表示します。


エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 18:26 | この記事のURL
2013年08月01日
第13回 週足チャート
MT4からデータを取得して週足チャートを表示します。

(1) MT4のカスタムインディケータ

週足用に下記のカスタムインディケータ WCSV28 を作ります。

//*******************************************************************
//
// WCSV28
//
// CopyRight 2013 VBAFAN.
//
//*******************************************************************
#property indicator_chart_window
//---- input parameters
extern int OutputBars = 1000;

int timecounter=0;

//*******************************************************************
// init
//*******************************************************************
int init()
{
     quote_write();
     return(0);
}

//*******************************************************************
// start
//*******************************************************************
int start()
{
     if (Minute()==timecounter) return(0);
     timecounter=Minute();
     quote_write();
     return(0);
}

//*******************************************************************
// quote_write
//*******************************************************************
int quote_write()
{
     datetime dt;
     bool flag;
     string str;

     Comment("start");

     dt=outputCSV("USDJPY");
     flag=true;

     if (outputCSV("EURJPY")!=dt) flag=false;
     if (outputCSV("GBPJPY")!=dt) flag=false;
     if (outputCSV("AUDJPY")!=dt) flag=false;
     if (outputCSV("NZDJPY")!=dt) flag=false;
     if (outputCSV("CHFJPY")!=dt) flag=false;
     if (outputCSV("CADJPY")!=dt) flag=false;

     if (outputCSV("EURUSD")!=dt) flag=false;
     if (outputCSV("GBPUSD")!=dt) flag=false;
     if (outputCSV("AUDUSD")!=dt) flag=false;
     if (outputCSV("NZDUSD")!=dt) flag=false;
     if (outputCSV("USDCHF")!=dt) flag=false;
     if (outputCSV("USDCAD")!=dt) flag=false;

     if (outputCSV("EURGBP")!=dt) flag=false;
     if (outputCSV("EURAUD")!=dt) flag=false;
     if (outputCSV("EURNZD")!=dt) flag=false;
     if (outputCSV("EURCHF")!=dt) flag=false;
     if (outputCSV("EURCAD")!=dt) flag=false;

     if (outputCSV("GBPAUD")!=dt) flag=false;
     if (outputCSV("GBPNZD")!=dt) flag=false;
     if (outputCSV("GBPCHF")!=dt) flag=false;
     if (outputCSV("GBPCAD")!=dt) flag=false;

     if (outputCSV("AUDNZD")!=dt) flag=false;
     if (outputCSV("AUDCHF")!=dt) flag=false;
     if (outputCSV("AUDCAD")!=dt) flag=false;

     if (outputCSV("NZDCHF")!=dt) flag=false;
     if (outputCSV("NZDCAD")!=dt) flag=false;

     if (outputCSV("CADCHF")!=dt) flag=false;

     str=TimeToStr(dt,TIME_DATE)+" "+TimeToStr(dt,TIME_MINUTES)+" finished";
     if (flag) str=str+" All updated";

     Comment(str);
     Print(str);

     return(0);
}

//*******************************************************************
// outputCSV
//*******************************************************************
datetime outputCSV(string symbol)
{
     int handle;
     bool ret;

     handle=FileOpen(symbol+PERIOD_W1+".csv",FILE_CSV|FILE_WRITE,',');
     if(handle<1) return(0);

     for(int i=0;i < OutputBars;i++)
     {
       ret = FileWrite(handle,
       TimeToStr(iTime(symbol,PERIOD_W1,i),TIME_DATE),
       TimeToStr(iTime(symbol,PERIOD_W1,i),TIME_MINUTES),
       iOpen(symbol,PERIOD_W1,i),
       iHigh(symbol,PERIOD_W1,i),
       iLow(symbol,PERIOD_W1,i),
       iClose(symbol,PERIOD_W1,i),
       iVolume(symbol,PERIOD_W1,i) );

       if(ret<1) return(0);
     }

     FileClose(handle);

     return(iTime(symbol,PERIOD_W1,0));
}



MT4から週足のCSVファイル取得するインディケータです。取得する通貨ペアは主要通貨ペア28種類です。上記のコードをコピーしてMT4フォルダ下の experts フォルダの indicators フォルダにファイル名 WCSV28.mq4 で保存して下さい。

(2) カスタムインディケータのコンパイル

MT4のツールメニューのメタエディターをクリックするとメタエディターが起動します。
file メニューから WCSV28.mq4 open して下さい。


メニューの compile ボタンをクリックして下さい。
0 error(s),0 warning(s) と表示されればOKです。

terminal ボタンを押すとメタエディターが終了します。
コンパイル後の実行可能ファイル名は WCSV28.ex4 になります。ソースファイルと同じフォルダに作成されます。

(3) チャートへカスタムインディケータを貼り付ける



コンパイルが完了するとナビゲーターカスタムインディケータWCSV28 が表示されます。いずれか1つのチャートにドラッグして貼り付けて下さい。週足チャートでなくともかまいません。   
以上でMT4の準備作業は終了です。


(4) プロパティシートの設定




B2セルの足種類を週足にして下さい

(5) MT4を起動します


(6) MT4の画面でCSVファイル取得完了のメッセージが表示されるのを待ちます



WCSV28 ... initialized  の次に
WCSV28 ... finished All updated が表示されればOKです。

MT4のカスタムインディケータをセットしたチャートにも finished All updated が表示されます。カスタムインディケータはどれか1つのチャートにセットすれば必要な通貨ペアのCSVをすべてを取得することができます。

(7) エクセルでデータ更新ボタンを押します



A3セルのデータ更新ボタンを押すとデータの取込を行い、週足チャートを表示します。


エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 17:53 | この記事のURL
2013年08月01日
第12回 一目均衡表


(1) 一目均衡表の計算式

転換線=9日間の中間値
基準線=26日間の中間値
先行スパン1=(転換値+基準値)÷2を25日先にシフト
先行スパン2 =52日間の中間値を25日先にシフト
遅行スパン=終値を25日前にシフト

雲=先行スパン1と先行スパン2で囲まれた領域
中間値=(その期間の最高値+その期間の最安値)÷2
「25日先にシフト」は「当日を含めて26日先にシフト」と同じ意味
「25日前にシフト」は「当日を含めて26日前にシフト」と同じ意味

(2) 画像をシフト

Private Sub シフトして余白期間作成(ch, シフト期間)

For Each sr In ch.SeriesCollection
  v = sr.Values
  n = UBound(v)
  For i = 1 To n - シフト期間
    v(i) = v(i + シフト期間)
    If sr.HasDataLabels Then sr.DataLabels(i).Text = sr.DataLabels(i + シフト期間).Text
  Next i
  For i = i To n
    v(i) = Empty
    If sr.HasDataLabels Then sr.DataLabels(i).Text = ""
  Next i
  sr.Values = v
Next sr

v = ch.Axes(xlCategory).CategoryNames
n = UBound(v)
For i = 1 To n - シフト期間
  v(i) = v(i + シフト期間)
Next i
For i = i To n
  v(i) = ""
Next i
ch.Axes(xlCategory).CategoryNames = v

End Sub


一目均衡表は25日先までのグラフを表示するので既に描画したローソク足やX軸等を25日分、左にシフトします。空白になる25日分の series オブジェクトの values の各要素には Empty をセットします。

(3) 雲の描画

Sub 雲描画(ch, 先行スパン1配列, 先行スパン2配列)

n = UBound(先行スパン1配列)
ReDim 差分配列(1 To n, 1 To 1)

For i = 1 To n
   差分配列(i, 1) = 先行スパン1配列(i, 1) - 先行スパン2配列(i, 1)
Next i

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlAreaStacked
sr.Values = 先行スパン2配列
sr.Name = "先行スパン2-2"
sr.Format.Fill.Visible = False

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlAreaStacked
sr.Values = 差分配列
sr.Name = "雲"
sr.Format.Fill.ForeColor.RGB = RGB(192, 192, 192)

End Sub


積み上げ面グラフを使って雲を表示します。

先行スパン1配列から先行スパン2配列を引いた差分配列を作ります。プラスの数値とマイナスの数値が混在していますが、そのまま使えます。

最初に先行スパン2配列をChartType = xlAreaStacked で表示します。Format.Fill.Visible = False で先行スパン2の領域を非表示にします。
次に差分配列をChartType = xlAreaStacked で表示します。先行スパン2の上に「先行スパン1と先行スパン2の差分」が積み上がったグラフが作成されますが、土台のグラフである先行スパン2を非表示にしたため雲の部分のみが表示されます。

(4) 一目均衡表の計算

(4-1) メーンルーチン

Private Sub 一目均衡表算出(データ配列, 実表示本数, シフト期間, 転換線配列, 基準線配列, 先行スパン1配列, 先行スパン2配列, 遅行スパン配列)

終了行 = UBound(データ配列, 1)

ReDim 転換線配列(1 To 実表示本数, 1 To 1)
ReDim 基準線配列(1 To 実表示本数, 1 To 1)
ReDim 先行スパン1配列(1 To 実表示本数, 1 To 1)
ReDim 先行スパン2配列(1 To 実表示本数, 1 To 1)
ReDim 遅行スパン配列(1 To 実表示本数, 1 To 1)

開始行 = 終了行 - 実表示本数 + 1
開始行 = 開始行 + シフト期間

j = 1
For i = 開始行 To 終了行
   転換線配列(j, 1) = 期間中間値算出(データ配列, 転換線期間, i)
   基準線配列(j, 1) = 期間中間値算出(データ配列, 基準線期間, i)
   j = j + 1
Next i

j = 1
For i = 開始行 - 先行期間 + 1 To 終了行
   先行スパン1配列(j, 1) = (期間中間値算出(データ配列, 転換線期間, i) + 期間中間値算出(データ配列, 基準線期間, i)) / 2
   先行スパン2配列(j, 1) = 期間中間値算出(データ配列, 先行スパン2期間, i)
   j = j + 1
Next i

j = 1
For i = 開始行 + 遅行期間 - 1 To 終了行
   遅行スパン配列(j, 1) = データ配列(i, データの終値)
   j = j + 1
Next i

End Sub


(4-2) 中間値の計算

Private Function 期間中間値算出(データ配列, 周期, 終了行)

期間 = 周期
開始行 = 終了行 - 期間 + 1
If 開始行 < 1 Then 開始行 = 1

高値 = データ配列(終了行, データの高値)
安値 = データ配列(終了行, データの安値)

For i = 開始行 To 終了行 - 1
If 高値 < データ配列(i, データの高値) Then 高値 = データ配列(i, データの高値)
If 安値 > データ配列(i, データの安値) Then 安値 = データ配列(i, データの安値)
Next i

期間中間値算出 = (高値 + 安値) / 2

End Function


(5) 一目均衡表の表示

Sub 一目均衡表表示(ch, データ配列, 実表示本数)

シフトして余白期間作成 ch, 先行期間 - 1

一目均衡表算出 データ配列, 実表示本数, 先行期間 - 1, 転換線配列, 基準線配列, 先行スパン1配列, 先行スパン2配列, 遅行スパン配列

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 転換線配列
sr.Name = "転換線"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 基準線配列
sr.Name = "基準線"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 先行スパン1配列
sr.Name = "先行スパン1"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 先行スパン2配列
sr.Name = "先行スパン2"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 遅行スパン配列
sr.Name = "遅行スパン"

雲描画 ch, 先行スパン1配列, 先行スパン2配列

End Sub


(6) プロパティシートの設定



B8セルをTRUEにすると一目均衡表が表示されます。



エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 13:10 | この記事のURL
2013年07月30日
第11回 出来高加重移動平均線




MT4から出来高も取得できるので出来高加重移動平均線を表示してみます。

(1) 出来高加重移動平均線の計算式

本日の出来高加重移動平均=分子÷分母
分子=本日の終値×本日の出来高+前日の終値×前日の出来高+ ... +n日前の終値×n日前の出来高
分母=本日の出来高+前日の出来高+ ... +n日前の出来高

(2) 出来高加重移動平均線の計算

Private Function 出来高加重移動平均線算出(終値配列, 出来高配列, 周期, 実表示本数)

n = UBound(終値配列)
ReDim a(1 To 実表示本数, 1 To 1)

j = 1
For i = n - 実表示本数 + 1 To n
  開始行 = i - 周期 + 1
  終了行 = i
  If 開始行 < 1 Then 開始行 = 1

  合計 = 0
  出来高合計 = 0
  For k = 開始行 To 終了行
   合計 = 合計 + 終値配列(k, 1) * 出来高配列(k, 1)
   出来高合計 = 出来高合計 + 出来高配列(k, 1)
  Next k

  If 出来高合計 > 0 Then a(j, 1) = 合計 / 出来高合計
  j = j + 1
Next i

出来高加重移動平均線算出 = a

End Function


出来高移動平均線算出の関数です。
入力引数は終値配列、出来高配列、周期、 実表示本数です。
終値配列と出来高配列は元データ400本をそのまま渡します。これは画面に表示されないデータも計算対象になるからです。
周期は何本の平均をとるかの指定です。21とか13等の数値です。プロパティシートで設定します。
実表示本数は画面に表示する本数です。データが400本あってもすべて表示するわけではないので100とか200とかの数値です。プロパティシートで設定します。

出力は出来高加重移動平均配列です。

(3) 出来高加重移動平均線の表示
(4) 複数の出来高加重移動平均線の表示
(5) Y軸の設定

単純移動平均線と同様です。 こちら をご参照下さい。

(6) プロパティシート




出来高加重移動平均線のB列をTRUEにしてC列以降に周期を入力して下さい。何本でも出来高加重移動平均線を表示することができます。
使用方法は単純移動平均線と同様です。 こちら をご参照下さい。



エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 22:13 | この記事のURL
2013年07月27日
第10回 MT4からCSVファイルの取込




(1) CSVファイルの読込み

Workbooks.OpenText Filename:=パス名, DataType:=xlDelimited, Comma:=True
Set wb = Workbooks(ファイル名)


CSVファイルはテキストファイルなので Workbooks オブジェクトに OpenText を行うことにより Workbook オブジェクトを作成します。これで読込むことができました。
カンマ区切りファイルなので DataType:=xlDelimited, Comma:=True を指定します。

パス名とファイル名の例を挙げると下記のとおりです。
パス名 c:¥Program Files¥MetaTrader 4¥experts¥files¥USDJPY1440.csv
ファイル名 USDJPY1440.csv

(2) ワークシートに転記

Set wss = wb.Worksheets(1)

n = 最終行取得(wss)
If n = 0 Then wb.Close: Exit Function

Set wsd = ThisWorkbook.Worksheets(通貨ペア)
wsd.Cells.Clear

Set コピー元 = wss.Range(wss.Cells(1, 1), wss.Cells(n, データの出来高 + 1))
Set コピー先 = wsd.Range(wsd.Cells(2, 1), wsd.Cells(n + 1, データの出来高 + 1))
コピー先.Value = コピー元.Value


日付、時間、始値、高値、安値、終値、出来高の7項目をコピー元のワークブックから目的のワークシートに転記します。

(3) CSVファイルのクローズ

wb.Close
Set wb = Nothing


転記が終わったので CSVファイルをクローズし、 Workbook オブジェクトを解放します。

(4) データの成型

(4-1) B列(時間列)を削除

wsd.Columns(2).Delete

(4-2) 1行目(見出行)をセット

wsd.Cells(1, データの日時) = "日時"
wsd.Cells(1, データの始値) = "始値"
wsd.Cells(1, データの高値) = "高値"
wsd.Cells(1, データの安値) = "安値"
wsd.Cells(1, データの終値) = "終値"
wsd.Cells(1, データの出来高) = "出来高"


(4-3) MT4の日付をエクセルのDate形式に変換

Set 日時範囲 = wsd.Range(wsd.Cells(2, データの日時), wsd.Cells(n + 1, データの日時))
日時配列 = 日時範囲.Value
日付形式変換 日時配列
日時範囲.Value = 日時配列


処理の高速化のため日付を配列にして形式変換を行っています。
日付形式変換ルーチンは下記のとおりです。

Private Sub 日付形式変換(日時配列)
n = UBound(日時配列, 1)
For i = 1 To n
   年月日 = 日時配列(i, 1)
   年 = Left(年月日, 4)
   月 = Mid(年月日, 6, 2)
   日 = Right(年月日, 2)
   日時配列(i, 1) = DateSerial(年, 月, 日)
Next i
End Sub


CSVファイルの日付は 2013.07.25 の形式で記録されています。これは文字列形式なのでエクセルは日付として認識しません。 DateSerial 関数を使用して Date 形式 に変換しています。これでエクセルが日付として認識できるようになります。

(4-4) 日付の昇順にソート

Set データ範囲 = wsd.Range(wsd.Cells(2, データの日時), wsd.Cells(n + 1, データの出来高))
データ範囲.Sort key1:=wsd.Cells(2, データの日時)


日時をキーにして range オブジェクトに sort を行っています。


(5) プロパティシートの設定



MT4フォルダ名にMT4のセットアップされているフォルダ名を入力して下さい。



エクセルファイルです。

    ダウンロード


前へ   次へ

Posted by vbafan at 08:50 | この記事のURL
2013年07月27日
第9回 MQL4について





前回 MT4 のカスタムインデイケータ DCSV28 について書きましたが、これはMQL4 (MetaQuotes Language 4) というプログラム言語で記述されています。C言語に似た言語です。今回は DCSV28 についてMQL4も含めて説明してみたいと思います。

(1) グローバル変数 

extern int OutputBars = 1000;
int timecounter=0;


OutputBars は出力本数です。
extern 文でプログラムの外部パラメータを指定します。プログラムを変更せずに実行時に出力本数を変更することができます。

extern 文を付けないとモジュール内のグローバル変数になります。

(2) init 関数

int init()
{
     quote_write();
     return(0);
}


init 関数は予約語の関数です。起動時に1度だけMT4から呼ばれます。
quote_writeでCSVファイルへの書込みを行っています。  

(3) start関数

int start()
{
     if (Minute()==timecounter) return(0);
     timecounter=Minute();
     quote_write();
     return(0);
}


start 関数は予約語の関数です。データに変化があるつどMT4から呼ばれます。DCSV28を例えばUSDJPYのチャートに貼り付けたとするとUSDJPYの価格が変化するつどMT4から呼ばれます。quote_write 関数でCSVファイルへの書込みを行いますが、価格変化のつどでは頻繁すぎるので1分間に1度quote_write を呼び出しています。
なお、init 関数で1度書込みを行えば十分だと思われますが、それではデータ漏れが起こってしまいます。書込みデータをMT4が受信するまである程度時間がかかるのでこのような処理を行っています。

(4) quote_write 関数

int quote_write()
{
     datetime dt;
     bool flag;
     string str;

     Comment("start");

     dt=outputCSV("USDJPY");
     flag=true;

     if (outputCSV("EURJPY")!=dt) flag=false;
     if (outputCSV("GBPJPY")!=dt) flag=false;
       ...
       ...
       ...

     str=TimeToStr(dt,TIME_DATE)+" "+TimeToStr(dt,TIME_MINUTES)+" finished";
     if (flag) str=str+" All updated";

     Comment(str);
     Print(str);

     return(0);
}


quote_write はユーザー定義の関数です。CSVファイルへの書込みを行います。
主要28通貨ペアの書込みをquote_write 関数で行っています。quote_write 関数を修正することにより、不要な通貨ペアの書込みを削することもできますし、新しい通貨ペアの書込みを追加することもできます。

Comment 関数はMT4の関数でチャートの左上に文字列を表示します。
Print 関数はMT4の関数でコンソールログを表示します。
表示している内容は書込みが完了した時の All updated という表示です。
すべての通貨ペアの最新日付データが一致した時に書込み完了と判断しています。

(5) outputCSV関数

datetime outputCSV(string symbol)
{
     int handle;
     bool ret;

     handle=FileOpen(symbol+PERIOD_D1+".csv",FILE_CSV|FILE_WRITE,',');
     if(handle<1) return(0);

     for(int i=0;i < OutputBars;i++)
     {
       ret = FileWrite(handle,
                     TimeToStr(iTime(symbol,PERIOD_D1,i),TIME_DATE),
                     TimeToStr(iTime(symbol,PERIOD_D1,i),TIME_MINUTES),
                     iOpen(symbol,PERIOD_D1,i),
                     iHigh(symbol,PERIOD_D1,i),
                     iLow(symbol,PERIOD_D1,i),
                     iClose(symbol,PERIOD_D1,i),
                     iVolume(symbol,PERIOD_D1,i) );

       if(ret<1) return(0);
     }

     FileClose(handle);

     return(iTime(symbol,PERIOD_D1,0));
}


outputCSV 関数の入力引数はUSDJPY等の通貨ペアです。
outputCSV 関数の戻り値は書込みをした最新の日時です。
outputCSV 関数は通貨ペアを与えられて1000本のレコードをファイルに書込みます。ファイル名は例えばUSDJPYならばUSDJPY1440.csv になります。1440は1日を分であらわすと1440分になるからです。出力フォルダはMT4の場合は固定で experts フォルダの files フォルダになります。

この関数で使用しているMT4の価格に関する関数は下記のとおりです。
iTime 日時を返します。
iOpen 始値を返します。
iHigh 高値を返します。
iLow 終値を返します。
iClose 終値を返します。
iVolume 出来高を返します。
例えば終値であれば iClose (通貨ペア, 周期, シフト値) という形式です。シフト値はゼロから始まる整数でゼロが最新で数が大きくなるほど過去に遡ります。つまり何本前の価格かをシフト値で指定します。

この関数で使用しているMT4のファイルに関する関数は下記のとおりです。
FileOpenFileWriteFileClose

この関数で使用しているMT4の予約語は下記のとおりです。
PERIOD_D1 1日の期間をあらわします。具体的な数値は1440です。

MQL4 のホームページは ここです


エクセルファイルです。

    ダウンロード


前へ   次へ

Posted by vbafan at 03:08 | この記事のURL
2013年07月26日
第8回 MT4にカスタムインディケータをセットする




今回の記事は 前回 の続きです。MT4にセットするカスタムインディケータについて書きます。

(1) MT4にセットするカスタムインディケータ

//*******************************************************************
//
// DCSV28
//
// CopyRight 2013 VBAファン.
//
//*******************************************************************
#property indicator_chart_window
//---- input parameters
extern int OutputBars = 1000;

int timecounter=0;

//*******************************************************************
// init
//*******************************************************************
int init()
{
     quote_write();
     return(0);
}

//*******************************************************************
// start
//*******************************************************************
int start()
{
     if (Minute()==timecounter) return(0);
     timecounter=Minute();
     quote_write();
     return(0);
}

//*******************************************************************
// quote_write
//*******************************************************************
int quote_write()
{
     datetime dt;
     bool flag;
     string str;

     Comment("start");

     dt=outputCSV("USDJPY");
     flag=true;

     if (outputCSV("EURJPY")!=dt) flag=false;
     if (outputCSV("GBPJPY")!=dt) flag=false;
     if (outputCSV("AUDJPY")!=dt) flag=false;
     if (outputCSV("NZDJPY")!=dt) flag=false;
     if (outputCSV("CHFJPY")!=dt) flag=false;
     if (outputCSV("CADJPY")!=dt) flag=false;

     if (outputCSV("EURUSD")!=dt) flag=false;
     if (outputCSV("GBPUSD")!=dt) flag=false;
     if (outputCSV("AUDUSD")!=dt) flag=false;
     if (outputCSV("NZDUSD")!=dt) flag=false;
     if (outputCSV("USDCHF")!=dt) flag=false;
     if (outputCSV("USDCAD")!=dt) flag=false;

     if (outputCSV("EURGBP")!=dt) flag=false;
     if (outputCSV("EURAUD")!=dt) flag=false;
     if (outputCSV("EURNZD")!=dt) flag=false;
     if (outputCSV("EURCHF")!=dt) flag=false;
     if (outputCSV("EURCAD")!=dt) flag=false;

     if (outputCSV("GBPAUD")!=dt) flag=false;
     if (outputCSV("GBPNZD")!=dt) flag=false;
     if (outputCSV("GBPCHF")!=dt) flag=false;
     if (outputCSV("GBPCAD")!=dt) flag=false;

     if (outputCSV("AUDNZD")!=dt) flag=false;
     if (outputCSV("AUDCHF")!=dt) flag=false;
     if (outputCSV("AUDCAD")!=dt) flag=false;

     if (outputCSV("NZDCHF")!=dt) flag=false;
     if (outputCSV("NZDCAD")!=dt) flag=false;

     if (outputCSV("CADCHF")!=dt) flag=false;

     str=TimeToStr(dt,TIME_DATE)+" "+TimeToStr(dt,TIME_MINUTES)+" finished";
     if (flag) str=str+" All updated";

     Comment(str);
     Print(str);

     return(0);
}

//*******************************************************************
// outputCSV
//*******************************************************************
datetime outputCSV(string symbol)
{
     int handle;
     bool ret;

     handle=FileOpen(symbol+PERIOD_D1+".csv",FILE_CSV|FILE_WRITE,',');
     if(handle<1) return(0);

     for(int i=0;i < OutputBars;i++)
     {
       ret = FileWrite(handle,
       TimeToStr(iTime(symbol,PERIOD_D1,i),TIME_DATE),
       TimeToStr(iTime(symbol,PERIOD_D1,i),TIME_MINUTES),
       iOpen(symbol,PERIOD_D1,i),
       iHigh(symbol,PERIOD_D1,i),
       iLow(symbol,PERIOD_D1,i),
       iClose(symbol,PERIOD_D1,i),
       iVolume(symbol,PERIOD_D1,i) );

       if(ret<1) return(0);
     }

     FileClose(handle);

     return(iTime(symbol,PERIOD_D1,0));
}

MT4から日足のCSVファイル取得するインディケータです。1000本取得します。取得する通貨ペアは主要通貨ペア28種類です。上記のコードをコピーしてMT4の experts フォルダの indicators フォルダにファイル名 DCSV28.mq4 で落として下さい。

(2) カスタムインディケータのコンパイル

MT4のツールメニューのメタエディターをクリックするとメタエディターが起動します。
file メニューから DCSV28.mq4 open して下さい。


メニューの compile ボタンをクリックして下さい。
0 error(s),0 warning(s) と表示されればOKです。

terminal ボタンを押すとメタエディターが終了します。
コンパイル後の実行可能ファイル名は DCSV28.ex4 になります。ソースファイルと同じフォルダに作成されます。

(2) チャートへカスタムインディケータを貼り付ける



コンパイルが完了するとナビゲーターカスタムインディケータDCSV28 が表示されます。いずれか1つのチャートにドラッグして貼り付けて下さい。日足チャートでなくともかまいません。   

以上でMT4の準備作業は終了です。



エクセルファイルです。

    ダウンロード


前へ   次へ

Posted by vbafan at 20:41 | この記事のURL
2013年07月26日
第7回 MT4からデータ取得
今回はFXデータの取得について書いてみたいと思います。ボタンを1回クリックするだけで必要なデータを取得できるようにしようと思います。MT4(MetaTrader 4)を使用します。MT4のカスタムインディケータを使用して必要な通貨ペアのCSVファイルを取得します。手順は下記のとおりです。

(1) MT4を起動します


(2) MT4の画面でCSVファイル取得完了のメッセージが表示されるのを待ちます



DCSV28 ... initialized  の次に
DCSV28 ... finished All updated が表示されればOKです。



MT4のカスタムインディケータをセットしたチャートにも finished All updated が表示されます。カスタムインディケータはどれか1つのチャートにセットすれば必要な通貨ペアのCSVをすべてを取得することができます。

(3) エクセルでデータ更新ボタンを押します



A3セルのデータ更新ボタンを押すとデータの取込を行います。


(4) MT4の準備
MT4にカスタムインディケータをセットアップするのが準備作業です。これについては 次回 ご説明します。

エクセルファイルです。

    ダウンロード


前へ   次へ

Posted by vbafan at 18:33 | この記事のURL
<< 前へ >> 次へ

×

この広告は30日以上新しい記事の更新がないブログに表示されております。