筹码系统

60日筹码结构

每日的5分钟k线 均价 成为当日筹码结构价格点 一共48组

筹码 残留度 使用(1-turn*k)

当日各个价格筹码量从下一日开始循环迭代乘以残留度 ,到最后一天可以获得60日筹码结构

方法一 k取1

方法二 反正取第二日k值 第二日均价 比较前一日均价 如果第二日价高 k 0.85 如果一样 k 0.75 如果更低 k 0.6

方法三 更具当日筹码结构 去计算 当日均价 与筹码获利盘 和 套牢盘 不同价格差价下比率 为k 然后更具对应筹码结构 算出 整体系数

最后 筹码结构图

筹码均价

当日均价 或者价格

筹码峰

发表在 None | 留下评论

经典理论 【量价趋势】 部分python代码

#1
xh=False #判断趋势线形成信号
#此处已经比对完毕 true false true
condition=(
            ((df['close']-df['preclose'])>=0.9*df['atr'])&
            (df['volume']>2*df['volume'].shift(1))&
            (df['preclose']<df['close'].shift(-1))&
            (df['close'].shift(-1)<df['close'])&
            (0.4*df['volume']<=df['volume'].shift(-1))&
            (df['volume'].shift(-1)<=0.6*df['volume'])
        )

# result=df[condition]
# if len(result)==0:
#     xh=True
#结果 是否有启动信号
#只取后30行
last_30_index=df.iloc[-30:].index
index_i=last_30_index[condition.loc[last_30_index]].tolist()
if len(index_i)==0:
    xh=True


#2
#df 切割后的df可行吗?
# 其中df为最后一个趋势起点
# index_i[-1] #最后一个启动点
result=[]
result_index=[] #谷点位置
for i in range(index_i[-1]+1,len(df)-1):
# for i in range(1,len(df)-1):
    a=df.iloc[i-1]
    b=df.iloc[i]
    c=df.iloc[i+1]
    if (a['low']>b['low'])and(b['low']<c['low']):
        result.append(b)
        result_index.append(i)
result_df=pd.DataFrame(result)
xh=False #判断趋势线形成信号
if len(result_df)>2:
    for i in range(0,len(result_df)-1):
        if result_df.iloc[i]['low']>result_df.iloc[i+1]['low']:
            xh=True
# 使用xh判断 是否趋势线形成


#3 没有循环判断
# 动态阻力线 支撑线 maxHigh minLow
# i行 即最后一个低点后到值 显示突破 目前没有动态创建 两个价格

# result_index[-1] 为后面最后一个谷底位置
resultx=[]
resultx_index=[]
zc=False
xh=False
for i in range(result_index[-1]+1,len(df)-1):
    maxHigh=df.iloc[i-10:i]['high'].max()
    minLow=df.iloc[i-10:i]['low'].min()
    for j in range(i,len(df)-1):
        #突破后阻力位转为支撑位  
        if (df.iloc[j]['close']>maxHigh) and (df.iloc[j]['volume']>=2*df.iloc[j-1]['volume']) and (df.iloc[j+1]['close']>maxHigh):
            resultx.append(df.iloc[j])
            result_index.append(j)
            zc=maxHigh
            for jj in range(j,len(df)):
                #此处只记录突破位置
                if zc:
                    if df.iloc[jj]['close']<zc:
                        xh=True
        #破线  趋势结束


# 4 没有循环判断
# 成交量异常  放大


# resultx_index[-1]开始循环是否出现下面的形态

for ii in range(resultx_index[-1]+1,len(df)-1):
    if df.iloc[ii]['volume']>2*df.iloc[ii-1]['volume']:
        #锤子
        if abs(df.iloc[ii]['close']-df.iloc[ii]['open'])*3<=(df.iloc[ii]['high']-df.iloc[ii]['low']) and (df.iloc[ii]['close']>df.iloc[ii]['low'])and (df.iloc[ii]['open']>df.iloc[ii]['low']):
            xh=True
        #黄昏星
        if (df.iloc[ii-1]['close']>df.iloc[ii-1]['open'])and(df.iloc[ii+1]['close']<df.iloc[ii+1]['open']) and(abs(df.iloc[ii]['close']-df.iloc[ii]['open'])*3<=(df.iloc[ii]['high']-df.iloc[ii]['low']))and(df.iloc[ii]['high']>df.iloc[ii]['open'])and(df.iloc[ii]['high']>df.iloc[ii]['close']):
            xh=True
        #吞没
        if (df.iloc[ii-1]['close']>df.iloc[ii-1]['open'])and(df.iloc[ii]['close']<df.iloc[ii]['open'])and(df.iloc[ii]['close']<df.iloc[ii-1]['open'])and(df.iloc[ii]['open']>df.iloc[ii-1]['close']):
            xh=True


#      趋势结束

import pandas as pd


