チャートギャラリーで、1日1画面ずつのハードコピー画像を、自動で一括保存する方法

パンローリング社の「チャートギャラリー」は、
過去の場面に戻って、先の展開(右側)が見えない状態で、
1日ずつめくりながら、トレード練習を行うことができる。

でも、そこで、画面に書き込みを行うことができたら最高だ。
先生のコメントと、自分のコメントを切り替えて、反省に役立てたり、
別のトレーディング日誌 や ブログへ貼り付けて二次加工したり、
いろいろとやりたいことがでてくる。

別のチャートソフトを使うか、作るのもいいけれども、
トレード練習は、自分が実際に本番で使うチャートを使いたいので、
やっぱり「チャートギャラリー」で、できた方が理想だ。

それならば、全部、画像ファイルに吐き出してしまえば、すべて解決する。
日足で、過去30年分だと 7,000~8,000日分になる。

これをいちいち、手作業で、1日ずつめくりながら
ハードコピーを取らなければならないと想像してしまう人には、
「それは無理だぁ」という考えになるかもしれない。
1枚あたり3秒かかるとしても、21,000秒~24,000秒、つまり6~7時間かかる。
これを根性でやり遂げた人がいたら、もちろん、称賛に値する 。

でも私の場合は、「ユースウェア」という技術があるので、
チャートギャラリーを1日ずつめくって7,000~8,000枚の画像を保存するのは、
「そんなの簡単だ」と、すぐに考えることができる。
私は根性はないので、手作業でやれと命令されたら「無理でぇ~す」になるけど、
自分なりのやり方でやってよければ、実現できる方法を探して、さっさと実現する。

そこで本題だけど、
チャートギャラリーを1日ずつめくって、1枚ずつハードコピー画像を保存するには、
「自動化」するソフト(ツール)を使えばよい。
今、はやりの言葉「RPA (obotic Process Automation)」も、ほぼ同じだ。

手作業でいちいち手間をかけて行っている作業は、
それを自動化することができれば、
その作業にかける時間を、
ほかのもっと重要なことに充てることができる。

たとえば、チャートギャラリーのハードコピー画面を、
大量に1枚ずつ保存しているのだったら、それを
トレード練習の時間に充てることができれば、その方がいい。

私はそんな思いで、今朝、とりあえず、
日経225先物 の 1990年から2017年までの画像を出力してみた。

 

使った道具は、uwsc という自動化ツールで、
次のようなスクリプトファイルを用意する。

// チャートギャラリーのウィンドウを選択
GETID("Chart Gallery")

// 真ん中付近で左クリック
BTN(LEFT,DOWN,533,23,0)

// [HOME] ボタンをクリック
KBD(VK_HOME , CLICK)

// 指定回数分繰り返し(数字は要調整)
FOR I = 1 TO 8000

// チャートギャラリーのウィンドウを選択
GETID("Chart Gallery")

// 右カーソルキーを押下
KBD(VK_RIGHT , CLICK)

// 0.5秒待つ
SLEEP(0.5)

// [Windowsキー]を押しながら[PrintScreen]キーを押下
KBD(VK_START , DOWN)
KBD(VK_SNAPSHOT , CLICK)
KBD(VK_START , UP)

// 0.5秒待つ
SLEEP(0.5)

NEXT

チャートギャラリーの画面を開いた状態で、これを実行すれば、
「右カーソルキーで1日めくって、ハードコピーを出力する」
という作業を、8,000回数分、繰り替えし自動実行してくれる。

すると、ピクチャ - スクリーンショット というフォルダに、
大量の画像が溜まってくるので、

これを一括で名前変更(rename)をするバッチファイルを作成して実行すれば、できあがり。

画像が溜まった後の、バッチファイルでの手順は、次のとおり。

 

(1)まず、チャートギャラリーで、チャートの数値データを、ファイル名をつけて(例 nik225f_D.txt)、テキスト出力しておく。
チャート画面で、 「表示」メニュー から 「表形式」を選択して、数値データの表示画面へ切り替える。

チャートギャラリーでデータ表示

チャートギャラリーでテキスト出力

 

(2)同じフォルダ内に、ファイル一覧をテキスト出力するためのバッチファイル「dir.bat」を作成し、実行する。

