2008年4月23日 (水)

つかいやすいもの

 今、idou,Progreを休んでいるけど、やめたのではない。ヤフーの時系列データが上手く入らない。それと、10銘柄以上を1つのブックにして3システムで3ブックの管理をしないといけない。

 それぞれのブックは、公開するために、それなりの体裁をよくしているけど、動作が遅い。僕の今の技術ではどうすることも出来ないし、しようとも思わない。

 実際の運用では小額資金なので5銘柄しかできない。だから、エクセル3ブックを開き10銘柄以上を絶えず監視する必要はない。

 それよりも1銘柄1ブックで両建てシステム、idou,Progreを入れ、必要なときにそれを開くようにしておけばよい。1銘柄だけだからVBAを使う必要もない。そして、デイトレの場合、ヤフーの20分遅れのデータ更新では間に合わない。

 それで今週から、その3システムを1つにしたエクセルブックを使っています。

        ********

 テスト 4日目

 今日は勝ちパターンの日でありました。

 しかしながらエントリーに失敗してしまいました。

 これがシステムトレードの難しいところです。今のままでは絶対にシステム通りには出来ません。

 JTも最期まで持っていれば+2,000だったのに、598Kで損切り(2:52)-2,000これは負けパターンです。

 システム  +7,000

 my-PF  +5,200

おもしろくなくても、しょぼくても、今は他の銘柄に手を出してはいけない。

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

2008年4月 6日 (日)

N日間最大最小の差つづき2

 つづき

 今まで逆張り系のシステムは作らなかったが、逆張り系のシステムも時には良いような気もする。

 なぜかと言えば、右肩上がりの綺麗なチャートの銘柄であれ、下げながら騰がるのである。下げトレンドも同じで、半値戻しとかがあって段々と下がるのだ。

 逆張りにストップをつけ、逆張りが機能しない時は自然にストップで守られ、その時は、今まで通り順張り系のシステムを使えばよい。

          *

 そんなこんなで今何とか逆張り系のシステムを作ることが出来ました。

 JT用に考えてみました。

運用日数 307日
初期資産 573000 円
最終資産 993000 円
取引回数 24回
勝率 70.83%
純損益率 73.3%
日率換算利回り 0.18%
月率換算利回り 3.72%
年率換算利回り 55.08%
シグナル発生頻度 7.84%
最大ドローダウン 6.24%
年率ボラティリティ 21.23%
年率シャープレシオ 2.59
プロフィットファクター 2.83
ペイオフレシオ 1.17
年間営業日数 245

 各部品はProgre02からそのまま使いました。売買サインの条件式を少し変えただけです。考え方はProgre02よりシンプルです。

  1年ちょっとの結果ですから、なんともいえませんが。チャートと今までの実際の取引で感じたそのままを、システムにしてみた結果です。大体これまでの動きを見ていたら5万から10万の上下を繰り返しています。

 取引頻度が7.84%と少ないですが、逆張りの場合それ程チャンスは無いように思います。(短期トレードの場合)

 これから何時ものように問題がないか調べていきます。

 つづく

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

2008年4月 5日 (土)

ヤフー時系列 テーブル番号の変更

 二日間データの更新をサボっていた。ちょっと凹んだぐらいで落ち込んでいたのではいけない。ブログでの成績の公表はしばらく止めようと思うけど、成績は毎日記録しておかないといけない。

 それで、気を取りなおしてヤフー時系列からデータを自動取得するのだけど、なにか変、数値データのところに文字が出る。

 webクエリのテーブル番号がまた変わったのだ

調べたら23から20になっていた。VBAを書き換えたら一発で直るのかと思ったけど、各個別銘柄のシートのクエリ編集でテーブル番号を書き換えないといけなかった。

 過去ログにwebクエリ編集,VBA,テーブル番号について書いているので詳しくはそれを見てください。簡単にデータや色んなことが取得できます。

 実際にしてみることです。

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

2007年12月 3日 (月)

