finexclub 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.1
@@ -7,45 +7,94 @@ require "cgi"
7
7
  require File.dirname(__FILE__) + "/../lib/finexclub"
8
8
  require "optparse"
9
9
 
10
- class GenFactory
11
- def self.get(gen)
12
- case gen
13
- when 'alpha'
14
- AlphaGen.new
15
- when 'zeta'
16
- ZetaGen.new
10
+ module Generator
11
+ class << self
12
+ def get(gen)
13
+ class_name = gen.to_s.gsub(/^(.)/) { $1.upcase }
14
+ const_get(class_name).new
15
+ end
16
+
17
+ def all
18
+ constants.map { |e| e.downcase }
19
+ end
20
+
21
+ def rand_price(n = nil)
22
+ n ||= 10000
23
+ rand(n)/n.to_f
24
+ end
25
+
26
+ def rand_index
27
+ rand(100)
17
28
  end
18
29
  end
19
- end
20
30
 
21
- class AlphaGen
22
- def name
23
- 'alpha'
31
+
32
+ class Alpha
33
+ def name
34
+ 'alpha'
35
+ end
36
+
37
+ def generate(options = {})
38
+ Finexclub::Chart::SYMBOLS.inject([]) do |data, symbol|
39
+ data << ["alpha[][symbol]", symbol.upcase]
40
+ data << ["alpha[][index]", Generator.rand_index]
41
+ data << ["alpha[][direction]", rand > 0.5? 1 : 0]
42
+ end
43
+ end
24
44
  end
25
45
 
26
- def generate(options = {})
27
- Finexclub::Chart::SYMBOLS.inject([]) do |data, symbol|
28
- data << ["alpha[][symbol]", symbol.upcase]
29
- data << ["alpha[][index]", rand(100)]
30
- data << ["alpha[][direction]", rand > 0.5? 1 : 0]
46
+ class Zeta
47
+ def name
48
+ 'zeta'
49
+ end
50
+
51
+ def generate(options = {})
52
+ symbol = options[:symbol] || raise("--symbol option is missing")
53
+ data = []
54
+ data << ["zeta[][symbol]", symbol.upcase]
55
+ data << ["zeta[][up_support]", Generator.rand_price]
56
+ data << ["zeta[][up_resist]", Generator.rand_price]
57
+ data << ["zeta[][down_support]", Generator.rand_price]
58
+ data << ["zeta[][down_resist]", Generator.rand_price]
59
+ data << ["zeta[][screenshot_filename]", "#{symbol.upcase}_ZETA.gif"]
31
60
  end
32
61
  end
33
- end
34
62
 
35
- class ZetaGen
36
- def name
37
- 'zeta'
63
+ class Prognosis
64
+ def name
65
+ 'prognosis'
66
+ end
67
+
68
+ def generate(options = {})
69
+ symbol = options[:symbol] || raise("--symbol option is missing")
70
+ actions = %w(buy sell hold_sell hold_buy stop)
71
+ data = []
72
+ data << ["prognosis[][symbol]", symbol.upcase]
73
+ data << ["prognosis[][action]", actions[rand(actions.size)]]
74
+ data << ["prognosis[][take_profit]", Generator.rand_price]
75
+ data << ["prognosis[][profit]", Generator.rand_index]
76
+ data << ["prognosis[][screenshot_filename]", "PROGNOSIS.png"]
77
+ end
38
78
  end
39
79
 
