|
広告
この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
第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
第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 で 1σ を表示。FALSE で非表示です E9セルを TRUE で 2σ を表示。FALSE で非表示です F9セルを TRUE で 3σ を表示。FALSE で非表示です G9セルを TRUE で 4σ を表示。FALSE で非表示です H9セルを TRUE で 5σ を表示。FALSE で非表示です エクセルファイルです。    ダウンロード前へ    次へ
Posted by vbafan at 02:32
| この記事のURL
第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
第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
第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
第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
第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 SubCSVファイルの日付は 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
第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のファイルに関する関数は下記のとおりです。 FileOpen、 FileWrite、 FileCloseこの関数で使用しているMT4の予約語は下記のとおりです。 PERIOD_D1 1日の期間をあらわします。具体的な数値は1440です。 MQL4 のホームページは ここです。 エクセルファイルです。    ダウンロード前へ    次へ
Posted by vbafan at 03:08
| この記事のURL
第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
第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
|