Распознавание образов в двоичных числах (псевдокод или MQL5) - PullRequest
0 голосов
/ 29 июня 2019
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. Паттерн начинается как минимум с трех или трех единиц, но может быть больше каждого, но не смешан!

  2. За первым шаблоном следуют по меньшей мере пять нулей или пять единиц в зависимости от того, что было в первом шаблоне. Так как шаблон один содержит три 0, должно быть не менее пяти единиц и наоборот

  3. Тогда мы хотим снова увидеть первый паттерн. По крайней мере, три 0 или три 1, опять же, в зависимости от того, были ли 1 или 0 до

  4. Наконец, мы хотим снова увидеть второй шаблон, что означает, по меньшей мере, пять 0 или пять 1, опять же, в зависимости от того, какой шаблон был виден до

Я пытался использовать для циклов и счетчиков, но мне не удалось это сделать. Что меня беспокоит, так это тот факт, что шаблон не имеет фиксированного размера, поскольку может быть более трех или пяти последовательных нулей и единиц.

Кто-нибудь может предоставить какой-нибудь псевдокод для реализации этого или даже некоторый код MQL5?

1 Ответ

0 голосов
/ 29 июня 2019

Следующий код 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)
...