エクセル 条件式の作り方(IF文)

 システムを自作するには、少なくともIF文が書けないと始まらない。

 でも難しく考えることはない。僕は、ツリーもフローチャートも作らない。兎に角、自分の思った通りに、動いてくれれば式の体裁はどうでも良い。

 それではどうしているかと言うと、あるアイデアが浮かんで、条件が増えれば前の条件IF文の前に新しい条件IFを足していくのである。(時には中に入れることも有る。)

 そして次第に複雑な条件式が出来上がる。

          *

 例えば

始めに     IF( 条件A 、 結果1 、結果2 )

が有ったとします。 

この意味は、条件Aの時、結果1でそれ以外は結果2となります。

■ 条件の追加  パターン1

 その後、あるアイデアが浮かんで条件Bの時、結果3、それ以外は始めの条件にしたいとします。  

IF( 条件B 、結果3 、IF( 条件A 、 結果1 、結果2 )

 となります。

 もちろん、条件A、条件B の中には不等式、等式、AND、OR、などが入ります。

■ 条件の追加  パターン2

 あるアイデアが浮かんで結果1が条件Bの時、結果3、それ以外結果1にしたい時も有ります。

IF( 条件A 、IF( 条件B 、結果3 、 結果1 、結果2 )

条件が増えると ) が増えますます。

■ 条件の追加  パターン3

 あるアイデアが浮かんで結果2が条件Bの時、結果3、それ以外結果2にしたい時も有ります。

 IF( 条件A 、 結果1 、IF( 条件B 、結果3 、 結果2 

この様にして、条件が次第に増えていきます。

すると次第に訳が分らなくなっていきます。またバグが出たり、自分が思っている結果(明らかに正しい結果)と明らかに違う結果(明らかに間違っている結果)が出る時があります。

■ 条件式の修正方法

 例えば売買サインの条件式のあるセルが条件を追加した後0になっていた、本当は5に成らないといけないのに、ところがその条件式には結果が10個も有って0に成る結果の部分が3個有るとします。売買サインの条件式は長いです。

 そこで、そのセルの条件式の結果をひとつ0から20に変えてやります。それでそのセルが20に成ればその結果を修正します。

 0のままであるなら次の結果を同じように試します。

修正とは、上の方法でその結果の部分に新しい条件を入れることです。

          *

 具体的に書いたらよいのですが、今のところこれで勘弁してください。

本心は、読者の皆さんと共通するものを持ちたいんです。へたれさん、umarさん、巨艦主義さん達なら、僕の軽いヒントで先に改良しているかもしれませんね。

 これからも、出来る限りオープンに行こうと思います。

 また良いアイデアがあれば、何方でもかまいません教えてください。

つづく

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

2007年12月 2日 (日)

移動平均の改良に成功

 前前から頭の中にアイデアはあった。その考えは移動平均の傾きに着目すればと言うものである。

 天井、底では少し前に移動平均の傾きが緩やかになり、移動平均を株価がまたぐときは案外大きく株価は動くものである(GU,GDもある)。だから、よっぽどの思いっきりがないと逃げ遅れて塩漬けになる。(完全自動なら容赦なく手仕舞うだろうが、そんな人は少ない。)

 それなら、サインが変わる(移動平均を株価がまたぐ)時を待たず傾きが緩やかになった時にポジションを解消すればよい。そしてサインが変わる(移動平均を株価がまたぐ)時を待ってサイン通りに参入すればよい。チャンスはいくらでもあるのだ。

 先週は、そういう意味で授業料を少し払ったが、良い勉強になった。

 まだ1銘柄しか検証してないので、確かなことは言えないけど、勝率も上がり、損益レシオも上がるようである。

           *

 今回の移動平均のシストレは、加工しない場合勝率が38%ぐらいで、損益レシオが3.00、PFが2.00となる。

 勝率さえ気にしなければ、そこそこの利益が出る、5銘柄全てがほとんど同じような成績を上げた。だから、Progre02より信頼性はあるといえる、手を加えなくとも十分使える。

 しかし、今回の加工によって勝率は50%・60%に上がった、損益レシオは2.3ぐらいに下がるが、PFは0.4、損益合計も1割以上あげることが出来る。たぶんドローダウンも小さくなるであろう。加工後の結果も5銘柄全てがほとんど同じような成績を上げた。

 良い結果がいくらでも出せるときの検証は楽しい。

 これをフルバージョンで検証してみたい。でも売りと買いで分けているので前の検証シートを直接には使えない。

 つづく

 

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

2007年10月 5日 (金)

ここからさらに発展させる

 10銘柄を同時に取引して上手くいく自信はないのだけれど、やれることはやらねばならない。

 そしてシステムトレードも上手くいく時といかない時がある。にもかかわらずシステムトレードを続けておられる方には頭が下がります。

 ほったらかしにしていた、『その日』という売買指示シートに組み込みヤフーの20分遅れのデータを取得するツールを3ヶ月ぶりに開いてみると、今も動いていました。(開くと同時にデータを取得するようにしてあります。

http://gyutetu.cocolog-nifty.com/blog/2007/05/post_6832.html

 問題点が2・3あり使っていなかったのですが、これを何とか克服して、新しい売買指示ブックに組み込もうと思っています。

         ********

 今日も実際の取引は冴えません、10銘柄同時の取引にしても参入のタイミングは難しい。しばらくは様子を見るしかないと思っています。カーブフィッティングだと1時間あればいくらでもよい結果を出せるけど。本当のシステムを作っていくには2ヶ月3ヶ月では出来ないと僕は思う。 実運用の結果になると色々問題も多く3年5年経たないと結果は出せないだろう。

 そしていつも勝てるわけがありません。また集中がよいのか、分散がよいのかその点でも悩みます。

 上の問題点の中には銘柄が絞りきれないというのもありました。今回10銘柄に絞ったというのは何らかの出発点でもあります。でも考えなんかころころ変わるし、挫折することもあります。それでもすこしずつ固まっていき、3ヶ月前に作ったものが、何かほかの物が出来ることによって、また問題点が解決することによって復活することもあります。

 システムトレードの皆さんがんばってください。

 

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

ヤットできた

 ドンチャンシステム売買指示ブックがほぼ完成しました。

 今回は10銘柄を選びました。ドンチャンなので業績に関係なしにただ単に売買サインに従えば良いのかもしれない。

 今週、成績の悪い8303が騰がった、ファンダメンタル、情勢からいえば買えないのに、株っていつもそんな物だ。

 ファンダメンタルも大事だけど、Progre02は順張りだから、自然とそのファンダメンタルも受け入れてくれる。

 突発的な事件、発表がある。不運にもそれに引っ掛かったとしても仕方がない。これには1つ1つのロットを小さくしておくことで対処できる。

        *

 今週に入りProgre02のデータ更新をサボっていました。見なくても殆どの銘柄がHOLDサイン(1)であることは判っている。

 だから、今週なにもサイン無視してまで売ることはなかったのです。

 ところが、10銘柄の今日の結果を見てみると、AOCだけが売りになっていました。

 AOCは100株だけを残し1850円ぐらいで売っていたので正解でした。

        *

 10銘柄に絞れば、また色々なことが出来そうです。『PM2:45発注計画』の見なおしをしても良いかもしれない。

 とにかくこの10銘柄をシュミレーションしていきます。

 つづく

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

2007年10月 4日 (木)

ドンチャンにするために条件式の変更

 トレーディングストップの式までは上手く売り買いの融合が出来ました。

 問題は売買サインの条件式です。

=IF(AA3="ストップ", IF(AA4="",4,0),
IF(AND(Y3=1,OR(AB4=0,AB4=4)),3,
IF(Y3=2,IF(OR(AB4=4,AB4=0),0,2),IF(Y3=0,0,IF(Y3=3,3,1)))))

1列挿入したので列番号はずれています。まだこれでは不完全で買いのストップは(4)、うりのストップは(5)にしようと思います。

=IF(AA28="ストップ", IF(AND(AA29="",Y28=0),5,IF(AND(AA29=5,Y28=0),1,0)),
IF(AND(Y28=1,OR(AB29=0,AB29=4)),3,
IF(Y28=2,IF(OR(AB29=4,AB29=0),0,2),IF(Y28=0,IF(AND(AA29=5,Y28=0),2,0),IF(Y28=3,3,1)))))

で、適当にIF文を付けていったら、訳が判らなくなりました。頭が痛い。

          *

AA3="ストップ"でY3=1の時
      AB4=1 OR AB4=3の時 AB3=4
              AB4=4 OR AB4=0の時 AB3=0

        Y3=0の時
      AB4=0 OR AB4=2の時 AB3=5
              AB4=5 OR AB4=1の時 AB3=1

AA3=""       でY3=1の時     AB3=1
           AB4=4の時  AB3=3

          Y3=0の時    AB3=0
                         AB4=4の時  AB3=2

               Y3=2の時    AB3=2
                      Y3=3の時    AB3=3

 条件を整理すれば多分このようになります。

これを式にしますと次のように成ります。(実際にはカッコが多すぎて1回では上手くいきません。)

=IF(AA3="ストップ", IF(Y3=1,IF(OR(AB4=1,AB4=3),4,0),IF(OR(AB4=0,AB4=2),5),IF(Y3=1,IF(OR(AB4=4,AB4=0),3,1),IF(Y3=0,IF(AB4=5,2,0),IF(Y3=2,2,3))))

 一応これで上手くいきました。

つぎは建値です。はじめから作り直そうと思います。結局その方が早いようです。

        *

 取引きは8303が変に強く、今日も負けています。

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

2007年9月 3日 (月)

Progre02を売りシステムに改造

 つづき

 変更点

1. U列 : n日間最大⇒n日間最小

     式の内容はS列と同じ

2. Y列 : トレーリングストップ

  イ. 最大値(U)よりX%下に置く

      ⇒  最小値(U)よりX%上に置く

      U3-U3*Y$1 ⇒ U3+U3*Y$1 

  ロ. X3=1 ⇒ X3=0

  ハ. 不等式を逆にします。

3. Z列 : 不等式を逆にします。

4.AA列 : 売買サイン

 少し複雑ですが基本的には同じです。

 ストップが出たときの処理が変わります。

イ. IF(Z4=””,4,0) ⇒ IF(Z4=””,4,1) 

ロ. AND(X3=1,OR(AA4=0,AA4=4)),3

⇒ AND(X3=0,OR(AA4=1,AA4=4)),2 

5. AB列 : 空売り

 (翌日寄り付きでの発注に変更しました)

=IF(AA4=2,B3,IF(OR(AA4=0,AA4=3,AA4=4),AB4,0))

6. AC列 : 返済

 =IF(AB3=0,"",IF(OR(AA4=3,AA4=4),B3,""))

7. AD列 : 損益

  AC3-AB3 ⇒ AB3-AC3

これで一応完成です。

        ********

 次回 このブックのトップシートの変更

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

2007年5月12日 (土)

売買指示シートの出来あがり

  Vba41_3 これがVBEです。

 Vba42 売買指示シートのトップシートです。データ取得ボタンをクリックすればデータ取得フォームが現れます。行あけボタンで2枚目以降のシートの3行目を入力した数だけ行が挿入され,必要な式が挿入された行にコピーされます。(30秒ぐらい)その作業が終わったのを確認し、フォームのデータ取得ボタンをクリックして下さい。(1分ぐらいで15銘柄のデータが取得されます。2つのブックで3分ぐらいです。)

Vba43 トップシートに戻り、左側のボタンをクリックして行けば,結果が出ます。

データ取得に余り時間が掛らないのでゆっくりと検討することができます。

シュミレーションの4銘柄は昨日の下げにもしぶとく耐えHOLDとなっています。私は4112を残し離してしまいました。振り落とされたようです。また機会があれば買い戻す予定です。

Vba44 共栄タンカー、三菱マテリアルはストップ率を小さくしていたためストップに掛りました。一応は適切な処置であったと思います。

それで一つ間違いに気付きました。共栄タンカーの買い予定値がこの前作った条件式では両シグナルのどちらかVba45の値になると思います。ストップで売りですから。買い予定値はそのトレーディングストップの値になります。(しかし買戻しは難しいですね。)下に訂正後の式を書いておきます。{セルT3}に入れて下さい。

=IF(OR($AA3=0,$AA3=2,$AA3=4),IF(AND($N3="",$P3=""),$O3,IF(AND($N3="*",$P3="*"),$M3,IF($Z3="ストップ",$Y3,IF($M3>$O3,$O3,$M3)))),"")

これでこのシリーズは終わりです。是非とも実行してみてください。

| | コメント (0) | トラックバック (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月 7日 (月)

VBAの入り口 その6

つづき

データ取得フォームの呼び出しボタンをエクセル上に作ってください。作り方はVBAの入り口を参照してください。

(オブジェクト名) データ取得ボタン

ソースコード

        *******

Sub データ取得ボタン_Click()

    データ取得.Show vbModeless

End Sub

        *******

Showメソッド はユーザフォーム(先日作ったデータ取得フォーム)を表示します。

vbModeless はフォームを開いた状態で他のエクセルの作業が出来ます。この記述がないとフォームをとじるまで他のエクセルの作業が出来ません。

       *

次にVBEのデータ取得フォームを選択、オブジェクトの表示ボタンをクリック、

フォームの閉じるボタンをクリック、コードの表示ボタンをクリック、

下のコードを記述(コピー/ペースト)して下さい。

        ********

Private Sub 閉じる_Click()

    Unload Me        

End Sub

        ********

エクセルに戻り、ボタンの名前をデータ取得 に変えてください。

そのボタンを右クリックし、マクロ登録(N)、データ取得 Clickを選択しOKをクリックしてください。

 テストします。

フォームを出したり消したり出来るはずです。

つづく

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

2007年5月 6日 (日)

VBAの入り口 その5

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

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

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

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

 Caption を データ取得フォーム

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

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

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

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

つづく

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

データ取得に入る前に

 昨日は町の氏神さんで子供餅つき大会、すがすがしい五月晴れの下、ひさしぶりに餅つきをしてきました。5/4から準備をし雨が降らないか心配していたのですが、晴れて良かったです。多くの参加をいただきました。

 その5に入る前に今からどのような事をしていくか一欄にしないと、自分も何から進めれば良いのか分からなくなるし、それ以上に皆さんは今何をしているのか分からなくなってしまうでしょうね。

今後の予定

        ********

 1. フォームの作成

 2. エクセル上にフォーム呼び出しのボタンを作る。

 そのマクロを作る。閉じるボタンのマクロ記述。

 3. フォームの各ツールのマクロ記述。

 4.行の挿入Sub の記述。

 5. 式のコピーSub の記述。

 6 ヤフーデータ取り込みSub の記述。

                       おわり

        ********

これで今後の記事が書きやすくなりました。

つづく

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

2007年5月 5日 (土)

VBAの入り口 その4

つづき

 前回は長く書きすぎました。このプログラム6個は同じパタンですからその2だけでも良かったのですが。

 Vba22それで何処がおかしいかと言いますと。NOポジの表示が一列空いてしまうのですよ。それで何回プログラムを見ても間違ってないのに、初めて作った時には各ボタンを一個ずつ順番に作っていましたから、よけいに何処がおかしいのか分かりませんでした。それで他の項目のボタンを作ってみてやっとNOポジの表示だけがおかしいと気付いたのです。

 他と違うのは売買サインだけです。

このままだと1枚目のシートからIfで条件を調べますから,1枚目のシートのセルAA3には何も入っていません、セルG1にも何も入っていません、それで{セルAA3}=0と判断し、{セルG1}=””を表示したのですつまり空を表示していたのです。

 それで応急処置として1枚目のシートの{セルAA3}に5をいれてみました。これで直るはずです。(ショボイですよね。)

 今から修正します。 と宣言したものの、上手く行かない。

たとえば

If  objSheet <> Worksheets(1)  Then

       :

       :

End If

として、1枚目のシートをパスしようとしましたが上手く行きません。残念

次はf1と言うフラッグを作り0から1ずつ増やしf1が1になるまでパスするようにしてみます。

一応、出来ました。

        ********

Sub NOぽじ_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer
    Dim f1 As Integer
   
    ingCount = 0
    f1 = 0
   
    Application.ScreenUpdating = False
   
    For Each objSheet In ThisWorkbook.Worksheets
   
        If f1 <> 0 Then
       
            If objSheet.Range("AA3") = 0 Then
       
                 Worksheets(1).Range("C11").Offset(0, ingCount) = objSheet.Range("G1")
                 Worksheets(1).Range("C12").Offset(0, ingCount).Value = objSheet.Range("E3").Value
                 Worksheets(1).Range("C13").Offset(0, ingCount).Value = objSheet.Range("T3").Value
            
            
                 ingCount = ingCount + 1
            
            
            End If
       
         End If
         
           f1 = f1 + 1            
       
    Next
   
            Worksheets(1).Range("C12").Offset(0, ingCount) = "以上なし"
       
    Application.ScreenUpdating = True
 
  End Sub

        ********

赤色の部分が今回追加したところです。

次回は いよいよデータ取得です。

  前回のデータ取得は検証用に1銘柄1000日分の取得でした。

  今回は売買指示シート用でシート(銘柄)毎にデータを取得します

         好御期待

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

2007年5月 4日 (金)

VBAの入り口 その3

つづき

先に日付のソースコードを変えてみます。ツール(T)からVBEを開きます。

左上のプロジェクト・ウィンドーの標準モジュールの日付を選択し、左上コードの表示ボタンをクリックして下さい。

先日、記述したプログラムがコード・ウィンドーに現れます。

        ********

Sub 日付_Click()

Application.ScreenUpdating = False

    Set a = Worksheets(1)
    Set b = Worksheets(2)

        a.Range("A7").Value = b.Range("A3").Value   
   
Application.ScreenUpdating = True

End Sub

        ********

Sub 日付_Click() のClick() はClickイベントで先に登録したボタンをクリックするとこのプログラムが実行されるというものです。

          *

VBAに慣れている方は、どんどん先に進んでください。昨日の記事のみどりの部分を変えるだけですよね。

それと一つ注意するのを忘れていました。2枚目以降の売買指示シートの{セルG1}には必ず銘柄銘を入れてください。そうしないとボタンをいくらクリックしても結果が返ってきません。

またテストするには銘柄(シート数)を増やして下さい。{セルAA3}には0から4までの値を適当に入れておけば良いと思います。

ただ1箇所だけこれはおかしいと言うところがあります。

今から書くソースコードは敢えて修正前のものを書きます。(自分は今も修正しないでショボイ方法で処理しています。)

何処がおかしいか,修正方法はなにか、考えてください。また、よろしければコメントをください。

2.NOポジ(0)のサインの出ている銘柄の抽出

        ********

Sub NOぽじ_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer
   
   
    ingCount = 0
   
    Application.ScreenUpdating = False
   
    For Each objSheet In ThisWorkbook.Worksheets
       
        If objSheet.Range("AA3") = 0 Then
       
            Worksheets(1).Range("C11").Offset(0, ingCount) = objSheet.Range("G1")
            Worksheets(1).Range("C12").Offset(0, ingCount).Value = objSheet.Range("E3").Value
            Worksheets(1).Range("C13").Offset(0, ingCount).Value = objSheet.Range("T3").Value
            
            
            ingCount = ingCount + 1
            
            
        End If
       
    Next
   
            Worksheets(1).Range("C12").Offset(0, ingCount) = "以上なし"
       
    Application.ScreenUpdating = True   
      

End Sub

        ********

3.買い(3)のサインの出ている銘柄の抽出

        ********

Sub 買い_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer
   
       
        ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 3 Then
       
            Worksheets(1).Range("C16").Offset(0, ingCount) = objSheet.Range("G1")
            Worksheets(1).Range("C17").Offset(0, ingCount).Value = objSheet.Range("E3").Value
            Worksheets(1).Range("C18").Offset(0, ingCount).Value = objSheet.Range("R3").Value
                        
                                       
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C17").Offset(0, ingCount) = "以上なし"

   
   Application.ScreenUpdating = True
       

End Sub

        ********

4.売り(2)のサインの出ている銘柄の抽出

        ********

Sub 売り_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer      
   
    ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 2 Then
       
           Worksheets(1).Range("C21").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C22").Offset(0, ingCount).Value = objSheet.Range("E3").Value
           Worksheets(1).Range("C23").Offset(0, ingCount).Value = objSheet.Range("T3").Value
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C22").Offset(0, ingCount) = "以上なし"
   
   Application.ScreenUpdating = True 

End Sub      
       
          ********

5.ストップ・サインの出ている銘柄の抽出

        ********

Sub ストップ_Click()

  Dim objSheet As Worksheet
    Dim ingCount As Integer
            
   
    ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("Z3") = "ストップ" Then
       
           Worksheets(1).Range("C26").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C27").Offset(0, ingCount).Value = objSheet.Range("Y3").Value
                                    
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C27").Offset(0, ingCount) = "以上なし"
   
   Application.ScreenUpdating = True
   

End Sub
          
          ********

6.ストップ(4)点灯した銘柄の抽出

        ********

Sub ストップ点灯_Click()

Dim objSheet As Worksheet
    Dim ingCount As Integer
   
       
        ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 4 Then
       
            Worksheets(1).Range("C30").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C31").Offset(0, ingCount).Value = objSheet.Range("Y3").Value
                                    
                
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C31").Offset(0, ingCount) = "以上なし"
   
   Application.ScreenUpdating = True
       
   
End Sub

        ********

修正方法はまた後で考えるとして、これでテストしてみてください。プログラムの順序が違っていたため,途中書くのに手間取りました。多分これで良いと思います。と確認していたらまた間違えていた、あぶないあぶない・・・・・

つづく

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

2007年5月 3日 (木)

VBAの入り口 その2

 つづき

ここまで出来れば後はこの応用、入り口だけが、始めの一歩が、どんな事でも困難なのではないだろうか。後は簡単ではないが何とかなる。何とか出来そうだ・・・・・・Vba14

始めの一歩を踏み出そう

前回したように、図のように6個のボタンを作り

各々マクロ登録の新規作成(N)をクリック、して行く。

VBEは図のようになり、オブジェクト名を抽出とする。

Vba15 Sub の横を HOLD、NOポジ、買い、売り、ストップ、ストップ点灯と記入して行く。

 赤丸のところは自然と変わります。

エクセルに戻り各ボタンの名前を上からHOLD、NOポジ、買い、売り、ストップ、ストップ点灯と変えます。(前回参照

Vba18 ボタンを右クリックしてマクロの登録(N)、HOLDのボタンであればHOLDを選択し、OKをクリックします。(6個全てにしてください)右の図の様になります。

これで準備完了。

後はVBEを開きSubとEnd Subの間にソースコードを記述していきます。

記述の方法にはマクロの記録機能を使う方法、自分で記入していく方法、他の人が作ったモジュールを何処かからパクッて来る方法などがあります。

マクロの記録機能が使えれば良いのですが,エクセルの作業が今回複数のページにまたがっているので、今から書くソースコードをコピーペーストしてください。

1.HOLD(1)のサインの出ている銘柄の抽出

Sub HOLD Click() と End Sub の間に下のソースコードを貼り付けてください。

               ***********

    Dim objSheet As Worksheet
    Dim ingCount As Integer      
   
    ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 1 Then
       
           Worksheets(1).Range("C6").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C7").Offset(0, ingCount).Value = objSheet.Range("E3").Value
           Worksheets(1).Range("C8").Offset(0, ingCount).Value = objSheet.Range("R3").Value
          
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C7").Offset(0, ingCount) = "以上なし"
            
   
   Application.ScreenUpdating = True

               **********

コードの説明

         *

Dim   ステートメントで変数は宣言をしなければなりません。

『 Dim 変数名 As データ型 

 変数名 objSheet は自分で考えて作るもので、アルファベット小文字で始めます例えば f1 でも構いません。分かりやすい短いのが良いでしょうね。

多分これは何かの本からそのまま移したと思います。

データ型 Worksheet これは普通、変数の精度 によって決まります。(これは多分オブジェクト型だと思います)

データ型 Integer は整数値

       *

For Each objSheet In ThisWorkbook.Worksheets ~

Next

objSheet(オブジェクト型)変数が1から増えていき。Nextまでワークブックの数だけくりかえします。

後でシートを増やしてもこれで対応してくれます。普通の変数型にすれば予めシート数を数えていなければなりませんし、シートを増やしたり減らしたりすればその度に変えなければなりません。

          *

If objSheet.Range("AA3") = 1 Then

End If

objSheet.はつまり最初 Worksheets(1). で Sheet1のセルAA3(売買指示サイン)が1なら次の処理をしingCountは0から1増えます(ingCount = ingCount + 1)。(当然Sheet1のセルAA3は1ではありません)

 objSheet.はWorksheets(2). となりSheet2のセルAA3が1なら次の処理をしingCountは1増えます

          *

Worksheets(1).Range("C6").Offset(0, ingCount) = objSheet.Range("G1")

セルAA3が1ならそのシート(objSheet.)のセルG1(銘柄名)がSheet1のセルC6から(0、ingCount)(行、列)離れたセルに入ります。つまりセルC6、セルD6、セルE7と右に入っていきます。Offset(0, ingCount)はそう言う意味です。

その下にE3(終値)、R3(売り+TS 予定)が入ります。

         *

残りのボタンのソースコードもこれと同じで、条件の値みどりを変えます。その下の式の記入の位置みどりを最初に記入するセル位置に、記入する値みどりを見たいセルに変えます。

つまりこの部分を変えることにより色んな表示が今後出来ると言うことです。

 素晴らしいアイデアがあればシート2以降のK列~V列までを改良して、先ほど書いたSheet1のソースコードのみどりの部分を変えると面白いことになると思います。

 話が反れてしまいましたね。

それで、今作ったボタンを押して記入された部分は消去ボタンを押しても消えませんので今からそのソースコードを昨日作った消去モジュールに付け加えていきます。1部変更しましたのでよろしくお願いします。

         ***********

Set a = Worksheets(1)
   
    a.Range("A7").ClearContents
    a.Range("C6:Q8").ClearContents
    a.Range("C11:Q13").ClearContents
    a.Range("C16:O18").ClearContents
    a.Range("C21:O23").ClearContents
    a.Range("C26:O27").ClearContents
    a.Range("C30:O31").ClearContents

         ***********

ゆいさんのコメントを試してみればすっきりしたソースになりました。

ありがとう。

 思い出しました。半年前に多分上手く行かなかったんだと、それでマクロの記録を使ったんだろうと。

この場合 Set がいるのですね。

皆さんも作って試してくださいね。

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

2007年5月 2日 (水)

VBAの入り口

 次に書く記事の予定をしてしまったので、どの様に書けば良いのか、思案していたところ過去に作っていたシートが出てきました。Vba

 去年の8月頃はまだ幼稚なことをしていて、何とかして一目で各銘柄のサインを見ようと試みていたのでしょう。こ