2009年2月 5日 (木)

データ取得シート の修正

 コメントを今朝見てVBAを書き直した。1回目は上手くいかなかったけど、コメントを注意深く読みながら、直していったら、出来た。

 UPしておきます。「infoseek.xls」をダウンロード

| | コメント (0) | トラックバック (0)

2008年10月11日 (土)

VBAの修正完了

  先ずはインフォ用のデータ取得シートをUPします。

     「infoseek.xls」をダウンロード

 8月ぐらいまでトレンドフォロー派も勝ったり負けたりで苦しかった。しかし、システム通りに動いていたなら勝てたのです。

 パラメータを変える必要もありませんでした。

 idou20検証ブック(かたむき)のVBAの修正も終わりました。

 この後、各銘柄の検証を続けます。

 

| | コメント (0) | トラックバック (1)

2008年7月 7日 (月)

週足/月足

ひさしぶりのVBAねた。

ひょんなことから、週足、月足でも検証してみようと思った。波と言う物は周期と振幅の大きい波の上にその小さい波が重なって出来ている。

だから、日ごろ見ている波(日足、10分足)に加えそれよりも大きい波(週足、日足)も見ておかねばならない。

 例えば新日鉄のATR(ボラ)を見た場合、日足だと25円、週足だと60円、月足だと120円というようになる。

 だから、デイの人は25円以内で勝負をしているし。スイングの人は60円以内、短期の人は120円以内の勝負が妥当なのである。

 それを欲張り、もっと利益を伸ばさないと、と思ったときに後で後悔することもあるのです。

        ********

 それで、前にヤフーデータ取得シート(へたれさん提供)を公開しましたがそれを週足用、月足用に変えなければなりません。

「yahookabu.xls」をダウンロード

開いてみてください

もしも、自分でこれを週足用に変えたい場合は以下のようにして、VBAの中身を変更してください。(1箇所だけです)

表示(V)、ツールバー(T)、Visual Basicを選択すれば、ツールBOXが出てくるので、Visual Basic Editor のボタンをクリックしてください。

 左側の標準モジュールの+記号をクリックしてModule時系列を選択して左上のコードの表示ボタンをクリックしてください。

 VBAのコードが現れるはずです。

        ********

Public Sub Yahoo時系列_取得_Test()
    Dim sCode As Integer
    Dim sMarket As String
    Dim dwm As String
    Dim dte1 As Date
    Dim dte2 As Date
   
'    Application.ScreenUpdating = False     '大して早くならない

Debug.Print "start:" & Time
    sCode = Worksheets("Sheet1").Range("C2")     ' "9984"
    sMarket = ".t"    '"t:東証","o:大証","q:JASDAQ","j:ヘラクレス","n:名証","s:札証","f:福証"
   
    dwm = "d"    '"d:デイリー","w:週間","m:月間"
    'ダウンロード開始日
    dte1 = Worksheets("Sheet1").Range("C4")   'Date   0
    'ダウンロード終了日
    dte2 = Worksheets("Sheet1").Range("C6")    'CDate("1983/01/04")    0
   
    Call Yahoo時系列_取得(sCode & sMarket, dwm, dte1, dte2)
    Call 終了

        ********

 赤字で書いている行のdwm = "d"を dwm="w"と変えれば週間データに、と変えれば月間データを取得するように変わります。

 この切り替えようのボタンを作ればよいのですけどね。

 つづく  

        次回 簡単に切り替わるようにしてみます。

| | コメント (0) | トラックバック (0)

2007年9月16日 (日)

データ取得 あれこれ

 データ取得には大きく分けて2つの種類があります。

1. 日々のデータ更新(1日か数日まとめて)

  売買指示ブック用

        ・ 1銘柄

        ・ 20銘柄

        ・ 100銘柄以上

2. 100日から1000日まとめてデータ取得

  検証シート用

        ・ 銘柄コード

        ・ 期間

      などの入力が必要になります。

3.それ以外に デートレ用の分足のデータ取得が有ります。

 これらをVBAを用いて実行するのですが。基本的に同じでも少しづつ違ってきます。

          *

 1の場合1行空けてそこへ直接データ(50日分)を上書きします。

 2の場合検証シートに直接入れないで、別のシートに一旦データ取得します。そしてそこから検証シートにコピーします。(色んな種類の検証シートがあり、またその大切な式などを壊したくないからです。)

 またどこからそのデータを取ってくるかによっても変わってきます。

          *

 日ごろ僕はYahooファイナンスからデータ取得しています。しかし、今回FXの検証を始めたことによりinfoseekからデータ取得しなくてはならなくなりました。

 ところがデータの並びが違っていたのです。

