相場商売

トレーディングビジネスあれこれ

13章クリア?

13章をとりあえず終える。

なんじゃこりゃと思っていた def [](index)は色々調べた結果、
配列参照演算子ということだった。
(参考) http://jutememo.blogspot.jp/2008/09/python_07.html

これはPythonでは def __getitem__(self, key)にあたる。

そしてincludeされていた Enumerableは、
ちょうどPythonで作られていた方がいたので、
使うのかまだわからないがそれをそのまま多重継承してMixinしておいた。
(参考) http://www.geocities.jp/m_hiroi/light/python06.html

できた結果がこちら。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from myarray import Array

class Enumerable:
    # 探索
    def member(self, func):
        for x in self.each():
            if func(x): return x
        return False

    # 位置を返す
    def position(self, func):
        n = 0
        for x in self.each():
            if func(x): return n
            n += 1
        return -1

    # 個数を数える
    def count(self, func):
        n = 0
        for x in self.each():
            if func(x): n += 1
        return n

    # マップ
    def map(self, func):
        a = []
        for x in self.each(): a.append(func(x))
        return a

    # フィルター
    def filter(self, func):
        a = []
        for x in self.each():
            if func(x): a.append(x)
        return a

    # 畳み込み
    def fold(self, func, init):
        a = init
        for x in self.each():
            a = func(a, x)
        return a
    
# テクニカル指標の親クラス

class Indicator(Array, Enumerable):
    
    def __init__(self, stock):
        Array.__init__(self, stock)
        self.stock = stock
        
    def each(self):
        return [value for value in self]
    
    def calculate(self):
        self.indicator = self.calculate_indicator()
        return self.indicator
    
    def __getitem__(self, index):
        if isinstance(index, int) != True or index < 0:
            raise ValueError('no_value')
        else:
            for i, e in enumerate(self):
                if i == index:
                    if e == None:
                        raise ValueError('no_value')
                    else:
                        return e
               
    def calculate_indicator(self):
        pass

            
if __name__ == '__main__':
    
    class MyIndicator(Indicator):
            
        def calculate_indicator(self):
            return Indicator([None, None, 3, 5, 8, 4])
            
        
    my_indicator = MyIndicator([]).calculate()

    print(my_indicator)

    for ind in my_indicator.each():
        print(ind)
    
    #print(my_indicator[0])    
    print(my_indicator[2])
    print(my_indicator[3])    
    
    try:
        print(my_indicator[0])
    except:
        print('TestError')
    
    for i in range(0, len(my_indicator)):       
        try:
            print(my_indicator[i])
        except:
            print('TestError')

微妙に動作が違うような気がするがいいことにしよう。