Código morse - página 2

 

Aproveite)))

 input uint m=2314;//Входной набор двоичных данных в виде десятичного числа
 ...
 int i1;
 for(i1=0;i1<32;i1++) //Пример получения каждого бита с позиции i1 начиная с младших бит
   {
    Print((m>>i1)&1);
   }
 
Aliaksandr Hryshyn:

Utilização)).


É praticamente) - mas o problema é O QUE O USUÁRIO VERÁ. Ele verá o NÚMERO "2314". Que informações sobre o número e tipo de castiçais - touro, urso? Certo, zero informações. Estou procurando uma opção, quando o usuário vê "101" ou "011" nos parâmetros de entrada ...

Mas isso é possível por meio de cordel. Sim, será agradável e informativo, mas: você não pode correr o fio no testador :( . Bada.

 
НО: string не прогонишь в тестере
Você pode me dizer o que há de errado com o testador e a corda? (não envolvido ativamente no MT4/MT5)
 
Vladimir Karputov:


Isto é praticamente) - mas o problema é O QUE O USUÁRIO VERÁ. Ele verá NÚMERO "2314". Que informações este número e tipo de candelabro tem - touro, urso? Certo, zero informações. Estou procurando uma opção, quando o usuário vê "101" ou "011" nos parâmetros de entrada ...

Mas é possível com um cordel. Sim, será agradável e informativo, mas: o fio não pode ser executado no testador :( . Luto.


Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Código morse

Vladimir Pastushak, 2017.04.05 12:45


fazer parâmetro de entrada como tipo int e depois mudar o tipo int para string e parse ....


 
Oh, você não pode incrementar o valor das cordas no testador?
Crie um arquivo, coloque todas as cordas nele, e use o índice de cordas para determinar o que você quer testar.
O índice pode ser incrementado
 
Você já tentou operações bitwise >>, <<, & , | , ^
 
Sergey Dzyublik:
Oh, você não pode incrementar o valor das cordas no testador?
Crie um arquivo, coloque todas as cordas nele, e use o índice de cordas para determinar o que você quer testar.
O índice pode ser incrementado.

Não, você não pode. Todas as cordas são cinzentas no testador de estratégia quando se tenta otimizar.
 
Vladimir Karputov:


Isto é praticamente) - mas o problema é O QUE O USUÁRIO VERÁ. Ele verá o NÚMERO "2314". Que informações sobre o número e tipo de castiçais - touro, urso? Certo, zero informações. Estou procurando uma opção, quando o usuário vê "101" ou "011" nos parâmetros de entrada ...

Mas é possível com um cordel. Sim, será agradável e informativo, mas: o fio não pode ser executado no testador :( . Bada.


Então, só resta uma opção:

extern int  bars=4;//Количество используемых свечей
extern bool bar1=true;//1-я свеча
extern bool bar2=true;//...
extern bool bar3=false;
extern bool bar4=true;
extern bool bar5=true;
...
 

Até agora, eu me acomodei ao fio.

versão "1.000": parâmetro de entrada da combinação do castiçal como string.

//+------------------------------------------------------------------+
//|                                                   Morse code.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property description "Bull candle - \"1\", bear candle - \"0\""
//---
#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object
//---
input string               InpMorseCode   = "101";             // maximum quantity of symbols: 5
input ENUM_POSITION_TYPE   InpPosType     = POSITION_TYPE_BUY; // posinion type
input double               InpLot         = 0.1;               // lot
input ulong                m_magic        = 88430400;          // magic number
input ulong                m_slippage     = 30;                // slippage
//---
string sExtMorseCode="";
int max_len=5;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   sExtMorseCode=InpMorseCode;

   StringTrimLeft(sExtMorseCode);
   StringTrimRight(sExtMorseCode);

   if(StringLen(sExtMorseCode)>max_len)
     {
      Print("PARAMETERS INCORRECT: Code length is more than ",IntegerToString(max_len)," characters");
      return(INIT_PARAMETERS_INCORRECT);
     }

   if(StringLen(sExtMorseCode)==0)
     {
      Print("PARAMETERS INCORRECT: Length of a code is equal to zero");
      return(INIT_PARAMETERS_INCORRECT);
     }

   if(!CheckCode(sExtMorseCode))
     {
      Print("PARAMETERS INCORRECT");
      return(INIT_PARAMETERS_INCORRECT);
     }
//---
   m_trade.SetExpertMagicNumber(m_magic);

   if(IsFillingTypeAllowed(Symbol(),SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);

   m_trade.SetDeviationInPoints(m_slippage);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   static datetime PrevBars=0;
   datetime time_0=iTime(0);
   if(time_0==PrevBars)
      return;
   PrevBars=time_0;

   int count=StringLen(sExtMorseCode);

   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(NULL,0,1,count,rates);
//--- Example:
//--- rates[2].time -> D'2015.05.28 00:00:00'
//--- rates[0].time -> D'2015.06.01 00:00:00'
   if(copied<=0)
     {
      Print("Error copying price data ",GetLastError());
      return;
     }

   bool result=true;

   for(int i=0;i<StringLen(sExtMorseCode);i++)
     {
      if(sExtMorseCode[i]=='0')
        {
         if(rates[i].open<rates[i].close)
           {
            result=false;
            break;
           }
        }
      else  if(sExtMorseCode[i]=='1')
        {
         if(rates[i].open>rates[i].close)
           {
            result=false;
            break;
           }
        }
     }

   if(!result)
      return;

//--- 
   if(InpPosType==POSITION_TYPE_BUY)
      m_trade.Buy(InpLot);
   else
      m_trade.Sell(InpLot);

   int d=0;
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheckCode(const string text)
  {
   bool result=true;
   for(int i=0;i<StringLen(text);i++)
     {
      if(text[i]!='0' && text[i]!='1')
         return(false);
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+ 
//| Checks if the specified filling mode is allowed                  | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(string symbol,int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes 
   int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Return true, if mode fill_type is allowed 
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0) time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+

Nas verificações OnInit()

  • os caracteres, espaços e abas à esquerda e à direita são removidos primeiro
  • verificar se o comprimento máximo foi excedido (neste código "5")
  • verificar se o comprimento é zero
  • verificar somente "0" e "1" (CheckCode)
Em OnTick() já compara o tipo de castiçal e se refere ao parâmetro de entrada (combinação de castiçais) como uma matriz:

   for(int i=0;i<StringLen(sExtMorseCode);i++)
     {
      if(sExtMorseCode[i]=='0')
        {
         if(rates[i].open<rates[i].close)
           {
            result=false;
            break;
           }
        }
      else  if(sExtMorseCode[i]=='1')
        {
         if(rates[i].open>rates[i].close)
           {
            result=false;
            break;
           }
        }
     }
Arquivos anexados:
Morse_code.mq5  12 kb
 
Vladimir Karputov:


Isto é praticamente) - mas o problema é O QUE O USUÁRIO VERÁ. Ele verá o NÚMERO "2314". Que informações sobre o número e tipo de castiçais - touro, urso? Certo, zero informações. Estou procurando uma opção, quando o usuário vê "101" ou "011" nos parâmetros de entrada ...

Mas é possível com um cordel. Sim, será agradável e informativo, mas: o fio não pode ser executado no testador :( . Bada.

O problema não é apenas a clareza. Suponha que haja o número 13 em DEC, que tipo de padrão é: 1101 ou 001101 ou 0001101? Afinal de contas, todas as combinações produzem o mesmo número 13.