Yahoo :   始値 高値 安値 終値

infoseek :   終値 始値 高値 安値

よく見てみたらinfoseekは終値が前に来ているだけです。僕の場合検証シートの式は変えられませんからinfoseekの並びを変えます。

VBAのソースコードを書きます。これはマクロの記述を使いました。

 予めシート2にデータを取得しておきます。

  シート1は条件式がはいているシートと仮定します。

        ********

Sheets("Sheet2").Select
    Range("C2:E23").Select       'Sheet2の始値 高値 安値 をコピー 1日のデータ更新の場合23でよい、それ以上の場合は・・・?

    Selection.Copy
    Sheets("Sheet1").Select
    Range("B2").Select      ’Sheet1のセルB2に始値 高値 安値を貼りつけ
    ActiveSheet.Paste
    Sheets("Sheet2").Select

    Range("B2:B23").Select    'Sheet2の 終値をコピー 1日のデータ更新の場合23でよい、それ以上の場合・・・?
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Sheet1").Select
    Range("E2").Select      ’Sheet1のセルE2に終値を貼りつけ

    ActiveSheet.Paste

        ********

 またアホなことして、て言われそうですが、参考程度です。マクロの記述を使うって素人臭いのかな~(プロじゃないから出来ればそれでよいと思う。)後は速度の問題。

| | コメント (2) | トラックバック (0)

2007年5月11日 (金)

VBAの入り口 その10

 つづき

ここまで来ると後一歩、前に書いたVBAでデータ取得より遥かに簡単です。

この部分もマクロの記録を使えます。実際にクエリを使いデータを取得すればよいのです。この部分はVBAでデータ取得を見てください。

今回はコードソースとその説明だけ書きます。

        ********

Sub ヤフーデータ取り込み(hiData As Variant)
'
' ヤフーデータ取り込み Macro
' マクロ記録日 : 2007/5/6  ユーザー名 : ペニー
'

' 基本URLの収得

    Dim sCode As Integer
    Dim strURL As Variant
      
  Application.ScreenUpdating = False
 
  If Worksheets(2).Range("A3") <> "" Then
         MsgBox "行をあけてください", vbOKOnly + vbExclamation _
            , "行があいていません"
         Exit Sub
                
  End If
 
  shCount = ThisWorkbook.Worksheets.Count
      
   For inCo = 2 To shCount
   
       
    lngPageNum = 0

    sCode = Worksheets(inCo).Range("A1")
       
               
    strURL = "http://table.yahoo.co.jp/t" _
        & "?s=" & sCode _
        & ".t" _
        & "&g=" & "d"
               
'データインポートとはりつけ

        For j = 1 To 1
      
                
          With Worksheets(inCo).QueryTables.Add( _
                  Connection:="URL;" & strURL & "&y=" & lngPageNum _
                , Destination:=Worksheets(inCo).Range("A2"))
         
           .RefreshStyle = xlOverwriteCells
           .AdjustColumnWidth = True
           .WebSelectionType = xlSpecifiedTables
           .WebFormatting = xlWebFormattingNone
           .WebTables = 23                           'lngTablePosition '時系列データの位置(テーブル番号)
           .Refresh BackgroundQuery:=True
           End With 

 
            Next j
          
      
    Next inCo
   
    Application.ScreenUpdating = True
            
End Sub

        ********

 すごくシンプルです。

sCode = Worksheets(inCo).Range("A1")  sCode は 銘柄のコード です。 各シートのセルA1には必ず銘柄コードを入れておいてください。(チェック機能を置くべきですが、置いていません。)

strURL = "http://table.yahoo.co.jp/t" _
        & "?s=" & sCode _
        & ".t" _
        & "&g=" & "d"

これはURLの編集です。シートごとに sCode が 変わって行きます。日足の1ページだけですから簡単です。

            *
 
WebTables = 23

これはヤフー時系列データの位置(テーブル番号) 時々変わります。今年の3月1日から変わりました。その時は今までデータを取得できていたのに突然出来なくなり皆があわてたようです。

            *

クエリの部分は私には分かりませんから、皆さんで調べてください。(実際に取得できればそれでよいので分からなくてよいと思いますが。)