40
- def generate(options = {})
41
- symbol = options[:symbol] || raise("ZetaGen :symbol option is missing")
42
- data = []
43
- data << ["zeta[][symbol]", symbol.upcase]
44
- data << ["zeta[][up_support]", rand(10)]
45
- data << ["zeta[][up_resist]", rand(10)]
46
- data << ["zeta[][down_support]", rand(10)]
47
- data << ["zeta[][down_resist]", rand(10)]
48
- data << ["zeta[][screenshot_filename]", "#{symbol.upcase}_ZETA.gif"]
80
+ class Octopus
81
+ def name
82
+ 'octopus'
83
+ end
84
+
85
+ def generate(options = {})
86
+ symbol = options[:symbol] || raise("--symbol option is missing")
87
+ actions = %w(buy sell hold_sell hold_buy stop)
88
+ data = []
89
+ data << ["octopus[][symbol]", symbol.upcase]
90
+ data << ["octopus[][action]", actions[rand(actions.size)]]
91
+ data << ["octopus[][take_profit]", Generator.rand_price]
92
+ data << ["octopus[][profit]", rand(100)]
93
+ data << ["octopus[][stop_loss]", Generator.rand_price]
94
+ data << ["octopus[][loss]", rand(100)]
95
+ data << ["octopus[][index]", Generator.rand_index]
96
+ data << ["octopus[][screenshot_filename]", "OCTOPUS.png"]
97
+ end
49
98
  end
50
99
  end
51
100
 
@@ -73,11 +122,13 @@ class FakeUpdater
73
122
  end
74
123
  end
75
124
 
125
+ STRATEGIES = %w(trends finexclub)
126
+
76
127
  options = {}
77
128
  options[:host] = 'localhost'
78
129
  options[:port] = 9292
79
130
  opts = OptionParser.new do |opts|
80
- opts.banner = "Usage: fake_updater.rb alpha|zeta|mega_load [options]"
131
+ opts.banner = "Usage: finexclub_updater [options]"
81
132
 
82
133
  opts.on("-a", "--address ADDRESS", "Host to send, default is #{options[:host]}") do |h|
83
134
  options[:host] = h
@@ -96,25 +147,35 @@ opts = OptionParser.new do |opts|
96
147
  exit
97
148
  end
98
149
 
99
- opts.on_tail("-g GENERATOR", %w/alpha zeta mega_load/, "One of the generators to send (alpha, zeta)") do |g|
150
+ opts.on_tail("-g GENERATOR", Generator.all, "One of the generators to send (#{(Generator.all).join(', ')})") do |g|
100
151
  options[:generator] = g
101
152
  end
153
+
154
+ opts.on_tail("-r STRATEGY", STRATEGIES, "One of the strategies to use (#{STRATEGIES.join(', ')})") do |r|
155
+ options[:strategy] = r
156
+ end
102
157
  end
103
158
  opts.parse!
104
159
 
105
- case options[:generator]
106
- when 'alpha', 'zeta'
107
- FakeUpdater.new(options[:host], options[:port]).send(GenFactory.get(options[:generator]), options)
108
- when 'mega_load'
160
+ unless options[:generator].nil?
161
+ FakeUpdater.new(options[:host], options[:port]).send(Generator.get(options[:generator]), options)
162
+ exit
163
+ end
164
+
165
+ case options[:strategy]
166
+ when 'trends'
109
167
  f = FakeUpdater.new(options[:host], options[:port])
110
- a = AlphaGen.new
111
- z = ZetaGen.new
112
- f.send(a)
168
+ f.send(Generator::Alpha.new)
113
169
  Finexclub::Chart::SYMBOLS.each do |symbol|
114
- f.send(z, :symbol => symbol)
170
+ f.send(Generator::Zeta.new, :symbol => symbol)
171
+ end
172
+ when 'finexclub'
173
+ f = FakeUpdater.new(options[:host], options[:port])
174
+ Finexclub::Chart::SYMBOLS.each do |symbol|
175
+ f.send(Generator::Octopus.new, :symbol => symbol)
176
+ f.send(Generator::Prognosis.new, :symbol => symbol)
115
177
  end
116
178
  else
117
179
  puts opts
118
180
  end
119
181
 
120
-
data/finexclub.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{finexclub}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex Levin"]
12
- s.date = %q{2010-10-06}
12
+ s.date = %q{2010-10-11}
13
13
  s.default_executable = %q{finexclub_updater}