class Jugg:
    def __init__(self,df):
        self.xh=False
        self.info=[]
        self.index_1=[]
        self.index_2=[]
        self.index_3=[]
        self.index_4=[]
        self.df=df
    def doing(self):
        self.step_1()
        if not self.xh:
            self.step_2()
        if not self.xh:
            self.step_3()
        if not self.xh:
            self.step_4()
    def step_1(self):
        df=self.df
        condition=(
            ((df['close']-df['preclose'])>=0.9*df['atr'])&
            (df['volume']>2*df['volume'].shift(1))&
            (df['preclose']<df['close'].shift(-1))&
            (df['close'].shift(-1)<df['close'])&
            (0.4*df['volume']<=df['volume'].shift(-1))&
            (df['volume'].shift(-1)<=0.6*df['volume'])
        )
        last_30_index=df.iloc[-30:].index
        self.index_1=last_30_index[condition.loc[last_30_index]].tolist()
        if len(self.index_1)==0:
            self.info.append("不存在启动点")
            self.xh=True
    def step_2(self):
        df=self.df
        if len(self.index_1)==0:
            self.xh=True
            return 
        for i in range(self.index_1[-1]+1,len(df)-1):
            a=df.iloc[i-1]
            b=df.iloc[i]
            c=df.iloc[i+1]
            if (a['low']>b['low'])and(b['low']<c['low']):
                self.index_2.append(i)
        if len(self.index_2)>=2:
            for i in range(len(self.index_2) - 1):
                if df.iloc[self.index_2[i]]['low']>df.iloc[self.index_2[i+1]]['low']:
                    self.info.append("趋势向下")
                    self.xh=True
        else:
            self.info.append("趋势线不存在")
            self.xh=True


    def step_3(self):
        if len(self.index_2)>=2:
            self.info.append("形成趋势")
        else:
            self.xh=True
            return
        df=self.df
        for i in range(self.index_2[-1]+1,len(df)-2):
            maxHigh=df.iloc[i-10:i]['high'].max()
            minLow=df.iloc[i-10:i]['low'].min()
            j=i+1 #后2日
            if(df.iloc[j]['close']>maxHigh) and (df.iloc[j]['volume']>=2*df.iloc[j-1]['volume']) and (df.iloc[j+1]['close']>maxHigh):
                #突破
                self.index_3.append(j)
                self.info.append("突破位置形成")
                zc=maxHigh
                for jj in range(j,len(df)):
                    #此处只记录突破位置
                    if zc:
                        if df.iloc[jj]['close']<zc:
                            self.xh=True
                            self.info.append("跌破支撑位")
                            #破线  趋势结束
                            return
                break
        if len(self.index_3)==0:
            self.xh=True
            self.info.append("没有有效突破")
    def step_4(self):
        if len(self.index_3)==0:
            self.xh=True
            return 
        df=self.df
        for ii in range(self.index_3[-1]+1,len(df)-1):
            if df.iloc[ii]['volume']>2*df.iloc[ii-1]['volume']:
                #锤子
                if abs(df.iloc[ii]['close']-df.iloc[ii]['open'])*3<=(df.iloc[ii]['high']-df.iloc[ii]['low']) and (df.iloc[ii]['close']>df.iloc[ii]['low'])and (df.iloc[ii]['open']>df.iloc[ii]['low']):
                    self.info.append("见顶,K线形态锤子")
                    self.index_4.append(ii)
                    self.xh=True
                    return 
                #黄昏星
                if (df.iloc[ii-1]['close']>df.iloc[ii-1]['open'])and(df.iloc[ii+1]['close']<df.iloc[ii+1]['open']) and(abs(df.iloc[ii]['close']-df.iloc[ii]['open'])*3<=(df.iloc[ii]['high']-df.iloc[ii]['low']))and(df.iloc[ii]['high']>df.iloc[ii]['open'])and(df.iloc[ii]['high']>df.iloc[ii]['close']):
                    self.info.append("见顶,K线形态黄昏星")
                    self.index_4.append(ii)
                    self.xh=True
                    return
                #吞没
                if (df.iloc[ii-1]['close']>df.iloc[ii-1]['open'])and(df.iloc[ii]['close']<df.iloc[ii]['open'])and(df.iloc[ii]['close']<df.iloc[ii-1]['open'])and(df.iloc[ii]['open']>df.iloc[ii-1]['close']):
                    self.info.append("见顶,K线形态吞没")
                    self.index_4.append(ii)
                    self.xh=True
                    return
发表在 None | 留下评论

Thinkphp 坑点 Join 和with 不可连用

Join 下如果使用模型关联 即使用with会导致生成的SQL语句奇怪,即会把关联的ID混用,非常非常奇怪!!!
做search查询直接用join 即可

【不要使用关联 和with 再不行就用子查询】

发表在 None | 留下评论

thinkcmf 补齐 service

Model数据 用于关联

Service 处理数据逻辑 方便复用

Controller 处理请求调用Service

V 模版

Controller调用Service使用注入

Service 分页

#此处使用注入,方便测试 里面可以直接调用
public function index(UserService $userService)
{
    $page = $this->request->get('page', 1);
    
    // 只调用Service,不干别的
    $data = $userService->getList($page);
    
    $this->assign('data', $data);
    return $this->fetch();
}

service

 public function getList(int $page, int $limit=100): array
    {
        // 分页查询:paginate() 是 TP6 核心方法,CMF6 完全兼容
        /** @var Paginator $paginate */
        $paginate = User::where('status', 1)
            ->order('id', 'desc')
            ->paginate([
                'list_rows' => $limit,
                'page' => $page,
            ]);

        // 格式化返回(适配前端/模板)
        return [
            'total' => $paginate->total(), // 总条数
            'list' => $paginate->items(),   // 当前页数据
            'page' => $paginate->currentPage(), // 当前页
            'limit' => $paginate->listRows(),   // 每页条数
            'pages' => $paginate->lastPage(),   // 总页数
        ];
    }



#或者简单点 不要花里胡哨

public function getList(int $page, int $limit=100)
{
    // 就这一句是分页核心
    return User::where('status',1)->order('id desc')->paginate($limit);
}
发表在 None | 留下评论

thinkcmf thinkphp6 原生JSON

code 的值 1 为success 值0为error

{
    "code": 0,
    "msg": "保存成功",
    "url": "/user/index",
    "data": {
        "name": "test"
    }
}

return $this->success(‘操作成功’, ”, $data);

文字、 URL 、数据;

发表在 None | 留下评论