以上でこのシリーズは終わりです。最初の入り口が一番難しかったように思います。だいたい同じような作業が続きますから、慣れてくればだんだんと簡単になっていきます。

その10なんて呆気ないもんでしょう。もっと難しいと思ったのではないでしょうか。

何回もテストして見てください。今後これらの事を応用していろんなことが出来ると思います。自分に合ったシステム、自分に合った投資ツールを開発してください。それはちょっとした工夫で、ちょっとした閃きで出来ることでしょう。

今次のシステムに挑戦中です良い結果が出れば発表します。今日の結果は日曜に今週の結果とまとめて書きます。

| | コメント (0) | トラックバック (0)

2007年5月 9日 (水)

VBAの入り口 その9

つづき

これも前の作業と同じです。

ソースコードとその説明だけ書きます。

Sub 式のコピー

        ********

Sub 式のコピー(hiData As Variant)
'
' 式のコピー Macro
' マクロ記録日 : 2007/5/5  ユーザー名 : ペニー
'
Application.ScreenUpdating = False
 
  shCount = ThisWorkbook.Worksheets.Count 
   
   For inCo = 2 To shCount
   
        ThisWorkbook.Worksheets(inCo).Select
        Worksheets(inCo).Range(Cells(3 + hiData, 8), Cells(3 + hiData, 37)).Copy _
        Destination:=Worksheets(inCo).Range(Cells(3, 8), Cells(2 + hiData, 37))      
               
   Next inCo      
    
Application.ScreenUpdating = True

End Sub

        ********

これもマクロの記録の機能を使っています。

Range(Cells(3 + hiData, 8), Cells(3 + hiData, 37)).Copy

たとえば2行空けたとします。hiData=2、ですから、セル(5,8)からセル(5,37)の範囲の式をコピーします。の37と言う数字は今後項目が増えれば変える必要があります。

            *

Destination:=    Range(Cells(3, 8), Cells(2 + hiData, 37))

それを空けたセル(3,8)からセル(4,37)の範囲にペーストします。

つづく

| | コメント (0) | トラックバック (0)

VBAの入り口 その8

つづき

Sub 行の挿入 の記述

 これは日ごろ新しいデータを入れるために一行挿入する作業です。一枚のシートの作業であれば、マクロの記録機能を使う事が出来ます。(どのような記述になるか一度その機能を使ってみて、それからそれを改造するのも良いかもしれません。)

 今回は複数のシートにまたがった作業になりますので、マクロを登録した後、下のコードをコピー/ペーストしてください。

            *

 エクセルのツール(T)、マクロ(M),●新しいマクロの記録(R)をクリックします。

マクロの記録 ダイアログボックスが出ます。

マクロ名(M)を  行の挿入 と OK 。

■記録終了をクリック。

VBEのプロパティー・ウインドーの(オブジェクト名)を 行の挿入01 と書き換えます。

 Sub名 と オブジェクト名 が同じであればエラーが出るみたいなんですよ。(エラーの原因を掴むまで半日掛ってしまいました。)

        ********

Sub 行の挿入(hiData As Variant)
'
' 行の挿入 Macro
' マクロ記録日 : 2007/5/5  ユーザー名 : ペニー
'
Dim inCo As Integer

  Application.ScreenUpdating = False
 
  shCount = ThisWorkbook.Worksheets.Count
  inCo = 2
   
    f1 = hiData
 
    For inCo = 2 To shCount
         
       
        Do Until hiData = 0
            Worksheets(inCo).Select
            Worksheets(inCo).Rows("3:3").Insert Shift:=xlDown
       
            hiData = hiData - 1
            
        Loop
       
        hiData = f1
       
      
    Next inCo
       
          
   Application.ScreenUpdating = True

End Sub

        ********

 プログラムの説明

shCount = ThisWorkbook.Worksheets.Count 

shCount は 自分が作った変数(小文字で始める) このブックのシート数に使う

ThisWorkbook.Worksheets.Count は このブックのシート数を数えてくれるプロパティー

             *

inCo は 自分が作った変数  シート番号に使う、 初期値は2

f1 に 一旦 何行(hiData)あけるか を入れておきます。

             *

For inCo = 2 To shCount

       :

Next inCo

inCo は For から Next の合いだの処理を するたびに 2から1ずつ増え shCount(シート数) になるまで繰り返します。

             *

Do Until hiData = 0

             :                     
Loop
は hiData が =0 になるまで Do Until と Loop の合いだの処理を繰り返します。

             *

