金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 38|回复: 4

求帮助实现一段开仓后追踪离场的逻辑

[复制链接]

4

主题

14

帖子

14

积分

Rank: 4

等级: 专业版

注册:
2025-11-7
曾用名:
发表于 2025-11-7 14:22 | 显示全部楼层 |阅读模式
求帮助实现一下止盈止损的逻辑,我需要用在自己金字塔的交易框架下:
1. 动态调整参数 liQKA(止损止盈幅度乘数)
  • 当无持仓时(MarketPosition == 0):liQKA 初始化为 1,同时重置持仓时间计数 barcoutN 为 0。
  • 当有持仓时(MarketPosition != 0):若当前持仓的 K 线数量(bar_entry_count)大于上次记录的计数(barcoutN),则 liQKA 每次减少 0.1(但最低不低于 0.3),并更新 barcoutN 为当前持仓 K 线数。
    作用:liQKA 随持仓时间增加而减小,使得后续计算的出场线敏感度逐渐提高(幅度缩小)。
2. 记录持仓后的关键价格当有持仓时(bar_entry_count > 0):
  • HighAfterEntry:记录开仓后出现的最低最高价(用于空头止损,跟踪空头持仓期间的价格上限)。
  • LowAfterEntry:记录开仓后出现的最高最低价(用于多头止损,跟踪多头持仓期间的价格下限)。
3. 计算动态出场线根据持仓方向(多 / 空),结合 liQKA 计算出场触发点:
  • 多头持仓(MarketPosition > 0):计算多头出场线 DliqPoint,公式为 LowAfterEntry - (Open*TRS/1000)*liQKA。
  • 空头持仓(MarketPosition < 0):计算空头出场线 KliqPoint,公式为 HighAfterEntry + (Open*TRS/1000)*liQKA。

4. 绘制出场线(辅助可视化)当有对应持仓且出场线有效时,绘制前一根 K 线的出场线(KliqPoint[1] 或 DliqPoint[1])。
5. 多头平仓条件当满足以下所有条件时,平掉所有多头持仓:
  • 持有多头(MarketPosition > 0);
  • 持仓 K 线数超过 1(bar_entry_count > 1);
  • 当前 K 线最低价(Low)小于等于前一根 K 线的多头出场线(DliqPoint[1]);
  • 出场线 DliqPoint[1] 有效(大于 0)。
    平仓后重置 DliqPoint 和开仓开关 kaicang_kg。
核心逻辑总结通过动态调整 liQKA 使出场线随持仓时间逐渐敏感,结合持仓期间的高低点计算实时出场条件,最终在价格触及出场线时执行平仓,实现 “持仓越久,止损止盈越严格” 的出场策略。

