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)

2007年3月17日 (土)

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

  URLについて記事を書くにあたり準備をしていたら、本に頼らないで別の方法でプログラムを組むことが出来るのに気がつきました。何も新しいことではありません、これまでにExpect01でしているクエリによるデータ取得の作業をマクロで記録したらこのプログラムの中心となる大事な箇所が作れるのです。コロンブスの卵ですネ。失敗しても良いからとにかく試してみます。すると新しい発見があります、もし失敗してもまた新しいアイデアが浮かんできます。

 この内容は後ほど書きます。

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

Url01

  ヤフーファイナンスの時系列のURL

  1ページだけのURLは非常にシンプルです

   table.yahoo.co.jp/t?s=5017.t&g=d

    s=5017  銘柄コード   

Url03  試しに5017を1819に変えて 右端の移動をクリックしてください。1819の時系列に変わるはずです。

  g=d  日間データ  (は週間データ、は月間データ)

Url05  試しにdをwに変えて 右端の移動をクリックしてください。週間の時系列に変わるはずです。

   この操作をVBAですれば良いだけです。日間データはそのままで良いのでdに固定します。操作するのは銘柄コードの部分だけです。

 ウワァ~ これだとこの部分に関して言えば、今からやろうとしている事よりもExpect01用のプログラムの方が簡単にできてしまいますよネ。今気がつきました。それに売り買いのサインをつければ、ほとんどProgre02になってしまいますよ。売買指示シートExpect01是非とも作ってみてくださいね。

  Url06    ******************************

 

つぎに何ページにもまたがった場合のURL

   table.yanoo.co.jp/t?c=2006&a=2&b=6&f=2007&d=3&e=17&g=d&s=5017&y=0&z=1819.t

 前より長くなります。

 z=1819.t   (これは前に開いていた銘柄コード  これはいらない)

 a=2  からの月   b=6  からの日   c=2006  からの年

 d=3  までの月   e=17  までの日   f=2007  までの年

 y=0  時系列のデータの番号2ページ目は50にします      

     3ページ目は100  以降ページが増える毎に50増えます。

 実際にこれらの数値を変えて試してください。

 次回は  URLの編集に関するプログラム を書きます。   

       

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

2007年3月16日 (金)

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

最速攻略 Excel VBA サンプル大全集 Book 最速攻略 Excel VBA サンプル大全集

著者:結城 圭介
販売元:技術評論社
Amazon.co.jpで詳細を確認する

  去年の12月に買った本です。この本を元にプログラムを組みました。昨日より実際に作ったプログラムを活用しています。今まで5分以上掛っていた作業が、クリック一発で1分以内に出きるようになりました。これでバンバン各銘柄の検証が出来ます。

 ただこれからの問題は,著作権の問題です,個人的に改造,コピー,使用はある程度許されるみたいなのですが、無許可での著作権法の規定を超えた利用(複製,配信,販売,再配布など)が禁止されています。

 ですから本当は僕の今回作った(改造)プログラムを全部書きたいのですが,今後プログラムの基本的な部分、(誰が作ってもこうなると言うような部分)、ここは書かなければ成らないという部分、に限られるかもしれません。ただ出来るだけのことはしようと思います。

 全ての人がこの本を買ってすぐに活用できるかといえば・・・・。例えば今年の3月初めにヤフーファイナンスの書式が大きく変わりました、それで時系列データの位置(テーブル番号)が株価データの部分で20から23に変わってしまいました。その部分を書き換えないと今は使えません。ですからこの本を使いこなすにはある程度プログラムの知識があるか,知識のない方には何か虎の巻みたいなものが必要だと思うのです。

 2580円と安い本なので、是非とも買って見てください。

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

 とにかく、フォームまで完成しましょう。

 その1からその3まで実際にやってみて間違いがないか、動いてくれるか,テストを今しているのですがなぜか上手く行きません。(オブジェクト名がコードと一致しているかもチェックしてください,もし違っていればオブジェクト名を変えてください。)

 それとExpect01の方はクエリで入力すると51番目のデータが消えてしまい、データの蓄積が出来ないことに今気づきました。

 Progre02の方はVBAでクエリを操作し入力しているからか、そう言うことはなくデータは蓄積されていきます。

 一応,次のコードを下に書きますが、上手くいく保証はありません。

(素人プログラマーがする事はこんなもんです。壁にぶつかってばかりです。でも一歩一歩進んでいきたいです。)

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

Private Function fDateCheck(ByRef pDate As Object) As Boolean

     '戻り値の初期値はFalse(チェックNG)
     fDateCheck = False

    '未入力チェック
    If Len(Trim(pDate.Value)) = 0 Then
       MsgBox "日付を入力してください" _
            , vbOKOnly + vbExclamation, "入力チェック"
       Exit Function
    End If

    '桁数は最低でも10桁
    If IsDate(pDate.Value) = False Then
       MsgBox "日付を正しく入力してください" _
            , vbOKOnly + vbExclamation, "入力チェック"
       Exit Function
    End If

    '書式のチェック
    If CDate(pDate.Value) <> CDate(Format(pDate, "yyyy/mm/dd")) Then
       MsgBox "日付の書式(yyyy/mm/dd)で入力してください" _
            , vbOKOnly + vbExclamation, "入力チェック"
       Exit Function
    End If

    '書式を整える(yyyy/mm/dd)
    pDate.Value = Format(pDate, "yyyy/mm/dd")

    'チェックOK
    fDateCheck = True

