MySQLにレート情報を格納する

笑えないほどに、FXの洗礼を受けたばかりですが・・・ 懲りずにシストレに利用するツールを紹介します。
Metatrader4もそうですが、シストレを実現するには過去のレート情報は必須だと思います。過去データをもとに自分なりの取引手法をのせたプログラムを作って運用しているはずです。下記は、clickclientを利用してMySQLにデータを入れるサンプルプログラムです。※実際の実行には、MySQLのDB・テーブル作成が必要です。

下記は、GBPUSDのテーブル作成例です。
mysql> create table GBPUSD( id bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, access_date datetime not null, create_date timestamp not null, bid float(6,2) unsigned, ask float(6,2) unsigned);

サンプルでは、USDJPY・EURJPY・GBPJPY・EURUSD・GBPUSDを登録しております。

#!/usr/bin/ruby

require "rubygems"
require "clickclient"
require "mysql"
require "date"
require "syslog"

def daemon
  return yield if $DEBUG
  Process.fork{
    Process.setsid
    Dir.chdir "/"
    Signal.trap(:INT){  exit! 0 }
    Signal.trap(:TERM){ exit! 0 }
    Signal.trap(:HUP){  exit! 0 }
    File.open("/dev/null", "r+"){|f|
      STDIN.reopen f
      STDOUT.reopen f
      STDERR.reopen f
  }
 yield
 }
 exit! 0
end

	Syslog.open("clickdaemon")
	Syslog.log(Syslog::LOG_INFO, "clickdaemon start")
  Syslog.close

class Cclick
	attr_accessor :list
	def initialize
		@client = ClickClient::Client.new
		@client.host_name = "https://fx-demo.click-sec.com"
		@USER = 'XXXXX'
		@PASS = 'XXXXX'
	end

	def insertdb
		@client.fx_session(@USER,@PASS){|fx|
  	@list = fx.list_rates # レートを取得
		@dtime = DateTime.now
		@object = Mysql::new('localhost', 'username', 'password', 'dbname')
  	@list.each() { |k,info|
			if k == 1
			access_date = @dtime.strftime("%Y-%m-%d %H:%M:%S")
			@object.query("insert into USDJPY(access_date,bid,ask) values ('#{access_date}','#{info.bid}','#{info.ask}');")
			elsif k == 2
			access_date = @dtime.strftime("%Y-%m-%d %H:%M:%S")
			@object.query("insert into EURJPY(access_date,bid,ask) values ('#{access_date}','#{info.bid}','#{info.ask}');")
			elsif k == 3
			access_date = @dtime.strftime("%Y-%m-%d %H:%M:%S")
			@object.query("insert into GBPJPY(access_date,bid,ask) values ('#{access_date}','#{info.bid}','#{info.ask}');")
			elsif k == 9
			access_date = @dtime.strftime("%Y-%m-%d %H:%M:%S")
			@object.query("insert into EURUSD(access_date,bid,ask) values ('#{access_date}','#{info.bid}','#{info.ask}');")
			elsif k == 10 
			access_date = @dtime.strftime("%Y-%m-%d %H:%M:%S")
			@object.query("insert into GBPUSD(access_date,bid,ask) values ('#{access_date}','#{info.bid}','#{info.ask}');")
			end
  	}
		@object.close
		}
	end	
end

daemon {
	begin
		# 通常処理
		insdb = Cclick.new

		while 1
			rdone = insdb.insertdb
			sleep 1
		end

		rescue => exc
			system("/etc/init.d/clickd restart")
			Syslog.open("clickdaemon")
			Syslog.log(Syslog::LOG_WARNING, "%s", exc)
    	Syslog.close
	end
}