14
14
  s.description = %q{Finexclub gem stores and retrieves Forex signals and screenshots. It is the heart of the http://trendsonforex.com and http://finexclub.net}
15
15
  s.email = %q{clubfinex@gmail.com}
@@ -38,6 +38,8 @@ Gem::Specification.new do |s|
38
38
  "lib/finexclub/manager.rb",
39
39
  "lib/finexclub/signal.rb",
40
40
  "lib/finexclub/signals/alpha.rb",
41
+ "lib/finexclub/signals/octopus.rb",
42
+ "lib/finexclub/signals/prognosis.rb",
41
43
  "lib/finexclub/signals/zeta.rb",
42
44
  "samples/egg.png",
43
45
  "spec/finexclub/alpha_spec.rb",
@@ -47,6 +49,8 @@ Gem::Specification.new do |s|
47
49
  "spec/finexclub/document_spec.rb",
48
50
  "spec/finexclub/images_spec.rb",
49
51
  "spec/finexclub/manager_spec.rb",
52
+ "spec/finexclub/octopus_spec.rb",
53
+ "spec/finexclub/prognosis_spec.rb",
50
54
  "spec/finexclub/signal_spec.rb",
51
55
  "spec/finexclub/zeta_spec.rb",
52
56
  "spec/spec_helper.rb"
@@ -57,11 +61,13 @@ Gem::Specification.new do |s|
57
61
  s.rubygems_version = %q{1.3.6}
58
62
  s.summary = %q{Little helper to maintain Forex signals and screenshots}
59
63
  s.test_files = [
60
- "spec/finexclub/signal_spec.rb",
64
+ "spec/finexclub/octopus_spec.rb",
65
+ "spec/finexclub/signal_spec.rb",
61
66
  "spec/finexclub/manager_spec.rb",
62
67
  "spec/finexclub/app_spec.rb",
63
68
  "spec/finexclub/alpha_spec.rb",
64
69
  "spec/finexclub/core_spec.rb",
70
+ "spec/finexclub/prognosis_spec.rb",
65
71
  "spec/finexclub/images_spec.rb",
66
72
  "spec/finexclub/chart_spec.rb",
67
73
  "spec/finexclub/document_spec.rb",
@@ -15,26 +15,20 @@ module Finexclub
15
15
  @signals = {}
16
16
  end
17
17
 
18
- def alpha=(arr)
19
- @signals[:alpha]= arr
18
+ [:alpha, :zeta, :octopus, :prognosis].each do |indicator|
19
+ define_method("#{indicator}=") do |arr|
20
+ @signals[indicator] = arr
21
+ end
22
+
23
+ define_method(indicator) do
24
+ Signal.build(core, indicator, signals(indicator).last)
25
+ end
20
26
  end
21
27
 
22
- def zeta=(arr)
23
- @signals[:zeta]= arr
24
- end
25
-
26
- def signals(type)
27
- @signals[type]
28
- end
29
-
30
- def alpha
31
- Signal.build(core, :alpha, signals(:alpha).last)
28
+ def signals(indicator)
29
+ @signals[indicator]
32
30
  end
33
31
 
34
- def zeta
35
- Signal.build(core, :zeta, signals(:zeta).last)
36
- end
37
-
38
32
  def to_doc
39
33
  {:symbol => symbol, :date => updated_date}
40
34
  end
@@ -24,11 +24,14 @@ module Finexclub
24
24
  end
25
25
  end
26
26
 
27
- def find(symbol, date)
28
- if symbol == :all
27
+ def find(symbol_or_array, date)
28
+ case symbol_or_array
29
+ when :all
29
30
  signals.find(:date => date)
30
- else
31
- signals.find_one(:date => date, :symbol => symbol)
31
+ when Array
32
+ signals.find(:date => date, :symbol => {:$in => symbol_or_array})
33
+ when String
34
+ signals.find_one(:date => date, :symbol => symbol_or_array)
32
35
  end
33
36
  end
34
37
  end
@@ -46,13 +46,6 @@ module Finexclub
46
46
  }.merge(options)
47
47
  end
48
48
 
49
- def add_signals
50
- Chart::SYMBOLS.each do |symbol|
51
- Finexclub.store(:alpha, raw_alpha_hash("symbol"=>symbol.upcase))
52
- Finexclub.store(:zeta, raw_zeta_hash("symbol"=>symbol.upcase))
53
- end
54
- end
55
-
56
49
  def clear_signals
57
50
  Finexclub.signals.collection.remove
58
51
  end
@@ -16,8 +16,9 @@ module Finexclub
16
16
  end
17
17
 
18
18
  def store(filename)
19
- path = File.expand_path(File.join(screenshot_path, filename))
20
- app.store(File.new(path))
19
+ path = screenshot_path || ""
20
+ file = File.expand_path(File.join(path, filename))
21
+ app.store File.new(file)
21
22
  end
22
23
 
23
24
  def configure_endpoint(path_prefix = nil)
@@ -0,0 +1,19 @@
1
+ module Finexclub
2
+ module Signals
3
+
4
+ class Octopus < Signal
5
+ field :symbol, :symbol
6
+ field :updated, :timestamp
7
+ field :action, :string
8
+ field :take_profit, :float
9
+ field :profit, :integer
10
+ field :stop_loss, :float
11
+ field :loss, :integer
12
+ field :index, :integer
13
+ field :screenshot, :image
14
+
15
+ doc_fields :updated, :action, :take_profit, :profit, :stop_loss, :loss, :index, :screenshot
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ module Finexclub
2
+ module Signals
3
+
4
+ class Prognosis < Signal
5
+ field :symbol, :symbol
6
+ field :updated, :timestamp
7
+ field :action, :string
8
+ field :take_profit, :float
9
+ field :profit, :integer
10
+ field :screenshot, :image
11
+
12
+ doc_fields :updated, :action, :take_profit, :profit, :screenshot
13
+ end
14
+
15
+ end
16
+ end
@@ -3,13 +3,13 @@ require File.dirname(__FILE__) + '/../spec_helper'
3
3
  describe 'Finexclub::Signals::Alpha' do
4
4
  before do
5
5
  @core = mock_core
6
- @alpha = Finexclub::Signals::Alpha.new(@core)
6
+ @signal = Finexclub::Signals::Alpha.new(@core)
7
7
  end
8
8
 
9
9
  it 'should provide attribute accessors' do
10
- @alpha.build("direction" => 1, "index" => 100)
11
- @alpha.direction.should == 1
12
- @alpha.index.should == 100
10
+ @signal.build("direction" => 1, "index" => 100)
11
+ @signal.direction.should == 1
12
+ @signal.index.should == 100
13
13
  end
14
14
 
15
15
  {
@@ -18,8 +18,8 @@ describe 'Finexclub::Signals::Alpha' do
18
18
  0 => :bearish
19
19
  }.each do |direction, trend|
20
20
  it "should return #{trend} trend when direction is #{direction}" do
21
- @alpha.direction = direction
22
- @alpha.trend.should == trend
21
+ @signal.direction = direction
22
+ @signal.trend.should == trend
23
23
  end
24
24
  end
25
25
 
@@ -31,17 +31,17 @@ describe 'Finexclub::Signals::Alpha' do
31
31
  :unstable => 0..60
32
32
  }.each do |stability, range|