ファイル一覧を出力するためのバッチファイル

(3)自動出力された「ren.bat」を開き、一括リネーム処理を行うためのバッチファイルへと加工し、実行する。
縦方向のブロックコピー&貼り付け 等のテクニックも使うことになるので、
高機能なエディタソフト(秀丸エディタ 等)を使いこなしていないと、やや難易度が高いかもしれない。

一括リネーム用バッチファイル
加工前
一括リネーム用バッチファイル
加工後

 

以上のような操作は、大昔(MS-DOSの時代)からPCを使ってきた人が持っているスキルなので、新たに学ぶ機会は多くない。

最近の Windows PC でも、 昔のコマンドが発展しながら存続しているし、
PowerShell 等も使えるので、さらにいろいろな自動化ができるようになっているけど、
一部のシステム管理者を除いて、あまり利用する人はいない。

こういう、自動化の技があることを知っていると、ちょっと調べるだけで、
「やりたいこと」 が 「できること」 に変えることができるので、
自由度が高まって、時間をもっと有意義に使うことができるようになる。

「くりっく株365」の四本値をCSV形式で整形する方法

「くりっく株365」の四本値は、
無料でダウンロードすることは可能だけれども、
システムトレード用に、表形式にするには、
少しだけ加工する必要がある。

日経平均株価や現物株と違って、
「くりっく株365」はマイナーなので、
きれいな時系列の四本値データの入手は難しい。

そこで、EXCELを使ったデータ加工をしてみたので、
その方法を、紹介しておきたいと思う。
私は一応、「ユースウェア技師」という、幻の資格(?)
というか技能を持っているので、こういうのは得意である。

(1)価格データをCSV形式でダウンロードする

東京金融取引所の「くりっく株365:ヒストリカルデータベース」
https://www.tfx.co.jp/historical/cfd/
のページから、1年ずつ期間指定して、CSV形式でダウンロードする。

 

クリック株365のダウンドード画面

 

ファイル名を指定して、保存する。

クリック株365のCSVファイルの保存

以上の操作を、年数分、繰り返す。

 

(2)年単位にダウンロードしたファイルを、1つのCSVファイルにまとめる

ダウンロードしたファイルを、作業用ファイルにすべて移動させる。
この例では、 D:¥kabu365 というフォルダを作っている。

 

年単位に分かれたファイルを、1つの CSVファイルにまとめる。
メモ帳などのエディタを使って、1ファイルずつコピー&ペーストして作っても構わないけど、
面倒くさがり屋の人は、次のようなバッチファイルを作って、一発でやってしまう方が、楽になる。

 

合体されたファイル「cfd_result.csv」ファイルが出来上がる。

合体ファイル

(3)合体済みのCSVファイルをEXCELで開く

合体されたファイル「cfd_result.csv」をEXCELで開き、余分な箇所を削除する。
まず先に、主要な 四本値部分 を選択して、並び替えを行う。

合体済ファイルのEXCEL表示

 

次に、左の2列を削除する。

 

シートの一番下の方に、タイトル行他があるので、
タイトル行を1行だけ残して、それより下の行をすべて削除する。

 

タイトル行を選択して、切り取り、
先頭行に移動して、挿入する。

最後に、取引日で、並び替えを行う。

 

これで、クリック株365の四本値データが完成したので、
必要に応じてさらに加工し、CSV形式で保存すれば、できあがり。

 

ちなみに、この四本値を パンローリング社のチャートギャラリーで利用する場合は、
チャートギャラリー側であらかじめ、銘柄を新規登録(例えば 0365 「株365」)して、
指定のテキストファイルで取り込めばよい。

昨日分(2019/11/27)までのデータは、次のとおり。
これをチャートギャラリーで取り込めば、表示できると思う。

↓↓↓↓↓
株365のチャートギャラリー取込み用テキストデータ(kabu365_20101122-20191128.txt)

 

詳しい解説は、こちらへ。

https://www.hosono.org/2019/11/chartgallery-kabu365.html?m=1

日経平均株価の週足チャートと移動平均線 約17年間分(2003年~2019年)

