二进制数字模式识别(伪代码或MQL5)

时间:2019-06-29 09:51:58

标签: pseudocode mql5

0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17 
.  .  1  1  1  1  1  0  0  0  1   1   1   1   1   0   0   0

识别从17开始,然后倒退至0。 可以看到的是最简单的模式。

  1. 模式至少以三个0或三个1s开头,但每个可能更多,但不能混合!

  2. 然后,根据第一个模式中出现的内容,第一个模式后接至少五个0或五个1。由于模式一包含三个0,因此必须至少有五个1,反之亦然

  3. 然后,我们想再次看到第一个模式。至少要有3个0或3个1s,再次取决于惠特尔,之前还有1个或0s

  4. 最后,我们想再次看到第二个模式,这意味着至少要五个五个0或五个1,这取决于之前看到的是哪个模式

我尝试使用for循环和计数器,但没有设法解决。困扰我的事实是,模式的大小不是固定的,因为连续有三个或五个以上的0和1。

有人能够提供一些伪代码如何实现此代码甚至MQL5代码吗?

1 个答案:

答案 0 :(得分:0)

以下Swift代码不是最佳选择。它应该只是给您提示如何实现它。

匹配单个模式的函数:

func matchPattern(numbers: [Int], startIndex: Int, number: Int) -> Int {
    var actualIndex = startIndex
    while numbers[actualIndex] == number && actualIndex > 0 {
        actualIndex = actualIndex - 1
    }
    return startIndex - actualIndex
}  

用于匹配4种模式的函数:

        func match(binNrs: [Int]) -> Bool {
            let firstPatternNr = binNrs[17]
            let secondPatternNr = firstPatternNr == 0 ? 1 : 0
            let pattern1Length = matchPattern(numbers: binNrs, 
                                             startIndex: 17, 
                                             number: firstPatternNr)
            if pattern1Length < 3 { return false }
            let pattern2Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length, 
                                              number: secondPatternNr)
            if pattern2Length < 5 { return false }
            let pattern3Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length - pattern2Length,
                                              number: firstPatternNr)
            if pattern3Length < 3 { return false }
            let pattern4Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length - pattern2Length - pattern3Length, 
                                              number: secondPatternNr)
            return pattern4Length >= 5
        }  

一些带有结果的测试模式:

let match1 = match(binNrs: [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0]) // true
let match2 = match(binNrs: [1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]) // false (4th sequence < 5)
let match3 = match(binNrs: [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0]) // false (1st sequence < 3)
let match4 = match(binNrs: [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1]) // false (2nd sequence < 5)