33
33
  it "should return #{stability} stability when index within #{range}" do
34
- @alpha.index = range.first
35
- @alpha.stability.should == stability
34
+ @signal.index = range.first
35
+ @signal.stability.should == stability
36
36
 
37
- @alpha.index = range.last
38
- @alpha.stability.should == stability
37
+ @signal.index = range.last
38
+ @signal.stability.should == stability
39
39
  end
40
40
  end
41
41
 
42
42
  it 'should export valid doc' do
43
- @alpha.build("direction" => 1, "index" => 100, "updated" => 123)
44
- @alpha.to_doc.should == {:updated => 123, :index => 100, :direction => 1}
43
+ @signal.build("direction" => 1, "index" => 100, "updated" => 123)
44
+ @signal.to_doc.should == {:updated => 123, :index => 100, :direction => 1}
45
45
  end
46
46
  end
47
47
 
@@ -27,19 +27,6 @@ describe 'Finexclub::Chart' do
27
27
  @chart.date.should == '2010-09-08'
28
28
  @chart.updated.should == @ts
29
29
  end
30
-
31
- it 'should return all alpha signals' do
32
- @chart.signals(:alpha).should.equal [@a1, @a2]
33
- end
34
-
35
- it 'should return all zeta signals' do
36
- @chart.signals(:zeta).should.equal [@z1, @z2]
37
- end
38
-
39
- it 'should return latest alpha signal as Alpha' do
40
- Finexclub::Signal.should.receive(:build).with(@core, :alpha, @a2).and_return(a = mock('alpha'))
41
- @chart.alpha.should == a
42
- end
43
30
 