End Function

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

 次回は ヤフーファイナンスの時系列のURLについて書きます。その前に問題を解決しないと先には進めないのですが・・・・・

 問題の解決法が分かりました。

 その2で記述した下のコード のファンクションfGetStockPriceData()をまだ記述してないのでこの部分で止まってしまいます。ですからこのコードが一旦、働かないようにすればよいのです。コードの前に()(キーボード7)を記入してください。

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

これでテストしてみてください,上手くいくはずです。

あとで必要なときにこの()を外せば良いのです。

ああスッキリ

つづく

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

2007年3月15日 (木)

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

Vba40_1Vba41_1   その前に、テストしていてもしこの表示が出た場合OKをクリックし、次にリセットボタンをクリックしてください。(書き忘れていました,すみません)

つづき

ツール(T)、マクロ(M)、Visual Basic Editor(V) をクリック。

データ取得フォーム を選択し、コードの表示をクリック。

 その2の記述につづけて、下のように記述していきます。(面倒であればこのまま下のコードをコピー/ペーストしてください。)

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

'-------------------------------------------------------------------------------
'  銘柄コードのチェック処理1(書式チェック)
'-------------------------------------------------------------------------------
Private Function fStockCodeFormatCheck() As Boolean

     Dim strSeName As String

     '戻り値の初期値はFalse(チェックNG)
     fStockCodeFormatCheck = False

    '桁数は4桁
    If Len(Me.TxtCode.Value) <> 4 Then
       MsgBox "銘柄コードを正しく入力してください" _
            , vbOKOnly + vbExclamation, "入力チェック"
       Exit Function
    End If
   
    '数字のチェック
    If IsNumeric(Me.TxtCode.Value) = False Then
       MsgBox "銘柄コードを正しく入力してください" _
            , vbOKOnly + vbExclamation, "入力チェック"
       Exit Function
    End If

    'チェックOK
    fStockCodeFormatCheck = True

End Function

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

  データ取得フォームのテキストBOX(銘柄コード)を右クリックし、(オブジェクト名)をTxtCodeと書き換えてください。

 上書き保存、

  まだテストはしないでください。(私は今この記事どうりに行って実際に上手くいくか始めから繰り返しテストしています。)

つづく

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

2007年3月13日 (火)

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

Vba32  その1で作ったデータ取得ホームを右のように替えてください。何故かと言いますと、最初はシートナンバーを指定しその指定したシートに株価データを取得しようと思いましたが、なぜか上手くいきません。また下手に検証シートや売買指示シートに直接株価データを取得しようとして、大切な式やマトリクス、テーブルなどを壊したくないからです。それで別のシートに株価データを取得し、それを手動でコピー/ペーストすることにしました。

 またサンプルのプログラムには沢山のチェック項目がありますが。今から作るプログラムはプライベートで使用するものなので、成るべく簡単なものにしたいと思います。(プロではないので完璧なものは出来ません)。とにかく使える物が出来ればと考えています。

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

つづき

ツール(T)、マクロ(M)、Visual Basic Editor(V) をクリック。

 プロジェクトのフォームフォルダー+をクリック、データ取得フォーム を選択 オブジェクトの表示をクリック。 上のようにフォームを変更します。

 変更が終わりましたら、つくったデータ取得ボタンを右クリック

 コードの表示(O)をクリック。

 Private Sub データ取得ボタン_Click()  から End Sub  まで、下のように記述していきます。(面倒であればこのまま下のコードをコピー/ペーストしてください。)

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

 Private Sub データ取得ボタン_Click()
   
    '銘柄コードのチェック
    If fStockCodeFormatCheck() = False Then
       Me.TxtCode.SetFocus
       Exit Sub 'チェックNGのときは終了
    End If

    '日付(から)のチェック
    If fDateCheck(Me.txtDataFrom) = False Then
       Me.txtDataFrom.SetFocus
       Exit Sub 'チェックNGのときは終了
    End If

    '日付(まで)のチェック
    If fDateCheck(Me.txtDataTo) = False Then
       Me.txtDataTo.SetFocus
       Exit Sub 'チェックNGのときは終了
    End If

    '日付の大小チェック(Fromの方が小さくなければならない)
    If Me.txtDataTo.Value < Me.txtDataFrom.Value Then
       MsgBox "日付が逆転しています。" _
            , vbOKOnly + vbExclamation, "入力チェック"
       Me.txtDataFrom.SetFocus
       Exit Sub 'チェックNGのときは終了
    End If

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

    'フォームを閉じる
    Unload Me
 
End Sub

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

 この様になります。上書き保存。

Vba30

 Vba40 その前に、テストしていてもしこの表示がVba41出た場合OKをクリックし、次 にリセットボタンをクリックしてください。(書き忘れていました,すみません)まだ完成してないので下手にボタンをクリックすると止まってしまいます。

