Código Morse - página 2

 

Aprovecha))

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

Uso)).


Es prácticamente) - pero el problema es LO QUE EL USUARIO VERÁ. Verá el NÚMERO "2314". ¿Qué información sobre el número y el tipo de velas - alcista, bajista? Correcto, cero información. Estoy buscando una opción, cuando el usuario ve "101" o "011" en los parámetros de entrada ...

Pero es posible a través de la cadena. Sí, será bonito e informativo, pero: no se puede ejecutar la cadena en el probador :( . Bada.

 
НО: string не прогонишь в тестере
¿Puede decirme qué pasa con el probador y la cadena? (no participa activamente en MT4/MT5)
 
Vladimir Karputov:


Esto es prácticamente) - pero el problema es LO QUE EL USUARIO VERÁ. Y verá el número "2314". ¿Qué información tiene este número y tipo de vela: alcista, bajista? Correcto, cero información. Estoy buscando una opción, cuando el usuario ve "101" o "011" en los parámetros de entrada ...

Pero es posible con una cadena. Sí, será bonito e informativo, pero: la cadena no se puede ejecutar en el probador :( . Duelo.


Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Código Morse

Vladimir Pastushak, 2017.04.05 12:45


hacer que el parámetro de entrada sea de tipo int y luego cambiar el tipo int a cadena y parsear ....


 
¿No puedes incrementar el valor de las cadenas en el probador?
Cree un archivo, ponga todas las cadenas en él y utilice el índice de cadenas para determinar lo que quiere probar.
El índice puede incrementarse
 
¿Has probado con las operaciones a nivel de bits >>, <<, & , | , ^
 
Sergey Dzyublik:
¿No puedes incrementar el valor de las cadenas en el probador?
Cree un archivo, ponga todas las cadenas en él y utilice el índice de cadenas para determinar lo que quiere probar.
El índice puede incrementarse.

No, no puedes. Todas las cadenas aparecen en gris en el probador de estrategias cuando se intenta optimizar.
 
Vladimir Karputov:


Esto es prácticamente) - pero el problema es LO QUE EL USUARIO VERÁ. Verá el NÚMERO "2314". ¿Qué información sobre el número y el tipo de velas - alcista, bajista? Correcto, cero información. Estoy buscando una opción, cuando el usuario ve "101" o "011" en los parámetros de entrada ...

Pero es posible con una cadena. Sí, será bonito e informativo, pero: la cadena no se puede ejecutar en el probador :( . Yada.


Entonces sólo queda una opción:

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;
...
 

Hasta ahora me he decantado por la cuerda.

versión "1.000": parámetro de entrada de la combinación de velas como cadena.

//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+

En OnInit() comprueba

  • los caracteres de carro, los espacios y los tabuladores a la izquierda y a la derecha se eliminan primero
  • comprobar si se supera la longitud máxima (en este código "5")
  • comprobar la longitud del cero
  • comprobar sólo "0" y "1" (CheckCode)
En OnTick() ya compara el tipo de vela y hace referencia al parámetro de entrada (combinación de velas) como un array:

   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;
           }
        }
     }
Archivos adjuntos:
Morse_code.mq5  12 kb
 
Vladimir Karputov:


Esto es prácticamente) - pero el problema es LO QUE EL USUARIO VERÁ. Verá el NÚMERO "2314". ¿Qué información sobre el número y el tipo de velas - alcista, bajista? Correcto, cero información. Estoy buscando una opción, cuando el usuario ve "101" o "011" en los parámetros de entrada ...

Pero es posible con una cadena. Sí, será bonito e informativo, pero: la cadena no se puede ejecutar en el probador :( . Bada.

El problema no es sólo de claridad. Supongamos que hay un número 13 en DEC, ¿qué tipo de patrón es: 1101 o 001101 o 0001101? Al fin y al cabo, todas las combinaciones dan como resultado el mismo número 13.