Código morse - página 5

 
Versão de código morse "1.004": O bug corrigido - padrão foi lido de trás para frente.
Arquivos anexados:
Morse_code.mq5  15 kb
 
Vasiliy Sokolov:

Pergunta: Qual é a probabilidade de aparecer no mercado uma combinação que corresponda aos 64 dígitos exigidos? Resposta: (1/2^64)*BarsCount. Ou seja, com uma probabilidade próxima de 100%, tal combinação não será encontrada. É óbvio que apenas um número int ou longo não pode descrever completamente o padrão, então precisamos de um parâmetro adicional especificando o comprimento do padrão.

Isto se olharmos para todos os 64 bits. Mas é obviamente desnecessário.

Quando realizei tais investigações, descobri que não é razoável tomar o comprimento de um padrão de castiçal mais longo que 5. Além disso, se distinguirmos as barras não apenas pelas "barras de boi", mas também por seus tamanhos, mesmo este comprimento é muito longo.

Se nosso padrão for longo - é muito mais razoável especificar "características" e simplesmente limitar o comprimento por valores mínimos e máximos.

 

Ainda não exatamente formado, mas a idéia geral é: dois parâmetros - comprimento e parâmetro int de 0 a 3. Dentro do Expert Advisor já está interpretando este número (representação Pseudobit):

intComprimento (também conhecido como máscara)Representação Pseudobit
0х0
1х1
2xx00
3xx01
4xx10
5xx11
6xxx000
7xxx001
8xxx010
9xxx011
10xxx100
11xxx101
12xxx110
13xxx111

Resta decidir como codificar estes parâmetros. Uma solução simples: uma estrutura na qual cada parâmetro int (a primeira coluna da tabela) corresponde a uma representação Pseudobit (a terceira coluna). Se a máscara é limitada a apenas cinco caracteres (xxxxxx), a estrutura não é muito grande.

E o mais importante - o otimizador permite que você reorganize a estrutura!

 

Você também pode fazer três parâmetros separados para as três velas na janela de propriedades. Dois pássaros são mortos ao mesmo tempo - é ao mesmo tempo claro e otimizado.

O mesmo pode ser feito para 10 castiçais.

 
Dmitry Fedoseev:

Você também pode fazer três parâmetros separados para as três velas na janela de propriedades. Dois pássaros são mortos ao mesmo tempo - é ao mesmo tempo claro e otimizado.

O mesmo pode ser feito para 10 castiçais.

Eu apoio

input bool svecha1 = true;
input bool svecha2 = false;
input bool svecha3 = true;
input bool svecha4 = false;
input bool svecha5 = true;
 
Vladimir Karputov:

Ainda não exatamente formado, mas a idéia geral é: dois parâmetros - comprimento e parâmetro int de 0 a 3. Dentro do Expert Advisor já existe uma interpretação deste número (representação Pseudobit):

intComprimento (também conhecido como máscara)Representação Pseudobit
0х0
1х1
2xx00
3xx01
4xx10
5xx11
6xxx000
7xxx001
8xxx010
9xxx011
10xxx100
11xxx101
12xxx110
13xxx111

Resta decidir como codificar estes parâmetros. Uma solução simples: uma estrutura na qual cada parâmetro int (a primeira coluna da tabela) corresponde a uma representação Pseudobit (a terceira coluna). Se a máscara é limitada a apenas cinco caracteres (xxxxxx), a estrutura não é muito grande.

E o mais importante - o otimizador permite que você reorganize a estrutura!


Esta é a enumeração para máscara de x a xxxx:

//+------------------------------------------------------------------+
//| Enum pattern type: numerical or string                           |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_MASK
  {
   _0=B'0',       // 
   _1=B'1',       //  
   _2=B'00',      // 
   _3=B'01',      // 
   _4=B'10',      // 
   _5=B'11',      // 
   _6=B'000',     // 
   _7=B'001',     // 
   _8=B'010',     // 
   _9=B'011',     // 
   _10=B'100',    // 
   _11=B'101',    // 
   _12=B'110',    // 
   _13=B'111',    // 
  };
 

Versão em código morse "1.005".

Aqui está a solução: a máscara é definida como uma enumeração

//+------------------------------------------------------------------+
//| Enum pattern mask                                                |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_MASK
  {
   _0    =   0    ,   // 0
   _1    =   1    ,   // 1

   _2    =   2    ,   // 00
   _3    =   3    ,   // 01
   _4    =   4    ,   // 10
   _5    =   5    ,   // 11

   _6    =   6    ,   // 000
   _7    =   7    ,   // 001
   _8    =   8    ,   // 010
   _9    =   9    ,   // 011
   _10   =   10   ,   // 100
   _11   =   11   ,   // 101
   _12   =   12   ,   // 110
   _13   =   13   ,   // 111

   _14   =   14   ,   // 0000
   _15   =   15   ,   // 0001
   _16   =   16   ,   // 0010
   _17   =   17   ,   // 0011
   _18   =   18   ,   // 0100
   _19   =   19   ,   // 0101
   _20   =   20   ,   // 0110
   _21   =   21   ,   // 0111
   _22   =   22   ,   // 1000
   _23   =   23   ,   // 1001
   _24   =   24   ,   // 1010
...

no OnInit(), a máscara é traduzida em uma variável de string"sExtMorseCode" (a variável"sExtMorseCode" é declarada globalmente) na função ConvertNumberToString:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ConvertNumberToString(const ENUM_PATTERN_MASK num_mask,string &text)
  {
   bool result=true;
//---
   switch(num_mask)
     {
      case 0:  text="0"; break;
      case 1:  text="1"; break;
      case 2:  text="00"; break;
      case 3:  text="01"; break;
      case 4:  text="10"; break;
      case 5:  text="11"; break;
      case 6:  text="000"; break;
      case 7:  text="001"; break;
      case 8:  text="010"; break;
      case 9:  text="011"; break;
      case 10: text="100"; break;
...
      case 53: text="10111"; break;
      case 54: text="11000"; break;
      case 55: text="11001"; break;
      case 56: text="11010"; break;
      case 57: text="11011"; break;
      case 58: text="11100"; break;
      case 59: text="11101"; break;
      case 60: text="11110"; break;
      case 61: text="11111"; break;
      default: text=""; return(false);
     }
//---
   return(result);
  }

Dois problemas foram resolvidos:

1). o usuário vê o padrão como "0101" nos parâmetros de entrada:

Visão conveniente do parâmetro de entrada

2). O parâmetro de entrada é perfeitamente otimizado no testador.

Arquivos anexados:
Morse_code.mq5  20 kb
 
Vladimir Karputov:

Versão em código morse "1.005".

Dois problemas foram resolvidos:

1). o usuário vê o padrão como "0101" nos parâmetros de entrada:

2). O parâmetro de entrada é perfeitamente otimizado no testador.

O usuário pode especificar uma combinação de castiçais sem cálculos matemáticos de acordo com a idéia inicial?

 
Pyxis:

O usuário pode especificar uma combinação de castiçais sem cálculos matemáticos, como originalmente concebido?


Sim, ele pode, sem nenhum cálculo matemático. E agora você não precisa inserir a combinação manualmente - basta selecionar a combinação apropriada de velas na lista suspensa"máscara padrão".
 
Ran in the testter (full optimization)Versão de código morse "1.005" - padrões puros (como agora) não são nada suspeitos :(.