From 8221d9ae178ffa5432202c8d61a9d178c8f2119e Mon Sep 17 00:00:00 2001 From: Harry Brundage Date: Sat, 19 Nov 2011 21:17:42 -0500 Subject: [PATCH] work --- Gemfile | 4 +++ Gemfile.lock | 8 ++++++ exchange_server.rb | 3 +++ redis_scripts/fill_order.lua | 2 +- sender_python/.Sender.py.swp | Bin 12288 -> 12288 bytes sms_server.rb | 50 +++++++++++++++++++++++++++++++++++ snapshot.rb | 2 +- test/test.rb | 14 +++++----- trade_manager.rb | 12 +++++++++ 9 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 sms_server.rb diff --git a/Gemfile b/Gemfile index a8df78e..4f6f76b 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,10 @@ group :server do gem 'redis-scripted', :require => "redis/scripted" end +group :sms do + gem 'twilio-ruby' +end + group :test do gem 'turn' gem 'minitest', '~> 2.7.0' diff --git a/Gemfile.lock b/Gemfile.lock index 5aef6f5..aa20e5f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,6 +4,7 @@ GEM ansi (1.4.0) async-rack (0.5.1) rack (~> 1.1) + builder (3.0.0) em-synchrony (1.0.0) eventmachine (>= 1.0.0.beta.1) eventmachine (1.0.0.beta.4) @@ -24,6 +25,8 @@ GEM rack (>= 1.0.0) url_mount (~> 0.2.1) json (1.6.1) + jwt (0.1.4) + json (>= 1.2.4) log4r (1.1.9) minitest (2.7.0) multi_json (1.0.3) @@ -45,6 +48,10 @@ GEM tilt (1.3.3) turn (0.8.3) ansi + twilio-ruby (3.4.2) + builder (>= 2.1.2) + jwt (>= 0.1.2) + multi_json (>= 1.0.3) url_mount (0.2.1) rack will_paginate (3.0.2) @@ -63,4 +70,5 @@ DEPENDENCIES redis-scripted sinatra turn + twilio-ruby will_paginate diff --git a/exchange_server.rb b/exchange_server.rb index a6b9c86..4e71154 100644 --- a/exchange_server.rb +++ b/exchange_server.rb @@ -97,7 +97,10 @@ def validate(params) @twilio = params['Twilio'] if @twilio != 'Y' and @twilio != 'N' return 'T' + else + @twilio = @twilio == 'Y' end + @price = params['Price'].to_f if @price > 100000 or @price < 1 return "X" diff --git a/redis_scripts/fill_order.lua b/redis_scripts/fill_order.lua index 859e633..4ead9d6 100644 --- a/redis_scripts/fill_order.lua +++ b/redis_scripts/fill_order.lua @@ -1,6 +1,6 @@ local MAX_ID = 100000000 local stock, order_type = KEYS[1], KEYS[2] -local from, shares, price, twilio, broker, created = ARGV[1], tonumber(ARGV[2]), tonumber(ARGV[3]), tonumber(ARGV[4]), ARGV[5], ARGV[6] +local from, shares, price, twilio, broker, created = ARGV[1], tonumber(ARGV[2]), tonumber(ARGV[3]), ARGV[4], ARGV[5], ARGV[6] function score(price, id, order_type) if order_type == 'buy' then diff --git a/sender_python/.Sender.py.swp b/sender_python/.Sender.py.swp index c09fa99f9ae72dfa2e857bc1cdad2b8aea0d1cda..b9a06ebbd69b505d1910e021a36fb926a73d47d8 100644 GIT binary patch delta 177 zcmZojXh={=G6?hZRWR2xW&i>K28LT7kNffH_A+eiWnjq2FUm{IEGnL;sK8#HnOB^X zUp`S$QLGLouJ4?mlB%B!B(f57H&*2^3-U4;8yOmaj8axoR1g*l-K;3U$TLZRMY0|! z#src80!awPzzCu@3kp2upQOMdc$u4lA(#g!0(1pf#biN+bfzGl&5SHpxi<&vtYroO DTKXuU delta 172 zcmZojXh={K28N!O$Ne0{*cf_%?9$@YqKOMtIMPy6@{1C~d?zkc z;Hv`(>L=%?q-G`N8f|RKVHO2yEG number, + :to => order['from'], + :body => sms_body(order, trade) + ) +end + +def sms_body(order, trade) + "Your order #{order['id']} has been executed for #{trade['shares']} shares. Your match # is #{trade['id']} and the trade executed at #{trade['price'].to_f / 100} per share." +end + +subscriber.subscribe('trades') do |on| + on.message do |channel, message| + trade = TradeManager.get(message) + buy_order = TradeManager.get_root(trade['buy_order']) + sell_order = TradeManager.get_root(trade['sell_order']) + + puts "*******" + puts buy_order + puts sell_order + + [buy_order, sell_order].each do |order| + notify_via_sms(order, trade) if order['twilio'] == 'true' + end + end +end diff --git a/snapshot.rb b/snapshot.rb index 8762fd6..674074f 100644 --- a/snapshot.rb +++ b/snapshot.rb @@ -27,7 +27,7 @@ def all_rows end ITEM_TO_ROW = {'created' => 'timestamp', 'shares' => 'amount', 'stock' => 'symbol', 'price' => 'price'} - TRADE_TO_ROW = ITEM_TO_ROW.merge({'buy_order_id' => 'buyOrderRef', 'sell_order_id' => 'sellOrderRef', 'id' => 'matchNumber'}) + TRADE_TO_ROW = ITEM_TO_ROW.merge({'buy_order' => 'buyOrderRef', 'sell_order' => 'sellOrderRef', 'id' => 'matchNumber'}) ORDER_TO_ROW = ITEM_TO_ROW.merge({'from' => 'phone', 'parent' => 'parentOrderRef', 'twilio' => false, 'broker' => false, 'id' => 'orderRef'}) def trade_to_row(raw) diff --git a/test/test.rb b/test/test.rb index 3c524cd..f700754 100644 --- a/test/test.rb +++ b/test/test.rb @@ -3,11 +3,9 @@ @manager = StockManager.new("apple") @manager.reset! -100.times do -@manager.buy("1234", 50, 91, false, "a") -@manager.buy("1234", 150, 91, false, "a") -@manager.buy("1234", 100, 92, false, "a") -@manager.sell("1234", 200, 90, false, "a") -@manager.sell("1234", 200, 90, false, "a") -@manager.buy("1234", 100, 92, false, "a") -end +@manager.buy("1234", 50, 91, true, "a") +@manager.buy("1234", 150, 91, true, "a") +@manager.buy("1234", 100, 92, true, "a") +@manager.sell("1234", 200, 90, true, "a") +@manager.sell("1234", 200, 90, true, "a") +@manager.buy("1234", 100, 92, true, "a") diff --git a/trade_manager.rb b/trade_manager.rb index 8c27793..bd8df05 100644 --- a/trade_manager.rb +++ b/trade_manager.rb @@ -1,3 +1,7 @@ +$redis = Redis::Scripted.connect(scripts_path: "./redis_scripts") + +require 'stock_manager' +require 'trade_manager' require File.expand_path('./stock_manager', File.dirname(__FILE__)) class TradeManager @@ -12,4 +16,12 @@ def self.get(id) ['shares', 'price'].each { |k| hash[k] = hash[k].to_i } end end + + def self.get_root(id) + order = self.get(id) + until order['parent_id'].nil? || order['parent_id'].empty? + order = self.get(order['parent_id']) + end + order + end end