日経平均株価の約17年間分(2003年~2019年)の動きを
週足チャートと移動平均線で俯瞰して見てみると、
現在(2019年11月)は、ちょうど、
上昇トレンド継続か?、それとも三番天井を打つか?
の転換点になっていることが分かる。

今までは、このような長期の俯瞰チャートを
ポイント・アンド・フィギュア または ローソク足だけ で
見ていたけれども、これに移動平均線を加えてみると、
今まで見えなかったものが、よく見えてくる。

前回高値(24,000円台)に到達して、上抜けたとしても、
その直後に すぐに下げてしまうようならば、
移動平均線の順番が入れ替わらないので、
失速してしまうリスクがある。

25,000円を上抜くほど、大きく上昇するか、あるいは、
24,000台で もみ合いながらも高値圏を維持できれば、
上昇時の「移動平均線パターン」になってくる。

上昇する時や、下落する時は、いつでも、
「移動平均線パターン」は、必ず 同じ経過を辿る。

だから、移動平均線は、
物理の諸法則と同じくらい、重要な意味を持つ。

ペイント練習用の「チャート隠し」ツール (カーソルキー版)

相場師朗先生の「株塾」で学んだ練習法の一つに、
チャート画面のハードコピー画像に、
売り買いのポイントや考察を書きこんで、
相場の流れをつかむ、という方法がある。

これを、野球やテニスなどの「素振り」練習のごとく、
毎日たくさん、習慣的にやることが推奨されている。

最初は、値動きの結果が見えている状態で、
つまり、カンニングしている状態で書き込んでいく。

ところがこのペイント練習は、
数をやっていくと、だんだんとマンネリ化して、
単純作業のように、手を抜いて行うようになりがちで、
これで脱落してしまう人も多い と想定される。

なので、ある程度分かってきたら、こんどは、
カンニングしなかった と仮定した想定で、
右の部分を一時的に隠して、本気で悩んで考えながら
こじつけて練習する、という練習を併用しながら、

だんだんとステップアップして実力をつけていくのが、
堅実なやりかただと思う。

ということで、
右の部分を一時的に隠して練習するのに、
私は、ちょっとしたツールを自作して使っている。

チャートギャラリーで建玉練習をする時のように、
キーボードの [右] カーソルキー で進めていきたい、
という こだわりがあるから、である。

ペイント練習用の「チャート隠し」ツール
ペイント練習用の「チャート隠し」ツール

以下のリンクをクリックすると、
ブラウザで1ページ開かれるので、
ペイント画面より前にこれを出して、
[右] カーソルキー でめくっていけばよい。

< ペイント練習用の、チャート隠しツール >
http://shunichi.hosono.com/chart-mask.html

このページは、普通の html ファイルなので、
ソースをコピーするか、ファイルに保存すれば
そのまま複製して、PCのハードディスクからでも起動できるし、
自分のPC環境に合わせて、内容を書き換えてもよい。

html の中に、以下の部分を貼り付ければ、動くと思う。
(Internet Explore か Edge で確認済み)

<script type="text/javascript">
<!--

window.focus();

Xsize = screen.width - 200
Ysize = screen.height

window.resizeTo( Xsize, Ysize ); // (左右 , 上下)
window.moveTo( 200, 0 ); // (左右 , 上下)

addEventListener("keydown", keydownfunc, false);

function keydownfunc( event ) {
var key_code = event.keyCode;

if( key_code === 37){ // 左に移動
window.moveBy( -5, 0); // (左右 , 上下)
window.resizeBy(+5, 0); // (左右 , 上下)
}
else if( key_code === 39){ // 右に移動
window.moveBy( 5, 0); // (左右 , 上下)
window.resizeBy(-5, 0); // (左右 , 上下)
}
}
// -->
</script>

チャートギャラリーの株価データを EXCELからピンポイントで参照する方法

パンローリング社の「チャートギャラリー」 というソフトは、
全銘柄の株価を過去30年分持っていて、そのデータを、
ActiveXコントロール で、VB や EXCEL等で利用することができる。

ところが、この機能については、
ソフトのヘルプ画面には記載されているが、
それ以外の情報があまりなく、
活用している人は多くないと思う。