Worksheets(inCo).Select
  Worksheets(inCo).Rows("3:3").Insert Shift:=xlDown

これはマクロの記録で記述しました

xlDown 1行下に下げると言う命令

シートナンバーの変数 (inCo) は 先ほど書いたように2から1ずつ shCount(シート数)まで増えていきます。

             * 

hiData = f1 1シートの作業がおわれば hiData は 0 となりますので hiData を元の数に戻し次のシートの作業をします。

つづく

| | コメント (0) | トラックバック (0)

2007年5月 8日 (火)

VBAの入り口 その7

 つづき

 VBEを開きます。

 プロジェクト・ウィンドーのフォームのデータ取得を選択、オブジェクトの表示をクリックしてください。

 フォーム上の各パーツをクリックしプロジェクト・ウィンドーのコード表示をクリックしてソースコードを記述していきます。

 まず テキストボックス

        ********

Private Sub TextBox1_Change()

hiData = 1
       
    If IsNumeric(TextBox1.Value) = False Then

   If TextBox1.Value <> "" Then

        MsgBox "数字を入力してください", vbOKOnly + vbExclamation _
            , "入力エラー"
        TextBox1.Value = hiData

  Else
      End If

   Else
        hiData = TextBox1.Value
    End If
   
End Sub

        ********

Private Sub TextBox1_Change() の Change() は テキストボックスが変われば以下を実行するイベントです。

hiData は 自分が考えた 変数名 何行あけて、何日分のデータを取るか、初期値は1

If 文は IsNumeric はテキストボックスに入力した文字が数じかどうか判定するもの、違っていれば(False)、メッセージボックス(MsgBox)が出て、エラーを示します。テキストボックスは1になります。

 その中のIf文はテキストボックスを空にした場合も、上のエラーメッセージが出ますのでそれを回避するため。(なかなかこの部分が出来なかった。)今回やっと出来た。それまでは今から作るスピンボタンで無理やり対応していました。

正しく数字を入れれば、その数字が hiData の値になります。

             *

スピンボタン {SpinDown()} コードウインドーの右上のSpinDownを選択

        ********

Private Sub SpinButton1_SpinDown()

TextBox1.Value = TextBox1.Value - 1
   
    If TextBox1.Value < 1 Then
            TextBox1.Value = 1
        Else
            hiData = TextBox1.Value
       
    End If

End Sub

        ********

テキストボックスの値を一づつ下げます。

             *

スピンボタン {SpinUp()}コードウインドーの右上のSpinUpを選択

        ********

Private Sub SpinButton1_SpinUp()

TextBox1.Value = TextBox1.Value + 1
    hiData = TextBox1.Value
   
End Sub

        ********

テキストボックスの値を一づつ上げます。

            *

行あけボタン

        ********

Private Sub 行あけ_Click()

If TextBox1 = "" Then
        MsgBox "数字を入力してください", vbOKOnly + vbExclamation _
            , "入力エラー"
       
    Else
            
            行の挿入 (hiData)
            式のコピー (hiData)
   
    End If

End Sub

            ********

行あけボタンをクリックし正しく数字が入力されていれば、(Sub行の挿入)、(Sub式のコピー)へhiDataの値を持って行きます。

 まだこの2つのSubプログラムは作っておりません。その8、その9で書く予定です。

              *

データ取得ボタン

        ********

Private Sub データ取得_Click()

ヤフーデータ取り込み (hiData)

End Sub

        ********

データ取得ボタンをクリックすればhiDataの値を持って、(Subヤフーデータ取り込み)へ行きます。

            *

重要

この1番上に「Option Explicit」ステートメントで変数を宣言「Dim」しておきます。

        ********

Option Explicit

    Dim shCount As Worksheet
    Dim objSheet As Worksheet
    Dim ingCount As Integer
    Dim hiData As Integer
    Dim f1 As Integer
    Dim inCo As Integer

        ********

ヤフーデータ取り込みのSubプログラムはその10で書く予定です。

今テストをすれば途中で止まると思います。その場合リセットボタン■をクリックしてください。

つづく

| | コメント (0) | トラックバック (0)

2007年5月 6日 (日)

VBAの入り口 その5

 3/13に書いたVBAを使ったデータ取得を参照しながら作っていこうと思います。

 Vba31 図のようにテキストボックス、スピンボタン、コマンドボタンを配置します。

 プロパティー・ウィンドー(オブジェクト名)はデータ取得

 BackColor BorderColor を自分の好みで変えてください。Vba32_1

 Caption を データ取得フォーム

 ツールボックスのラベルでテキストボックスの上に『何日分のデータを取得しますか?』と書いてください。

