You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二进制数模式识别实现咨询(求伪代码/MQL5代码)

二进制序列模式识别解决方案

我来帮你搞定这个动态长度的二进制模式识别问题,核心思路是分阶段遍历+动态计数,不用预设固定长度,完全贴合你需求的规则。先理清楚问题细节:你需要把原序列从索引17倒推到0(也就是反转原序列),然后匹配「[≥3个相同值] → [≥5个相反值] → [≥3个相反值(即回到第一段的值)] → [≥5个相反值(即回到第二段的值)]」的模式。

伪代码实现(清晰易懂的逻辑)

先给你伪代码,把整个逻辑拆解清楚,方便你理解:

// 1. 先反转原始序列,实现从索引17倒推到0的遍历顺序
original_seq = [1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0]
reversed_seq = reverse(original_seq)  // 反转后得到:[0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1]

// 2. 初始化遍历指针和计数器
current_pos = 0
seq_length = len(reversed_seq)
is_matched = false

// 3. 识别第一段:至少3个连续相同值
seg1_val = reversed_seq[current_pos]
seg1_count = 0
while current_pos < seq_length and reversed_seq[current_pos] == seg1_val:
    seg1_count += 1
    current_pos += 1
if seg1_count < 3:
    print("模式不匹配:第一段长度不够3个")
    exit

// 4. 识别第二段:至少5个和第一段相反的值
seg2_val = 1 - seg1_val  // 0变1,1变0
seg2_count = 0
while current_pos < seq_length and reversed_seq[current_pos] == seg2_val:
    seg2_count += 1
    current_pos += 1
if seg2_count < 5:
    print("模式不匹配:第二段长度不够5个")
    exit

// 5. 识别第三段:至少3个和第二段相反的值(即和第一段相同)
seg3_val = 1 - seg2_val
seg3_count = 0
while current_pos < seq_length and reversed_seq[current_pos] == seg3_val:
    seg3_count += 1
    current_pos += 1
if seg3_count < 3:
    print("模式不匹配:第三段长度不够3个")
    exit

// 6. 识别第四段:至少5个和第三段相反的值(即和第二段相同),且要遍历完整个序列
seg4_val = 1 - seg3_val
seg4_count = 0
while current_pos < seq_length and reversed_seq[current_pos] == seg4_val:
    seg4_count += 1
    current_pos += 1
if seg4_count < 5 or current_pos != seq_length:
    print("模式不匹配:第四段长度不够5个,或者序列还有未匹配部分")
    exit

// 所有条件都满足,模式匹配成功
is_matched = true
print("模式匹配成功!")
print("各段详情:")
print(f"第一段:值={seg1_val},长度={seg1_count}")
print(f"第二段:值={seg2_val},长度={seg2_count}")
print(f"第三段:值={seg3_val},长度={seg3_count}")
print(f"第四段:值={seg4_val},长度={seg4_count}")

MQL5 代码实现(可直接运行)

下面是适配MQL5的代码,包含测试函数,你可以直接在MT5里测试:

//+------------------------------------------------------------------+
//| 二进制序列模式识别核心函数                                        |
//+------------------------------------------------------------------+
bool CheckBinaryPattern(const uchar originalSequence[], int originalLength)
{
    // 步骤1:反转序列,实现从索引17倒推到0的遍历顺序
    uchar reversedSequence[];
    ArrayResize(reversedSequence, originalLength);
    for(int i = 0; i < originalLength; i++)
    {
        reversedSequence[i] = originalSequence[originalLength - 1 - i];
    }
    
    int currentPos = 0;
    int seqLen = ArraySize(reversedSequence);
    
    // 步骤2:识别第一段(至少3个连续相同值)
    uchar seg1Val = reversedSequence[currentPos];
    int seg1Count = 0;
    while(currentPos < seqLen && reversedSequence[currentPos] == seg1Val)
    {
        seg1Count++;
        currentPos++;
    }
    if(seg1Count < 3)
    {
        Print("模式不匹配:第一段长度不足3");
        return false;
    }
    
    // 步骤3:识别第二段(至少5个相反值)
    uchar seg2Val = 1 - seg1Val;
    int seg2Count = 0;
    while(currentPos < seqLen && reversedSequence[currentPos] == seg2Val)
    {
        seg2Count++;
        currentPos++;
    }
    if(seg2Count < 5)
    {
        Print("模式不匹配:第二段长度不足5");
        return false;
    }
    
    // 步骤4:识别第三段(至少3个相反值,即和第一段相同)
    uchar seg3Val = 1 - seg2Val;
    int seg3Count = 0;
    while(currentPos < seqLen && reversedSequence[currentPos] == seg3Val)
    {
        seg3Count++;
        currentPos++;
    }
    if(seg3Count < 3)
    {
        Print("模式不匹配:第三段长度不足3");
        return false;
    }
    
    // 步骤5:识别第四段(至少5个相反值,即和第二段相同),需遍历完整个序列
    uchar seg4Val = 1 - seg3Val;
    int seg4Count = 0;
    while(currentPos < seqLen && reversedSequence[currentPos] == seg4Val)
    {
        seg4Count++;
        currentPos++;
    }
    if(seg4Count < 5 || currentPos != seqLen)
    {
        Print("模式不匹配:第四段长度不足5或序列未完全遍历");
        return false;
    }
    
    // 匹配成功,输出各段信息
    Print("模式匹配成功!");
    PrintFormat("第一段:值=%d,长度=%d", seg1Val, seg1Count);
    PrintFormat("第二段:值=%d,长度=%d", seg2Val, seg2Count);
    PrintFormat("第三段:值=%d,长度=%d", seg3Val, seg3Count);
    PrintFormat("第四段:值=%d,长度=%d", seg4Val, seg4Count);
    
    return true;
}

//+------------------------------------------------------------------+
//| 测试函数:验证给定的二进制序列                                    |
//+------------------------------------------------------------------+
void OnStart()
{
    // 原始序列:索引0-17对应的二进制值
    uchar testSequence[] = {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0};
    int seqLength = ArraySize(testSequence);
    
    bool matchResult = CheckBinaryPattern(testSequence, seqLength);
    Print("最终测试结果:", matchResult ? "匹配成功" : "匹配失败");
}

关键逻辑说明

  • 反转序列:因为要求从索引17倒推到0,所以直接把原序列反转,就能按正常顺序遍历处理了,不用倒着循环,逻辑更清晰
  • 分阶段遍历:每一段只关注当前需要匹配的目标值,用计数器动态累加连续相同值的长度,直到遇到不同值或者序列结束,完美适配“无固定长度”的需求
  • 严格校验:每一段结束后立即校验长度是否符合要求,最后还要确保整个序列都被遍历完,避免有多余的未匹配数据

内容的提问来源于stack exchange,提问作者trader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:58:49