44
31
  it 'should return latest zeta signals as Zeta' do
45
32
  Finexclub::Signal.should.receive(:build).with(@core, :zeta, @z2).and_return(z = mock('zeta'))
@@ -47,5 +34,28 @@ describe 'Finexclub::Chart' do
47
34
  end
48
35
  end
49
36
 
37
+ [
38
+ :alpha,
39
+ :zeta,
40
+ :octopus,
41
+ :prognosis
42
+ ].each do |indicator|
43
+ describe "#{indicator} signals" do
44
+ before do
45
+ @s1, @s2 = mock("signal_#{indicator}_1"), mock("signal_#{indicator}_2")
46
+ @chart.build(indicator => [@s1, @s2])
47
+ end
48
+
49
+ it "should provide :#{indicator} signals" do
50
+ @chart.signals(indicator).should == [@s1, @s2]
51
+ end
52
+
53
+ it "should return latest :#{indicator} wrapped as Signal" do
54
+ Finexclub::Signal.should.receive(:build).with(@core, indicator, @s2).and_return(a = mock('signal'))
55
+ @chart.send(indicator).should == a
56
+ end
57
+ end
58
+ end
59
+
50
60
  end
51
61
 
@@ -1,7 +1,10 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe 'Finexclub::Core' do
3
+ Finexclub.configure do |f|
4
+ f.signals.db = Mongo::Connection.new.db("finexclub_test")
5
+ end
4
6
 
7
+ describe 'Finexclub::Core' do
5
8
  describe '.instance' do
6
9
  it 'should create instance if it does not already exists' do
7
10
  app = Finexclub::Core.instance
@@ -66,6 +69,11 @@ describe 'Finexclub::Core' do
66
69
  @core.find(:all, "2010-10-01").should == c
67
70
  end
68
71
 
72
+ it 'should fetch an array of charts for given date' do
73
+ @core.signals.should.receive(:find).with({:symbol => {:$in => ["eurusd", "usdjpy"]}, :date => "2010-10-01"}).and_return(c = mock('cursor'))
74
+ @core.find(["eurusd", "usdjpy"], "2010-10-01").should == c
75
+ end
76
+
69
77
  it 'should allow fetching signals by date and symbol' do
70
78
  @core.signals.should.receive(:find_one).with({:date => "2010-10-01", :symbol => "eurusd"}).and_return(chart = mock('chart'))
71
79
  @core.find("eurusd", "2010-10-01").should == chart
