金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 235|回复: 14

请教一下,为什么没有触发开仓

[复制链接]

4

主题

27

帖子

27

积分

Rank: 1

等级: 新手上路

注册:
2024-6-15
曾用名:
发表于 2025-1-26 16:33 | 显示全部楼层 |阅读模式
请老师帮忙解答下,策略模型:开仓条件,5分钟周期收盘价突破MA20均线,开仓买入;跌破MA20均线,平仓卖出       见附件图片
新建公式A
cond11:cross(close,ma(close,20);
cond22:cross(ma(close,20),close);
另外新建公式B
if stkindi('','A.cond11',0,2,-1) then buy(1,1,marketr);
if stkindi('','A.cond22',0,2,-1) then sell(1,0,marketr);

e9b9308c0c756d042adb32fef98a0ec.png
回复

使用道具 举报

35

主题

8674

帖子

8684

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-1-26 16:34 | 显示全部楼层
这里不是又信号吗
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

4

主题

27

帖子

27

积分

Rank: 1

等级: 新手上路

注册:
2024-6-15
曾用名:
 楼主| 发表于 2025-1-26 16:47 | 显示全部楼层
对啊,就是因为有信号,但图表程序化操作的时候没有触发成交,所以没搞懂是什么原因
回复

使用道具 举报

35

主题

8674

帖子

8684

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-1-26 16:52 | 显示全部楼层
那只能通过debugfile调试输出条件看了,这个一个可能是本地缺5分钟数据所以实时计算的时候出来的信号不对
这个只能调试输出了看
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

4

主题

27

帖子

27

积分

Rank: 1

等级: 新手上路

注册:
2024-6-15
曾用名:
 楼主| 发表于 2025-1-26 16:58 | 显示全部楼层
老师,能教下debugfile调试输出条件是该怎么操作吗,如果我启动程序化交易的时候,选择1秒来,而不是收盘价来的话,是不是只要突破了均线就直接开仓或平仓
回复

使用道具 举报

35

主题

8674

帖子

8684

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-1-26 17:01 | 显示全部楼层
//没有条件的,就是把条件和需要打印的进行输出,类似下面这里会实时输出cond这个条件,这样盘后就去看这个条件
debugfile('D:/tet.txt','cond条件是%.2f',cond);
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

4

主题

27

帖子

27

积分

Rank: 1

等级: 新手上路

注册:
2024-6-15
曾用名:
 楼主| 发表于 2025-1-27 13:30 | 显示全部楼层
技术008 发表于 2025-1-26 17:01
//没有条件的,就是把条件和需要打印的进行输出,类似下面这里会实时输出cond这个条件,这样盘后就去看这个 ...

谢谢老师,已经可以成交了,麻烦老师帮忙看看以下策略怎么写,谢谢

补充内容 (2025-1-27 13:34):
在过去20个完整K线中,如果出现1次5分钟收盘价突破MA20均线,那么止损上移到10分钟突破MA20均线,同理如果在过去20个完整K线中,出现1次10分钟收盘价突破MA20均线,那么止损上移15分钟,以此类推,不知有没有公式
回复

使用道具 举报

35

主题

8674

帖子

8684

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-1-27 13:50 | 显示全部楼层
新建一个公式A里面
cond:cross(c,ma(c,20));


然后当前策略去进行引用
stkindi('','A.cond',0,2,0);
只能判断当前是否跨周期是金叉,没法统计20个k里面有过,因为这个你要涉及从当前k多少个然后去反推对应5分钟有多少个,不好算
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

4

主题

27

帖子

27

积分

Rank: 1

等级: 新手上路

注册:
2024-6-15
曾用名:
 楼主| 发表于 2025-2-5 09:48 | 显示全部楼层
好的,谢谢老师,主要是针对避免在震荡行情中频繁触发止损,就想通过动态调整止损位置来减少不必要的交易。以下是假期期间通过deepseek帮忙写的代码,麻烦帮忙看看,好像金字塔运行不了,不知道什么地方出错了。
策略需求:在交易过程中逐渐拉高止损位置,例如从1小时级别的MA20均线调整为2小时级别的MA20均线,在过去10个收盘价中如果触发一次1小时周期的MA20均线止损的情形,那么下次止损就要对应到2小时周期的MA20均线止损了
以下为deepseek给出的公式,虽然看懂了,但实操回测没反应:
### **策略代码**

#### 公式A(开仓条件)
```pel
// 公式A:计算1小时周期的MA20均线
cond11: cross(close, ma(close, 20));  // 价格上穿MA20
cond22: cross(ma(close, 20), close);  // 价格下穿MA20
```

#### 公式B(平仓条件与动态止损)
```pel
// 公式B:动态止损逻辑
vars:
    stoplosslevel(0),  // 动态止损位置
    stopcount(0),      // 记录止损触发次数
    dynamicstop(false); // 是否启用动态止损

// 初始化止损触发次数
if barstatus = 2 then  // 每个K线结束时
begin
    if stopcount > 0 then
        stopcount = stopcount - 1;  // 每根K线减少止损计数
end;

// 调用1小时周期的cond11(开仓条件)
if stkindi('', 'A.cond11', 0, 5, -1) then
begin
    buy(1, 1, marketr);  // 买入1手
    stoplosslevel = ma(close, 20);  // 初始止损为1小时MA20
    stopcount = 10;  // 重置止损计数
    dynamicstop = false;  // 初始不启用动态止损
end;

// 动态调整止损位置
if position > 0 then  // 如果当前持有多头
begin
    // 如果在过去10根K线中触发过止损,则启用动态止损
    if stopcount < 10 and stopcount > 0 then
    begin
        dynamicstop = true;
    end;

    // 如果启用动态止损,则使用2小时MA20
    if dynamicstop then
    begin
        stoplosslevel = max(stoplosslevel, stkindi('', 'ma(close, 20)', 0, 6, -1));  // 6表示2小时周期
    end
    else
    begin
        stoplosslevel = ma(close, 20);  // 否则使用1小时MA20
    end;
end;

// 平仓条件
// 1. 价格跌破1小时MA20
// 2. 价格跌破动态止损位置
if stkindi('', 'A.cond22', 0, 5, -1) or close < stoplosslevel then
begin
    sell(1, 0, marketr);  // 卖出平仓
    if close < stoplosslevel then
        stopcount = 10;  // 如果触发止损,重置止损计数
end;
```
---

### **代码逻辑说明**

1. **开仓条件**:
   - 当价格突破1小时MA20均线时(`cond11`),执行买入操作。
   - 初始止损位置为1小时MA20。

2. **平仓条件**:
   - 如果价格跌破1小时MA20均线(`cond22`),则卖出。
   - 如果价格跌破动态止损位置(`stoplosslevel`),则卖出。

3. **动态止损**:
   - 如果在过去10根K线中触发过止损,则启用动态止损。
   - 动态止损时,止损位置从1小时MA20调整为2小时MA20。

4. **止损触发记录**:
   - 每根K线结束时,`stopcount`减1。
   - 如果触发止损,`stopcount`重置为10。
回复

使用道具 举报

35

主题

8674

帖子

8684

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-5 09:55 | 显示全部楼层
cond11:cross(close,ma(close,20);
cond22:cross(ma(close,20),close);
另外新建公式B
if stkindi('','A.cond11',0,2,-1) then buy(1,1,marketr);
if stkindi('','A.cond22',0,2,-1) then sell(1,0,marketr);


就你一楼的代码就是了
动态止损这个没意义啊,你都触发止损了那就止损掉了,何来调整止损的道理
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-17 03:39 , Processed in 0.239016 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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