テキストボックスの横に『日分』と書いてください。

フォーム上の各パーツをクリックしますとプロパティー・ウインドーが変わりますので,それぞれ(オブジェクト名)、BackColor BorderColor Caption を図のように変えてください。

この部分は3/13の記事と重複しますのでそちらを見てください。

つづく

| | コメント (0) | トラックバック (0)

2007年3月18日 (日)

VBAでデータ取得・・・その6

つづき

 その前にマクロの記録に挑戦。12月にProgre02を作った時は、この方法を良く使った。

Url09

 これがマクロの記録を使った結果です。(マクロの記録のし方はまた後ほど書きます。)

赤線と青線の部分を処理すれば出来あがりです。赤で囲んだところは別に書かなくても良いそうです。後で削除します。出来るだけシンプルな物にしようと思います。

      ***************************************

'  株価データの取り込み

Private Function fGetStockPriceData() As Boolean

    Dim strURL      As String
    Dim lngPageNum  As Long
    Dim strPageData As String
    Dim lngRow      As Long
    Dim lngRC       As Long
   
   
     Application.ScreenUpdating = False
    
     fGetStockPriceData = False
   
    'めいがらコードをセルA1に表示
    Range("A1") = Me.TxtCode.Value
   
   
    '基本URLの編集
     strURL = fGetURL()

    'ページ番号
    lngPageNum = 0

    '貼り付け位置の初期化
    lngRow = 2
   
    'データがなくなるまでインポートと貼り付けを繰り返す
    Do
       'インポート(貼り付け位置はA2から)
       On Error GoTo ErrExit
       With ActiveSheet.QueryTables.Add( _
                  Connection:="URL;" & strURL & "&y=" & lngPageNum _
                , Destination:=Range("A" & lngRow))
          
           .RefreshStyle = xlOverwriteCells
           .AdjustColumnWidth = True
           .WebSelectionType = xlSpecifiedTables
           .WebFormatting = xlWebFormattingNone
           .WebTables = 23    '時系列データの位置(テーブル番号)
           .Refresh BackgroundQuery:=False
       End With
       On Error GoTo 0

       '余分な見出しを削除する処理
       If lngRow > 2 Then
          ActiveSheet.Rows(lngRow).Delete
       End If

       '次の貼り付け位置を求める(最初だけ見出しを残す)
       If lngRow > 50 Then
          lngRow = lngRow + 50
       Else
          lngRow = lngRow + 51
       End If
      
        '1ページごとに50増やす
       lngPageNum = lngPageNum + 50
      
        '最高20ページまでとする
        If lngPageNum > 950 Then
          Exit Do
        End If
       
    Loop
   
    Application.ScreenUpdating = True
   
    fGetStockPriceData = True
   
   
    '共通出口
ErrExit:

End Function

      ***************************************

'  基本URLの編集

Private Function fGetURL() As String

   Dim meiCo       As Long
   
   meiCo = Me.TxtCode.Value
   
       '基本URLの編集
    fGetURL = "http://table.yahoo.co.jp/t" _
            & "?s=" & meiCo _
            & "&a=" & Month(Me.txtDataFrom.Value) _
            & "&b=" & Day(Me.txtDataFrom.Value) _
            & "&c=" & Year(Me.txtDataFrom.Value) _
            & "&d=" & Month(Me.txtDataTo.Value) _
            & "&e=" & Day(Me.txtDataTo.Value) _
            & "&f=" & Year(Me.txtDataTo.Value) _
            & "&g=d"

End Function

           ***************************************

この上2つのコードを続き(コードウィンドウ)にコピー/ペーストし、その4でコードの前につけた(')を外します。

'株価データの取り込み
'   If fGetStockPriceData() = False Then
'      MsgBox "インポートに失敗しました。" & vbCrLf _
'           & "インターネットに接続できるかどうかを確認してください。" _
'           , vbOKOnly + vbExclamation, "入力チェック"
'   End If

 これで完成です。一度試してください。

 私ももう一度、一からこの記事の通りやって見ようと思います。(テストの繰り返し)

 分からない点や、ここは間違っている,あるいは出来ない,私ならこの様にするのに,など何でも良いですから気軽にコメントお願いします。

| | コメント (0) | トラックバック (0)