@@ -0,0 +1,38 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe 'Finexclub::Signals::Octopus' do
4
+ before do
5
+ @core = mock_core
6
+ @signal = Finexclub::Signals::Octopus.new(@core)
7
+ end
8
+
9
+ it 'should have meta' do
10
+ Finexclub::Signals::Octopus.meta.should == {
11
+ :updated => :timestamp,
12
+ :symbol => :symbol,
13
+ :action => :string,
14
+ :take_profit => :float,
15
+ :profit => :integer,
16
+ :stop_loss => :float,
17
+ :loss => :integer,
18
+ :index => :integer,
19
+ :screenshot => :image
20
+ }
21
+ end
22
+
23
+ it 'should export valid doc' do
24
+ @core.images.stub!(:store).and_return('image_uid')
25
+ @signal.build("updated" => 123, "action" => "sell", "take_profit" => 1.5, "profit" => 10, "stop_loss" => 1.7, "loss"=>10, "index" => 50, "screenshot_filename"=>"whatever.png")
26
+ @signal.to_doc.should == {
27
+ :updated => 123,
28
+ :action => "sell",
29
+ :take_profit => 1.5,
30
+ :profit => 10,
31
+ :stop_loss => 1.7,
32
+ :loss => 10,
33
+ :index => 50,
34
+ :screenshot => "image_uid"
35
+ }
36
+ end
37
+ end
38
+
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe 'Finexclub::Signals::Prognosis' do
4
+ before do
5
+ @core = mock_core
6
+ @prognosis = Finexclub::Signals::Prognosis.new(@core)
7
+ end
8
+
9
+ it 'should have meta' do
10
+ Finexclub::Signals::Prognosis.meta.should == {
11
+ :updated => :timestamp,
12
+ :symbol => :symbol,
13
+ :action => :string,
14
+ :take_profit => :float,
15
+ :profit => :integer,
16
+ :screenshot => :image
17
+ }
18
+ end
19
+
20
+ it 'should export valid doc' do
21
+ @core.images.stub!(:store).and_return('image_uid')
22
+ @prognosis.build("updated" => 123, "action" => "sell", "take_profit" => 1.5, "profit" => 10, "screenshot_filename"=>"whatever.png")
23
+ @prognosis.to_doc.should == {
24
+ :updated => 123,
25
+ :action => "sell",
26
+ :take_profit => 1.5,
27
+ :profit => 10,
28
+ :screenshot => "image_uid"
29
+ }
30
+ end
31
+ end
32
+
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 2
7
8
  - 1
8
- - 1
9
- version: 0.1.1
9
+ version: 0.2.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alex Levin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-06 00:00:00 +07:00
17
+ date: 2010-10-11 00:00:00 +07:00
18
18
  default_executable: finexclub_updater
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -130,6 +130,8 @@ files:
130
130
  - lib/finexclub/manager.rb
131
131
  - lib/finexclub/signal.rb
132
132
  - lib/finexclub/signals/alpha.rb
133
+ - lib/finexclub/signals/octopus.rb
134
+ - lib/finexclub/signals/prognosis.rb
133
135
  - lib/finexclub/signals/zeta.rb
134
136
  - samples/egg.png
135
137
  - spec/finexclub/alpha_spec.rb
@@ -139,6 +141,8 @@ files:
139
141
  - spec/finexclub/document_spec.rb
140
142
  - spec/finexclub/images_spec.rb
141
143
  - spec/finexclub/manager_spec.rb
144
+ - spec/finexclub/octopus_spec.rb
145
+ - spec/finexclub/prognosis_spec.rb
142
146
  - spec/finexclub/signal_spec.rb
143
147
  - spec/finexclub/zeta_spec.rb
144
148
  - spec/spec_helper.rb
@@ -173,11 +177,13 @@ signing_key:
173
177
  specification_version: 3
174
178
  summary: Little helper to maintain Forex signals and screenshots
175
179
  test_files:
180
+ - spec/finexclub/octopus_spec.rb
176
181
  - spec/finexclub/signal_spec.rb
177
182
  - spec/finexclub/manager_spec.rb
178
183
  - spec/finexclub/app_spec.rb
179
184
  - spec/finexclub/alpha_spec.rb
180
185
  - spec/finexclub/core_spec.rb
186
+ - spec/finexclub/prognosis_spec.rb
181
187
  - spec/finexclub/images_spec.rb
182
188
  - spec/finexclub/chart_spec.rb
183
189
  - spec/finexclub/document_spec.rb