つづく

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

2007年3月 9日 (金)

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

 まず新しいExelを開きます。Vba01

  ツール(T)、マクロ(M)、Visual Basic Editor(V)をクリックVba002

赤丸のユーザフォームの挿入をクリック、ツールボックスのテキストボックスをクリック、Vba04 Vba05

User Form1 上でドラッグ、これを4っつ作る、

コマンドボタンをクリク、User Form1 上でドラッグ、赤丸のところ2箇所(オブジェクト名、Caption)を(データ収得)と書きかえる。Vba06 Vba09

同じようにもう一つ作り、(オブジェクト名、Caption)を(キャンセル)と書きかえる。

Vba10

Vba12

ラベルをクリック、User Form1 上の各テキストボックスの上の適当な位置でドラッグ、Caption)を(シートページ)と書きかえる。 

同じように(銘柄コード)(取得範囲)(から)(まで)と入れる。

Vba14

Vba13これでUser Form1 は完成です。後は色を付け、(オブジェクト名、Caption)を(データ取得フォーム)と書きかえてください。同じように各ボタン、各ラベル、も色を付けてください。Vba15

       

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

  Vba19_1 つぎにExcelに戻り、表示(V)、ツールバー(T)、コントロールツールボックスをクリック。

フォームをクリック。赤丸のボタンをクリック。Excel上の(セルC1)から(セルD1)へドラッグ、マクロの登録の新規作成(N)をクリック。Vba21

 

ここからマクロの記述の始まりです。Vba24

 赤線の部分はこのプログラムの説明で、さいしょに(’)をつけるとプログラムとは直接関係しなくなります。

 青線の部分はオブジェクト名です。

 みどり線の部分は命令文(コマンド)Showメソッド (ユーザーフォームを開くときに使います)。

 ピンク線の部分はモード (vbModelessでユーザーフォームを開きますと、ユーザーフォームを開いているときも、Excelの操作ができます)。

下にコードを書きますので。これをコピー/ペーストしてください。

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

'データ取得フォームの表示

  データ取得フォーム.Show vbModeless

                        ***************************
  Vba25

  次に、フォームのデータ取得フォーム(User Form1)をクリック、左上の赤丸のところ(オブジェクトの表示)をクリック、キャンセルボタンを右クリック、コードの表示(O)をクリック

Vba26_1 Unload Me と記述してください。

そしてファイルを保存してください。

 プログラムのテストをします。Excelシート上に作ったボタンをクリックすると、作ったフォームが現れ、フォーム内のキャンセルボタンをクリックすると、フォームが消えるはずです。

 お疲れ様でした。自分で作って思いどうりに上手くいくと嬉しいですよね。

 つづく

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

2007年3月 8日 (木)

VBAでデータ取得しようかな

 VBAについてまだまだ書くつもりはなかったのですが。検証をしていて3年間のデータを手入力するのは時間が掛ります,プログラムを書くにも時間は掛りますが,1度作ってしまえば後々すごく便利になります。Progre02の方の毎日のデータの収得はVBAを使っていますが、これは1日分のデータ収得です。新たに検証用に3年間のデータを収得するプログラムを作っていきます。

 ただシステムトレードで大事なことは自分にあった投資ルールを持っているか、そのルール(参入、手仕舞い、ロスカット、トレーリングストップ、ポジションサイズの決定,等のルール)にしたがって投資をした場合期待値がプラスで利益を上げられるか、ということです。

 最初は手入力で十分です。とにかくエクセルでExpect01(とうブログの売買指示シート)を作ってみてください。そしてある程度操作に慣れてから5銘柄ぐらい増やしてください。

 そして実践してみてください(最初はポジションを小さくしてくださいね)ここで自分の投資ルールを確立していきます。この部分がしっかり出来ないと。ルールの意味をしっかりと理解し、ルールが自分と一体になるようでないと。システムトレードは続けられないでしょうね。何度も言いますがこの部分がもっとも大事です。システムトレードは2次的な物です。私は裁量取引が下手だから,システムトレードを始めるというのは間違っていると思います。まずは確りした自分のルールを持つことが先決だと思います。

 そうすると、色々な問題点が出てくると思います。あれもやりたい、これもやりたいとか,これが出来ると時間短縮になるのにとか。ここまで来るとVBAが使えればなーと、考えるようになってきます。ここで始めてVBAの登場です。

 偉そうに書いていますが。私も勉強しながら試行錯誤でやっています。VBAの内容はもう少しお待ちください。

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

3月8日 システムトレード今日の結果   株数    ストップ値

8606  新光証券  620   +19   1000     645

5202  板硝子   623    +14   1000     599

5352  黒崎播磨  587   +23   1000     562

8607  ミズホイン  313   +15   1000     288

        PF  \3,382,000   \+57,000

 5202 @611 1000株 買い 、5352 @571 1000株 買い

 8607 @303  1000株 買い

まだシステムが中途半端なので、しばらくは手仕舞いオンリーのルールでいきます。

その代わりVBAの記述に励みます。

今日は昨日買った株が上がってくれて良かったです。

 

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