可以参考的TB代码:


            If(MarketPosition == 0)   // 自适应参数默认值;
            {
                    liQKA = 1;
                    barcoutN=0;
            }Else if(bar_entry_count>barcoutN)                                         //当有持仓的情况下,liQKA会随着持仓时间的增加而逐渐减小,即止损止盈幅度乘数的减少。
            {
                    liQKA = liQKA - 0.1;
                    liQKA = Max(liQKA,0.3);
                    barcoutN=bar_entry_count;
            }
           
            Commentary("kaicang_kg[1]"+text(kaicang_kg[1]));
                Commentary("bar_entry_count"+text(bar_entry_count));
                Commentary("barcoutN"+text(barcoutN));
                Commentary("liQKA"+text(liQKA));
            // 记录开仓后的最高点和最低点
                If(bar_entry_count > 0)
                {
                        HighAfterEntry = Min(HighAfterEntry,High); // 空头止损,更新最低的最高价
                        LowAfterEntry = Max(LowAfterEntry,Low);    // 多头止损,更新最高的最低价
                }
               
            if(MarketPosition>0)
            {
                        DliqPoint = LowAfterEntry - (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
            }
            if(MarketPosition<0)
            {
                        KliqPoint = HighAfterEntry + (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
            }

            If(KliqPoint[1]>0 and MarketPosition<0)PlotNumeric("KliqPoint[1]",KliqPoint[1]);
            if(DliqPoint[1]>0 and MarketPosition>0)PlotNumeric("DliqPoint[1]",DliqPoint[1]);
           
            // 持有多单时
            If(MarketPosition >0 And bar_entry_count >1  And Low <= DliqPoint[1] and DliqPoint[1]>0 and DliqPoint[1]>0  and bar_entry_count>0)
            {
           
                            Sell(0,Min(Open,DliqPoint[1]));
                            DliqPoint=0;
                            kaicang_kg=0;
            }
           

回复

使用道具 举报

2

主题

5638

帖子

5638

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2025-11-7 15:08 | 显示全部楼层
"当无持仓时(MarketPosition == 0):liQKA 初始化为 1,同时重置持仓时间计数 barcoutN 为 0。
当有持仓时(MarketPosition != 0):若当前持仓的 K 线数量(bar_entry_count)大于上次记录的计数(barcoutN),则 liQKA 每次减少 0.1(但最低不低于 0.3),并更新 barcoutN 为当前持仓 K 线数。"

这里这个 barcoutN  是用来记录上次持仓期间的持仓周期数?那你这里又有一个 空仓后重置的逻辑。这矛盾了么。 相当于我没有仓位就清除。下次再有仓位时候barcoutN 就是从0开始了。  我要确定你这个变量用途,如果是记录上次持仓周期,那么我就不能使用这个重置的逻辑。
回复

使用道具 举报

287

主题

399

帖子

399

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-18
曾用名:
发表于 2025-11-7 16:15 | 显示全部楼层
// 定义全局变量(用于跨K线保存数据)
VARIABLE:
    DLIQPOINT:=0,      // 多头止损点(动态计算的出场线)
    KLIQPOINT:=0,      // 空头止损点(动态计算的出场线)
    LIQKA:=0,          // 止损幅度乘数(随持仓时间动态调整)
   
VARIABLE:
    HIGHAFTERENTRY:=0, // 空头持仓后记录的"最低最高价"(跟踪空头止损的上限)
    LOWAFTERENTRY:=0;  // 多头持仓后记录的"最高最低价"(跟踪多头止损的下限)


// 策略参数设置
PERIODS:=50;         // 计算ATR(平均真实波幅)的周期数
MULTIPLIE:=20;       // 趋势通道的放大倍数(控制通道宽度)
N:=3;                // 开仓触发价的ATR倍数(控制开仓阈值)
TRS:=30;             // 动态止损的基础系数(影响止损幅度)
LOTS:=1;             // 每次开仓的手数


// 记录开仓后的高低点(用于后续计算止损线)
IF BARPOS =1 THEN BEGIN  // 第一根K线时初始化高低点记录
    HIGHAFTERENTRY:= HIGH;  // 初始化为第一根K线的最高价
    LOWAFTERENTRY:= LOW;    // 初始化为第一根K线的最低价
END
IF BARPOS <>1 THEN BEGIN  // 非第一根K线时更新高低点
    // 空头持仓时,跟踪"最低的最高价"(避免价格过高触发止损)
    HIGHAFTERENTRY:= MIN(HIGHAFTERENTRY,HIGH);
    // 多头持仓时,跟踪"最高的最低价"(避免价格过低触发止损)
    LOWAFTERENTRY:= MAX(LOWAFTERENTRY,LOW);   
END


// 计算当日开盘价(用于开仓阈值计算)
NN:=BARSLAST(DATE<>REF(DATE,1))+1;  // 计算当前K线距离上一交易日的间隔(定位当日第一根K线)
OPEND:=VALUEWHEN(NN=1,O);           // 取当日第一根K线的开盘价作为"今开"


// 计算ATR(平均真实波幅,反映价格波动强度)
ATR:=MA(TR,PERIODS);  // TR为真实波幅,MA(TR,PERIODS)即PERIODS周期的平均真实波幅
HL2:=(HIGH+LOW)/2;    // 计算(最高价+最低价)/2作为中间价,用于构建趋势通道



// 趋势状态切换逻辑(KG控制趋势方向)
// 当当前为空头趋势(KG=-1)且收盘价突破上轨(DN),切换为多头趋势(KG=1)
If KG=-1 and Close>DN THEN BEGIN
    KG:=1;
END;
// 当当前为多头趋势(KG=1)且收盘价跌破下轨(UP),切换为空头趋势(KG=-1)
If KG=1 and Close<UP THEN BEGIN
    KG:=-1;
END;  



// 多头开仓条件
// 当趋势为多头(KG=1)且无持仓(HOLDING=0)时
IF KG=1 AND HOLDING=0 THEN BEGIN
    // 若最高价突破多头开仓阈值(HH),触发多头开仓
    IF H>=HH THEN BEGIN
        // 以限价单买入:价格取HH与开盘价的最大值(确保成交价格不低于阈值)
        BUY(1,LOTS,LIMITR,MAX(HH,OPEN));
        // 开仓后,将多头止损跟踪的"最高最低价"重置为入场价(从入场后开始记录)
        LOWAFTERENTRY:=ENTERPRICE;
    END
END


// 空头开仓条件
// 当趋势为空头(KG=-1)且无持仓(HOLDING=0)时
IF KG=-1 AND HOLDING=0 THEN BEGIN
    // 若最低价突破空头开仓阈值(LL),触发空头开仓
    IF L<=LL THEN BEGIN
        // 以限价单卖空:价格取LL与开盘价的最小值(确保成交价格不高于阈值)
        BUYSHORT(1,LOTS,LIMITR,MIN(LL,OPEN));
        // 开仓后,将空头止损跟踪的"最低最高价"重置为入场价(从入场后开始记录)
        HIGHAFTERENTRY:=ENTERPRICE;
    END
END


// 动态调整止损幅度乘数(LIQKA)
// 无持仓时,LIQKA初始化为1(最大止损幅度)
IF  HOLDING=0 THEN BEGIN  
    LIQKA:= 1;
END
// 有持仓时,LIQKA随时间递减(每根K线减0.1,最低0.5)
// 目的:持仓越久,止损幅度越小(止损线越敏感,更容易触发平仓)
IF  HOLDING<>0 THEN BEGIN                                
    LIQKA:=LIQKA - 0.1;
    LIQKA:=MAX(LIQKA,0.5);  // 限制最小值为0.5,避免止损过于严格
END


// 计算动态止损线(随LIQKA变化,持仓越久越敏感)
// 多头持仓时,计算多头止损线DLIQPOINT
IF  HOLDING>0 THEN BEGIN
    // 公式:入场后最高最低价 - (开盘价*TRS/1000)*LIQKA
    // LIQKA减小→止损线向上移(多头止损条件变宽松,更容易触发)
    DLIQPOINT:=LOWAFTERENTRY - (OPEN*TRS/1000)*LIQKA;
END
// 空头持仓时,计算空头止损线KLIQPOINT
IF HOLDING<0 THEN BEGIN
    // 公式:入场后最低最高价 + (开盘价*TRS/1000)*LIQKA
    // LIQKA减小→止损线向下移(空头止损条件变宽松,更容易触发)
    KLIQPOINT:=HIGHAFTERENTRY + (OPEN*TRS/1000)*LIQKA;
END


//------------------------------------------------------------------------------------------------
// 跟踪止损平仓逻辑
//------------------------------------------------------------------------------------------------
AA:=REF(DLIQPOINT,1);  // 取前一根K线的多头止损线(用于当前K线判断)
BB:=REF(KLIQPOINT,1);  // 取前一根K线的空头止损线(用于当前K线判断)


// 多头平仓条件:价格有效跌破多头止损线
// 条件:1.持有多单(HOLDING>0);2.入场后至少经历1根K线(ENTERBARS>0)
//      3.当前最低价≤前一根止损线(AA);4.前收盘价≥前止损线(确保是有效下破)
//      5.止损线有效(DLIQPOINT>0)
IF HOLDING > 0 AND ENTERBARS >0 AND L <= AA AND REF(C,1) >= REF(DLIQPOINT,1) AND DLIQPOINT>0 THEN BEGIN
    // 以限价单平仓:价格取AA与开盘价的最小值(确保成交价格不高于止损线)
    多损:sell(1,HOLDING,LIMITR,MIN(AA,OPEN));
END


// 空头平仓条件:价格有效突破空头止损线
// 条件:1.持有空单(HOLDING<0);2.入场后至少经历1根K线(ENTERBARS>0)
//      3.当前最高价≥前一根止损线(BB);4.前收盘价≤前止损线(确保是有效上破)
//      5.止损线有效(KLIQPOINT>0)
IF HOLDING < 0 AND ENTERBARS >0 AND H >= BB AND REF(C,1) <= REF(KLIQPOINT,1) AND KLIQPOINT>0 THEN BEGIN
    // 以限价单平仓:价格取BB与开盘价的最大值(确保成交价格不低于止损线)
    空损:SellSHORT(1,HOLDING,LIMITR,MAX(BB,OPEN));
END
回复

使用道具 举报

287

主题

399

帖子

399

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-18
曾用名:
发表于 2025-11-7 16:15 | 显示全部楼层
帮忙看一下,调通,开仓条件可以用最简单的5日均线上穿10日均线,我就需要个能跑的框架
回复

使用道具 举报

2

主题

5638

帖子

5638

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2025-11-7 16:52 | 显示全部楼层
我先处理你一楼的问题吧。你新提供的代码和前面的思路不完全一致。  并且这种代码的修改,如果没有原始思路的文字描述,我们也无法很好的进行调整和改动的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-11-9 15:04 , Processed in 0.091520 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表