パンローリング社のサイトで、
無料のサンプルプログラムが、
https://www.panrolling.com/etc/users/sakurai/
のサイトで公開されているけど、

株価を一括で読み出す方法は参考になるけれども、
ピンポイントで、たとえば

・「9101 日本郵船」の 「2019年7月17日」の「終値」を参照したい

というような場面で、どう使えばよいのか、分かりづらい。

メタトレーダー等、他のソフトとは違って、
「チャートギャラリー」は、プログラミングの専門家でなくても

EXCELから気軽に株価データをピンポイントで参照することができる

というのが特長であってほしい と思う。

先週、私がちょっと作ってみたので、
ノウハウを共有しておこうと思う。

「EXCELの関数」を作っておけば気軽に使える、

ので、独自関数として定義しておけばよい、ということになる。

次のような準備の後に、

・EXCELの「開発」タブの「Visual Basic」を選択

Visual Basic 設定

 

・マクロのセキュリティを押して、セキュリティセンターを表示

マクロのセキュリティ

 

・ActiveX の設定を確認

ActiveXの設定

 

・マクロの設定を確認

マクロの設定

 

・VBAの開発画面で、標準モジュールに追加して、プログラムを描き込む。

 

その後に、以下の関数を貼り付ければよい。
急いで作ったので、本格的に使うには、アレンジは必要かと思う。

関数の一覧

機能 関数名 引数 記述例
当日の始値を求める yori (銘柄コード, 取引日) =yori(1001, DATEVALUE(“2019/7/16”))
当日の高値を求める taka (銘柄コード, 取引日) =taka(1001, DATEVALUE(“2019/7/16”))
当日の安値を求める yasu (銘柄コード, 取引日) =yasu(1001, DATEVALUE(“2019/7/16”))
当日の終値を求める hike (銘柄コード, 取引日) =hike(1001, DATEVALUE(“2019/7/16”))
翌営業日の始値を求める yokuyori (銘柄コード, 取引日) =yokuyori(1001, DATEVALUE(“2019/7/16”))
翌営業日の終値を求める yokuhike (銘柄コード, 取引日) =yokuhike(1001, DATEVALUE(“2019/7/16”))
N営業日後を求める kdate (銘柄コード, 取引日, 加算日数N ) =kdate(1001, DATEVALUE(“2019/7/16”), 1)
銘柄名を求める kname (銘柄コード) =kname(1001)

 


