Código morse - página 4

 

Deixei de fora o parâmetro"comprimento do padrão " para especificar o comprimento para o padrão numérico (este parâmetro é usado apenas para o modo de otimização).

#property version   "1.003"
#property description "Bull candle - \"1\", bear candle - \"0\""
//---
#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object
//+------------------------------------------------------------------+
//| Enum pattern type: numerical or string                           |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_TYPE
  {
   PATTERN_TYPE_NUMERICAL=0,  // numerical
   PATTERN_TYPE_STRING=1,     // string 
  };
//---
input ENUM_PATTERN_TYPE    InpPatternType          = PATTERN_TYPE_STRING;  // pattern type
input uchar                InpLenNumerical         = 3;                    // length of the pattern (use only if pattern "numerical")
input string               InpsMorseCode           = "101";                // string Morse code (max 5 characters)
input ENUM_POSITION_TYPE   InpPosType              = POSITION_TYPE_BUY;    // posinion type
input double               InpLot                  = 0.1;                  // lot
sinput ulong               m_magic                 = 88430400;             // magic number
input ulong                m_slippage              = 30;                   // slippage
//---
string sExtMorseCode="";
int max_string_len=5;         // limitation of the length of the pattern "string"
int i_morse_code=0;           // int Morse code (use only if pattern type=numerical)
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(InpPatternType==PATTERN_TYPE_STRING)
     {
      //--- check start mode
      if(MQLInfoInteger(MQL_OPTIMIZATION))
         return(INIT_PARAMETERS_INCORRECT);
      //--- info print
      Print("The type of the pattern \"string\" is set - the parameters \"pattern length\" and \"int Morse code\" are ignored");

      sExtMorseCode=InpsMorseCode;

E uma rápida defesa - se você selecionar um tipo de padrão de string no modo de otimização, o Expert Advisor retornará "INIT_PARAMETERS_INCORRECT".

 
Vitalii Ananev:


Você tem que pensar em tudo imediatamente, para que não tenha que refazê-lo mais tarde.

....

Mais uma vez, se voltarmos ao padrão "Estrela da Noite", ele pode ser visto como uma tomada de controle de um pequeno touro e uma tomada de controle de um grande touro. Isso significa que temos um padrão composto que consiste em uma vela em alta e uma absorção em baixa. E se somarmos os três castiçais a partir do padrão, obtemos novamente uma barra de pino.



Deixe-me inserir meu kopeck de 5 kopeck.

Esta tarefa não foi definida e é impossível prever tudo de uma só vez. Neste caso, o conceito inicial que foi planejado como básico será perdido: um usuário constrói a seqüência de castiçais em alta e em baixa e o programa procura por estas seqüências e negócios, então por que resumimos os castiçais em um padrão?

 
Pyxis:


Permita que eu insira meus cinco centavos.

Esta não era a tarefa, e é impossível prover tudo de uma só vez, neste caso perdemos o conceito original que foi concebido como o principal: o usuário faz uma seqüência de velas em alta e em baixa, e o programa procura por estas seqüências e negócios, então por que resumir as velas em um só padrão?


Por que os resumimos? Bem, por exemplo, para simplificar o modelo. Na verdade, ela foi dada como exemplo.

Por que isso não é possível? Todas as combinações de castiçais japoneses que ocorrem com freqüência podem ser codificadas de uma forma ou de outra. Outra coisa é que a 1ª parte (eu escrevi sobre isso acima) não é suficiente, você deve usar pelo menos 2 partes, e elas também não são suficientes se você não resumir (simplificar) o modelo padrão.

 

Até agora, código Morse versão "1.003": você pode especificar manualmente uma descrição em cadeia do padrão e até mesmo executar passagens simples no testador.

Arquivos anexados:
Morse_code.mq5  15 kb
 
Vladimir Karputov:


O programa será usado por um usuário, não por um programador (foi dito acima e não uma vez) - e para ele "101" e "5" são dois números diferentes, e para ele "5" não contém nenhuma informação sobre a posição relativa das velas, mas "101" diz claramente "em alta, em baixa, em alta".

Entendi. Bem, então - uma seqüência de símbolos e um interpretador. Acho que é a opção mais flexível.
 
George Merts:

Não entendo bem - estes são programadores ou otários?

Por que precisamos traduzir algo em algo?

Se precisarmos de um código 101 - esse é o valor normal de 5. É isso. Qual é o problema? Traduzir mentalmente o decimal em binário?

Fiz experiências semelhantes, apenas minha vela tinha mais quatro tamanhos - de pequeno a grande. Isso faz oito tamanhos diferentes de velas. E, conseqüentemente, três bits. No padrão nós escrevemos o número (ulong) - a grade é maior do que no padrão de vinte barras.

O problema é, em minha opinião, rebuscado.

Primeiro, resolver o problema e depois criticar. Aqui está uma tarefa para você pensar:

Codifique o número int para as seguintes combinações de candelabros:

  • 1011;
  • 01011;
  • 001011

Dica: estas são combinações diferentes.

George Merts:
Entendi. Bem, então - cadeia de caracteres e interpretador. Parece-me ser a opção mais flexível.
Mais uma vez: otimizador_não_optimizador_parâmetros_de_estrutura. Como você buscará uma combinação de padrões lucrativos sem o otimizador?
 
Vasiliy Sokolov:
Mais uma vez: o otimizador_não_optimizará_parâmetros_de_string. Como você buscará a combinação de padrões lucrativos sem o otimizador?

Se for necessário um otimista, acho que o usuário deve ser "esperto" o suficiente para traduzir o número em código binário (pelo menos com uma calculadora normal do Windows).

Vocês, amigos, têm um pedido contraditório. Se um usuário é tão falso que não pode usar uma calculadora para traduzir o código binário em código decimal - ele não pode lidar com a otimização de qualquer forma. No máximo, ele/ela pode executá-lo apenas uma vez para encontrar o melhor valor.

Se o usuário for suficientemente avançado para usar o otimizador, é razoável codificar os parâmetros de entrada com um comprimento regular sem assinatura,

 
Vasiliy Sokolov:

Descobrir primeiro e depois criticar. Aqui está uma tarefa estimulante para você:

Codifique o número int com as seguintes combinações de velas:

  • 1011;
  • 01011;
  • 001011

Dica: estas são combinações diferentes.

Além disso - eles são diferentes em comprimento. A primeira combinação - inclui quatro combinações de seis dígitos.

A segunda combinação inclui duas de seis bits.

De forma correspondente, devemos tomar apenas 64 combinações de seis bits durante a otimização.

Além disso, a última é um subconjunto das duas primeiras opções, e a penúltima é um subconjunto da primeira.

Portanto, no momento do registro da última combinação temos que identificar a segunda e a primeira combinação ao mesmo tempo. Na minha opinião, este é claramente um pedido incorreto.

 
Qual é o objetivo deste evento - encontrar a seqüência mais lucrativa? Não é necessário um robô ou um testador para isso - um indicador, no qual o comprimento da seqüência e as regras para fechar a posição (por TP ou pelo sinal oposto ou em qualquer outro lugar) são especificados, é suficiente. O indicador codificará todas as variantes dentro do comprimento especificado da seqüência e uma profundidade específica do histórico, ordenará o resultado (incluindo o sorteio) e o imprimirá onde você quiser. Mas o problema parece realmente rebuscado. Bem, se não é um brinquedo de adivinhação como 0101 para ocupar o usuário
 
George Merts:

Assim, ao otimizar - basta tomar 64 combinações de seis dígitos.

Pergunta: Qual é a probabilidade de aparecer no mercado uma combinação que corresponda aos 64 dígitos exigidos? Resposta: (1/2^64)*BarsCount. Isso significa que há quase 100% de probabilidade de que não será encontrada tal combinação. É ó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.

Com passos tão pequenos você logo chegará ao que eu disse na segunda página.