相場商売

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

シミュレーション編

11章。libフォルダのtrade.py

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

# 取引を表すクラス
class Trade:
    # 仕掛ける
    def __init__(self, params):
        self.stock_code  = params['stock_code']
        self.trade_type  = params['trade_type']
        self.entry_date  = params['entry_date']
        self.entry_price = params['entry_price']
        self.volume      = params['volume']
        self.entry_time  = params['entry_time']
        self.length      = 1
        self.exit_date   = None
        self.exit_price  = None
        self.exit_time   = None
        self.first_stop  = None
        self.stop        = None
        
    # 手仕舞う
    def exit(self, params):
        if 'exit_date' in params:
            self.exit_date = params['exit_date']
        else:
            self.exit_date = params['date']
        if 'exit_price' in params:
            self.exit_price = params['exit_price']
        else:
            self.exit_price = params['price']            
        if 'exit_time' in params:
            self.exit_time = params['exit_time']
        else:
            self.exit_time = params['time']
    
    # 手仕舞い済みかどうか
    def closed_check(self):
        if self.exit_date and self.exit_price:
            return True
        else:
            return False
    # 買いトレードかどうか
    def long_check(self):
        if self.trade_type == 'long':
            return True
        else:
            return False
    
    # 売りトレードかどうか
    def short_check(self):
        if self.trade_type == 'short':
            return True
        else:
            return False
    
    # 損益金額
    def profit(self):
        return self._plain_result() * self.volume
        
    # %損益
    def percentage_result(self):
        return (float(self._plain_result()) / self.entry_price) * 100
    
    # R
    def r(self):
        if self.first_stop == None:
            return
        if self.long_check() == True:
            return self.entry_price - self.first_stop
        elif self.short_check() == True:
            return self.first_stop - self.entry_price

    # R倍数
    def r_multiple(self):   
        if self.first_stop == None:
            return
        if self.r() == 0:
            return
        return float(self._plain_result()) / float(self.r())

    # Private
    # 株数を掛けない損益
    def _plain_result(self):
        if self.long_check() == True:
            return self.exit_price - self.entry_price
        elif self.short_check() == True:
            return self.entry_price - self.exit_price
        
if __name__ == '__main__':

    trade = Trade({'stock_code':  8604,
                   'trade_type':  'long',
                   'entry_date':  '2011/11/14',
                   'entry_price': 251,
                   'entry_time':  'open',
                   'volume':      100})

    print(trade.stock_code)
    print(trade.entry_date)
    print(trade.entry_price)
    print(trade.long_check())    
    print(trade.short_check())
    print(trade.closed_check())      

    trade.first_stop = 241
    trade.stop       = 241
    trade.length     = 1

    print(trade.first_stop)
    print(trade.stop)
    print(trade.r())
    print(trade.length)
    
    trade.length += 1
    
    print(trade.length)
    
    trade.exit({'date':  '2011/11/15',
                'price': 255,
                'time':  'in_session'})
    
    print(trade.closed_check())
    print(trade.exit_date)    
    print(trade.profit())
    print(trade.percentage_result())
    print(trade.r_multiple())

Pythonの場合は
if __name__ == '__main__':
を使えばチェック用のファイルを別に用意しなくていいとやっとわかった。