'当日始値
Public Function yori(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yori = Prices.Open(DatePos)

End Function

'当日高値
Public Function taka(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    taka = Prices.High(DatePos)

End Function

'当日安値
Public Function yasu(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yasu = Prices.Low(DatePos)

End Function

'当日終値
Public Function hike(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    hike = Prices.Close(DatePos)

End Function

'翌営業日の始値
Public Function yokuyori(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1) + 1
    
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yokuyori = Prices.Open(DatePos)

End Function

'翌営業日の終値
Public Function yokuhike(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1) + 1
    
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yokuhike = Prices.Close(DatePos)

End Function

'取引日
Public Function kdate(kcode As String, startdate As Date, addcount As Integer) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(startdate, 1) + addcount
    
    Prices.Read kcode
    
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    kdate = Calendar.Date(DatePos)

End Function

'銘柄名
Public Function kname(kcode As String) As String

    Dim Names As New ActiveMarket.Names
    Dim C() As String, N() As String
    
    Names.AllNames AM_KINDFLAG_SPOTS, C, N
    
    mpos = Application.Match(kcode, C, False)
    
    If IsError(mpos) Then
       kname = mpos
    Else
       kname = N(mpos)
    End If
    
End Function

 

フォートラン プログラム用紙

家の中を整理していたら、
こんなものが発掘された。
「フォートラン プログラム用紙」

私は、これを使ったことはないけど、
その昔、コンピューターのプログラムは、
このような用紙に手書きで記入してから
入力専任者が入力する、というものだったらしい。

なぜそんな無駄なことを?? と思ったら、
昔は、今のようなエディタ等がないので、
入力した文字を都度訂正することができないので、
事前に完璧に清書しておく必要があったから? なのだろうか。

ワープロでさえも、最初の頃は、
事前に手書きで清書したものを入力する機械
として使われていたそうだ。

今はさすがにそんなことをしなくなったかもしれないけど、
事前に「人間が仕上げた 結果 」を入力して処理させる、
という発想は、あまり変わっていないのかもしれない。

便利になることと、効率的になることは、必ずしも一致しないのだろう。

細野俊一のトレーディング日記 再開

約16年前に、日経平均先物取引に初チャレンジした時の
「細野俊一のトレーディング日記」というホームページが、
自分のPCの中から発掘された。

その後、FXや株365等にチャレンジするも、
試行錯誤ばかりやっていて、利益が伴わなかったが、

今年になって相場師朗さんの書籍を見つけて、
「株塾」に入塾することになったのをきっかけに
利益を出す努力をしてみようと思い立った。

「株塾」3ヶ月目の節目なので、
トレーニングの過程を記録に残して、
自分の励みにしようと考えて、
次のブログを開始することにした。

「細野俊一のトレーディング日記」
https://usemanage.blogspot.com/

トレーディング関連の話は適時、
この新しいブログの方に更新していこうと思う。

ポイントアンドフィギュアによる、日経平均株価の値動き動画

日経平均株価の値動きを、一般的なチャートではなく、
ポイントアンドフィギュアという形のチャートで見ると、
「上下に」どのように動いてきたか? がよく見えてくる。

特に、レンジ相場から、支持線または抵抗線を突き破って
上下にブレイクアウトした時の、
値動きが跳んでいく様子が、よく見えてくる。

ポイントアンドフィギュアは、
時間の流れが一定速度ではないので、
途中経過が分かりづらい。

途中経過の歩みを見えるように改良したのが、
細野式ポイントアンドフィギュア である。

https://www.usemanage.jp/pfmonitor.asp

「ポイント&フィギュア」の基本に戻る

私はなぜ、「ポイント&フィギュア」にこだわるのか?

平成最期の日の今日、その答えが、とうとう分かった。
なぜ、こんな単純なことに気づかなかったのだろう。
今まで、遠回りしすぎていて、本質をすっかり見失っていた。

「ポイント&フィギュア」に独自の改良を加えて、
その欠点を補おうと、いろいろ工夫してみたが、
そんな必要も なかったかもしれない。

「ポイント&フィギュア」の極意は、
「価格の動きだけをシンプルに見せること」
なので、その基本に帰ったら、見るべきものが見えてきた。

「ポイント&フィギュア」だからこそ実現できる売買手法が、すごいのだった。

令和元年、「細野式トレーディング」が本格始動します。

https://www.usemanage.jp/pandf/

 

3DプリンタのSDカード内のファイル数は少なくしておこう

3Dプリンタ「ANYCUBIC I3 MEGA」を使っていたけど、ここ最近、

「印刷開始直後に、すぐに終了して、何も動かない」
「印刷途中なのに、終了してしまう」

という、おかしな事象が起きるようになった。

機械の調子が悪いわけでもなく、ファイルの中身も問題なさそうだし、
この事象が発生するファイルと発生しないファイルがあって、
一体何が原因なのか分からないので、気持ちが悪かった。

いろいろ調べてみたら、SDカードからプリントする場合、
ファイル数が増えてきたり、
日本語のファイル名が存在すると調子が悪くなる、
という事象があるらしい。

いつも使っているSDカードを調べてみたら、
日本語名のフォルダが1つあって、
ファイルが60個以上あった。

これらのファイルを、下のフォルダへ移動させたら、
おかしな事象はすべて解決した。

「SDカード内のファイル数」が原因だったというのは意外だったけど、
安価な3Dプリンタでは、まだまだ このレベルのトラブルは
覚悟しておく必要がありそうだ。


My Company Links

合資会社ユースマネージメント
ドメインサービス
ユースマネージモール umall.jp

My Website Links

細野俊一のトレーディング日記
大安心と大冒険を求めて
「生命の科学」学習メモ
細野俊一の雑記ブログ
インターネット活用の入り口

Facebook Pages

ポイント&フィギュア活用研究会
合資会社ユースマネージメント
ユースマネージモール
アダムスキー「生命の科学」活用研究会
細野俊一 (宇宙哲学研究家)