30行代码带你进入量化投资世界(python版本)

Author: shindou, Created: 2016-12-25 19:08:32, Updated: 2017-01-02 13:15:54

class _const:
    """这个类的实例实现常量功能.
    """
    class ConstError(TypeError):pass 
    def __setattr__(self, name, value): 
        if self.__dict__.has_key(name): 
            raise self.ConstError, "Can't rebind const (%s)" %name 
        self.__dict__[name]=value 
const = _const()

def main():
    const.STATE_IDLE = -1 # 常量,标志空闲状态 
    state = const.STATE_IDLE # 状态变量 state, 初始化为 空闲状态
    opAmount = 0 # 交易量, 初始化为0
    initAccount = ext.GetAccount() # 获取账户当前信息
    Log(initAccount) # 输出当前账户信息
    
    while true:
        if state == const.STATE_IDLE: # 触发开仓条件一: 空闲状态
            n = ext.Cross(FastPeriod, SlowPeriod)  # 返回 EMA 指标 快线、慢线交叉结果
            if abs(n) >= EnterPeriod: # 触发开仓条件二: n 的绝对值 >= 入市观察期(默认2)
                opAmount = round(float(initAccount.Stocks) * float(PositionRatio), 3) # 账户币数 × 仓位比例
                if n > 0: # EMA 快线上穿慢线,多头信号,买入
                    obj = ext.Buy(opAmount)
                else: # EMA 快线下穿慢线,空头信号,卖出
                    obj = ext.Sell(opAmount)
            if obj: # 如果 obj 不为 None,即已开仓
                opAmount = obj['amount']
                if n > 0: # 如果为多头仓位
                    state = PD_LONG # 将状态变量改为 多头标志
                else: # 否则为空头仓位
                    state = PD_SHORT # 将状态变量改为 空头标志
                Log("开仓详情", obj, "交叉周期", n) # 输出开仓信息

        else: # 非空闲状态,检测平仓条件并处理之
            n = ext.Cross(ExitFastPeriod, ExitSlowPeriod)
            # 如果 n >= 离市观察期,当 EMA快线下穿慢线并持有多头仓位 或 EMA快线上穿慢线并持有空头仓位 时,触发离市
            if abs(n) >= ExitFastPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)):
                if state == PD_LONG: # 平多头仓位
                    ext.Sell(opAmount)
                else: # 平空头仓位
                    ext.Buy(opAmount)
            state = const.STATE_IDLE # 返回空闲状态
            nowAccount = ext.GetAccount()
            LogProfit(nowAccount.Balance - initAccount.Balance, '钱', nowAccount.Balance, '币', nowAccount.Stocks, '平仓详情:', obj, '交叉周期', n)

        Sleep(Interval * 1000);

More

小小梦 支持 ^^