エクセルVBAの 活 用 ; 分 布 測 定 アメンボです これから 擬 似 トレード 用 の 少 しマシな EA を 検 討 するのですが 急 がば 回 れで チョット 道 草 をします これから EA を 検 討 する 上 で 様 々なデータ 分 布 を 測 定 する 必 要 があります MT4(MQL4)は 元 々 エクセルとの 連 携 を 考 慮 して 作 られていますが アメンボ 流 の 解 析 のためには 物 足 りない 部 分 がありますので 少 しづつですがエクセル 用 のツールを 準 備 することにしました アメンボは データを 統 計 解 析 するツールとしてエクセルをよく 使 います そこで 今 回 は MT4 の 生 データから 分 布 図 を 作 成 するエクセルVBA(マクロ)を 提 案 することにしました ( 実 際 にアメンボが 今 使 っているツールです) 大 体 自 身 で 基 礎 データを 収 集 分 析 せずに ストップロスを 決 めたり いきなりEAの アルゴリズムを 検 討 してバックテストをするのは 手 順 が 間 違 っていると 思 いませんか? 色 々な 記 事 を 読 むにつけ アメンボが 抱 く 感 想 です 本 稿 で 解 説 に 使 用 する 下 記 資 料 は ダウンロード 用 に WEB 上 にUPしています 1MT4 からデータをテキストファルに 書 出 す ; my_distribution_03.mq4 2 分 布 作 成 用 エクセルVBA(マクロ) ; distribution_vbs.xls 3データを 書 出 したファイル 例 ; mytext.txt 2と3 を 同 じフォルダに 入 れて マクロを 動 作 させると 分 布 図 を 自 動 生 成 します (エクセルは 2003 版 です 未 確 認 ですが 2010 版 等 でもそのまま 使 えるはずです) ----------------------------------------------------------------------------------- 目 次 : 1. 分 布 図 作 成 の 手 順 2 頁 (1) 手 順 概 要 (2) 手 順 詳 細 2.コード 内 容 一 覧 8 頁 (1)データ 書 き 出 し<スクリプト> my_distribution_03.mq4 (2) 分 布 図 作 成 エクセルVBA(マクロ) distribution_vbs.xls 1/11
1. 分 布 図 作 成 の 手 順 (1) 手 順 概 要 ; MT4(チャート)からデータを 出 力 し エクセルで 分 布 図 を 作 るまで MT4 チャート テキスト ファイル mytext.txt experts\files\ フォルダ 内 に 作 成 される エクセル シート 分 布 図 MQL4 スクリプト my_distribution_03.mq4 チャートからデータを 取 出 (または 計 算 ) mytext.txt へ 出 力 する スプリプトとして 動 作 させる エクセル VBA(マクロ) Data_histgram() エクセルファイル distribution_vbs.xls に 収 録 済 み mytext.txt からデータを 読 み 取 って Sheet1 上 に 分 布 図 を 作 成 する distribution_vbs.xls と mytext.txt を 適 当 なフォルダにコピーしてから マクロを 動 作 させること テキスト ファイル mytext.txt への 出 力 例 (Open-Close); 0.017 0.01-0.007-0.015 0.007-0.022-0.021-0.022-0.051 0.009-0.019-0.012 0.007 0 0.007 0.008 0.036-0.021 0.002-0.002 0.027-0.006-0.01 0.021 0.018-0.037 0.009-0.001-0.006-0.001-0.002-0.008 0.005 分 布 図 例 (Open-Close); 1 分 足 :Open-Close 分 布 25 20 15 頻 度 10 5 0-0.1-0.09-0.08-0.07-0.06-0.05-0.04-0.03-0.02-0.01 0 0.01 Open-Close 2/11 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 系 列 1
12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 (C) 2011 amenbo the 3rd 分 布 図 例 (ADX); 1 分 足 :ADX 分 布 18 16 14 12 頻 度 10 8 系 列 1 6 4 2 0 0 3 6 9 ADX (2) 手 順 詳 細 -1.MT4 からデータを 書 出 すには 諸 兄 は MT4 と MQL4 には 有 る 程 度 慣 れていると 勝 手 ながら 推 測 しますので スクリプトの 動 作 方 法 についての 説 明 は 割 愛 し 簡 単 な 解 説 注 意 点 のみを 記 載 します my_distribution_03.mq4 はスクリプトですので experts\scripts\ フォルダに 入 れて ください スクリプト my_distribution_03.mq4 を 実 行 すると 1 mytext.txt を 事 前 に 準 備 していなくとも experts\files\ フォルダ 内 に 自 動 的 に 作 成 されます 2また 事 前 に experts\files\ フォルダ 内 に mytext.txt を 作 っておくと その 中 にデータを 書 き 込 みます 繰 り 返 し スクリプト my_distribution_03.mq4 を 実 行 すると mytext.txt 内 容 をクリアしてから 新 しいデータを 書 き 込 みます 3/11
-2.エクセルVBA(マクロ)を 動 作 させるには 初 めにお 断 りしなければならないこととして アメンボは 現 在 エクセル 2003 しか 持 っていないため 解 説 は エクセル 2003 でのものです また 最 新 版 の 2010?での 動 作 を 確 認 していません こと および 最 新 版 でのマクロを 動 作 させる 手 順 を 知 りません ただ 通 常 は 最 新 バージョン 上 で 旧 バージョンのマクロは 動 作 するはずです もしかすると MQL4 ユーザー 各 位 には エクセルのマクロを 知 らない 方 がいるかも しれませんが マクロ の 詳 細 解 説 はご 容 赦 ください 解 説 本 は 山 の 様 にありますこと またネット 上 にも 資 料 が 溢 れていますので 参 照 して 頂 きたく (それに アメンボのマクロの 知 識 は 初 級 以 上 中 級 未 満 ですため) 1 動 作 を 確 認 する 準 備 ; ダウンロードした distribution_vbs.xls と mytext.txt を 同 じフォルダー 中 に 入 れてください (フォルダは 適 当 に 作 ったものでOK) 2エクセルシート distribution_vbs.xls をダブルクリックする; マクロ が 組 み 込 まれているので 警 告 がポップアップします (エクセル 2003 の 場 合 ) [マクロを 有 効 にする]をクリックしてください 4/11
3 Sheet1 が 下 記 の 様 に 開 きます 動 作 が 判 りやすい 様 に 数 値 データは 残 していますが グラフデータのみは 削 除 してあります [ツール]-[マクロ]-[マクロ] と 選 択 します 4 マクロ のリストが 表 示 されます Data_histgram が 選 択 された 状 態 で [ 実 行 ]をクリックします 5/11
5 目 の 前 で マクロが 動 作 し グラフ( 分 布 図 )が 表 示 されます 使 用 上 の 注 意 ; A 列 最 頻 値 = 入 力 上 限 = 0.10 中 央 地 = -0.002 入 力 下 限 = -0.10 平 均 値 = -0.00171 分 割 幅 = 0.01 作 成 す る 入 力 A 題 名 : 1 分 足 :Open-Close 分 布 入 力 縦 ラベル: 頻 度 入 力 横 ラベル: Open-Close 青 文 字 1. 上 限 チャート < 注 意 (1) は すいませんが い 2. 題 名 上 記 の 青 書 部 のセルは 入 力 用 です ( 色 々 触 ると 直 ぐに 理 解 できます) 例 えば 0.10-0.10 1 分 足 :Open-Close 分 布 頻 度 Open-Close は 全 て 手 入 力 したデータで エクセルのグラフ 作 成 に 反 映 されます マクロの 処 理 内 容 を 理 解 するには コードを 観 て 頂 くのが 最 短?の 方 法 です アメンボは 入 出 力 に フォーム は 殆 ど 使 いません エクセルには 入 出 力 兼 用 のセルが 無 数 にありますので 活 用 しない 手 はありません A 列 ; 読 み 込 んだデータ D13~; 階 層 化 E13~; 出 現 頻 度 6/11
マクロの 内 容 を 確 認 するには; <1>[ツール]-[マクロ]-[Visual Basic Editor]で 開 くか <2>[ 表 示 ]-[ツールバー]で Visual Basic にチェックを 入 れて 表 示 させた Visual Basic 専 用 ツールバー 上 の をクリックして 開 きます エクセルシートに 戻 るには <1>[ファイル]-[ 終 了 して Microsoft Excel へ 戻 る] か <2>ツールバー 上 の をクリックします この 状 態 で マクロを 実 行 するには マクロコード 中 にカーソルを 点 滅 させてから をクリックします ( 結 果 を 確 認 するにはエクセルシートに 戻 る 必 要 があります) この 画 面 では マクロコードの 修 正 やデバックを 実 行 できます 詳 細 は 他 の 資 料 ( 参 考 書 WEB)を 参 照 ください 7/11
2.コード 内 容 一 覧 (1)データ 書 き 出 し<スクリプト> 下 記 コード 中 1を 使 うと Open-Close データ 書 き 出 し 2を 使 うと ADX データ 書 き 出 し /// // TXT ファイルへのデータ 書 き 出 し // スクリプト; my_distribution_03.mq4 // // ポイント; 上 書 モード [ FILE_WRITE ] // 追 記 モード [ FILE_READ FILE_WRITE ] // //スタート 関 数 ー------------------------------------------- int start() { //----------- 先 ず ファイルを 一 度 クリアする------------- // 上 書 きモードで 開 いてから 即 閉 じる int handle1; handle1=fileopen("mytext.txt", FILE_CSV FILE_WRITE,","); FileClose(handle1); //---------------------- int handle2; handle2=fileopen("mytext.txt", FILE_CSV FILE_READ FILE_WRITE,","); if(handle2<1) { Print("can't open file error-",getlasterror()); return(-1); } } if(handle2>0) { double ADX0; FileSeek(handle2, 0, SEEK_END); // for(int i=0;i<=100;i++) { /// 1 Open-Close を 出 力 する 場 合 は こちらを 使 う ///FileWrite(handle2,Open[i]-Close[i]); /// 2 ADX データ 出 力 ADX0=iADX(NULL,0,14,PRICE_CLOSE,MODE_MAIN,i); FileWrite(handle2,ADX0); } // FileClose(handle2); } return(0); 8/11
(2) 分 布 図 作 成 エクセルVBA(マクロ) distribution_vbs.xls にマクロとして 組 み 込 まれています マクロの 名 称 は Data_histgram です 'データのヒストグラムを 作 る Sub Data_histgram() '----------------------------------------------------- '(1) 初 期 化 A 列,B 列 を 一 度 削 除 し また 追 加 する( 過 去 のデータをクリア) '<グラフの 削 除 >; 先 ず 初 めに 実 行 しておく 必 要 あり ActiveSheet.ChartObjects.Delete '<A 列 > Columns("A:A").Select Selection.Delete Shift:=xlToLeft Columns("A:A").Select Selection.Insert Shift:=xlToRight '< 階 級 数 と 頻 度 のクリア> Range("D13:G72").Select Selection.Clear ' GoTo End_ 'デバッグ 用 '------------------------------------------------- '(2)データを mytext.txt ファイルから 取 り 込 んで エクセルのセルに 記 入 する ' mytext.txt はエクセルシートと 同 じフォルダに 入 れること Dim mytxtfile As String Dim mybuf(2) As String Dim i As Integer, j As Integer 'mytxtfile = "C:...\myText.txt"' 絶 対 パスで 指 定 する 場 合 mytxtfile = ThisWorkbook.Path & "\" & "mytext.txt" Worksheets("Sheet1").Activate Open mytxtfile For Input As #1 i = 0 Do Until EOF(1) Input #1, mybuf(1) i = i + 1 Cells(i, 1) = mybuf(1) Loop line_suu = i Close #1 '------------------------------------------------- '(3) max,min 値 を 求 め 表 示 する max_min: 9/11
Dim max_ As Double Dim min_ As Double Dim kaikyu_suu As Integer Range("E3") = Application.WorksheetFunction.max(Range(Cells(1, 1), Cells(line_suu, 1))) Range("E4") = Application.WorksheetFunction.min(Range(Cells(1, 1), Cells(line_suu, 1))) Range("E7") = Application.WorksheetFunction.StDevP(Range(Cells(1, 1), Cells(line_suu, 1))) Range("H4") = Application.WorksheetFunction.Median(Range(Cells(1, 1), Cells(line_suu, 1))) Range("H5") = Application.WorksheetFunction.Average(Range(Cells(1, 1), Cells(line_suu, 1))) max_ = Application.WorksheetFunction.max(Range(Cells(1, 1), Cells(line_suu, 1))) min_ = Application.WorksheetFunction.min(Range(Cells(1, 1), Cells(line_suu, 1))) '------------------------------------------------- '(4) 上 限 値 - 下 限 値 を40 分 割 して 分 類 用 の 階 層 を 作 成 する Dim up_1, dw_1, step_1, n_1, ma_1 As Double up_1 = Cells(3, 11).Value ' 上 限 値 の 読 み 込 み dw_1 = Cells(4, 11).Value ' 下 限 値 の 読 み 込 み step_1 = Cells(5, 11).Value ' 分 割 幅 の 読 み 込 み(40 分 割 している) n_1 = 13 For ma_1 = dw_1 To (up_1 + step_1) Step step_1 Cells(n_1, 4) = ma_1 n_1 = n_1 + 1 Next If (Cells(33, 4) < 0.0001) Then Cells(33, 4) = 0 End If '------------------------------------------------- '(5) 各 階 層 の 出 現 頻 度 を 計 算 する Dim ii1, jj1 As Integer For ii1 = 0 To 40 Cells(13 + ii1, 5) = 0 For jj1 = 1 To line_suu If (dw_1 + (step_1 * ii1)) <= Cells(jj1, 1) And Cells(jj1, 1) < (dw_1 + (step_1 * (ii1 + 1))) Then Cells(13 + ii1, 5) = Cells(13 + ii1, 5) + 1 End If Next Next '------------------------------------------------- Next_Step_2: '(6)セルに 記 載 したデータをグラフ 化 する 10/11
'<A 列 > Dim Ch_1 As Object Set Ch_1 = Worksheets("sheet1").ChartObjects.Add(Left:=300, Top:=150, Width:=600, Height:=300) With Ch_1.Chart.ChartType = xlxyscatter.chart.setsourcedata Source:=Sheets("Sheet1").Range(Cells(13, 4), Cells(13 + 40, 5)), PlotBy:=xlColumns.Chart.Location Where:=xlLocationAsObject, Name:="Sheet1" End With With ActiveChart.HasTitle = True.ChartTitle.Text = Range("K7").Value.Axes(xlCategory, xlprimary).hastitle = True '.Axes(xlCategory, xlprimary).axistitle.characters.text = "Open-Close".Axes(xlCategory, xlprimary).axistitle.characters.text = Range("K10").Value.Axes(xlValue, xlprimary).hastitle = True '.Axes(xlValue, xlprimary).axistitle.characters.text = " 頻 度 ".Axes(xlValue, xlprimary).axistitle.characters.text = Range("K9").Value '----Y 軸 のタイトルを 縦 書 きに 変 更.Axes(xlValue, xlprimary).axistitle.orientation = xlvertical '---- End With ActiveChart.ChartType = xlcolumnclustered '------------------------------- End_: End Sub '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 以 上 11/11