Morse code - страница 2

 

Пользуйся))

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

Пользуйся))


Это практически () - но проблема в том, ЧТО УВИДИТ ПОЛЬЗОВАТЕЛЬ. А увидит он ЧИСЛО "2314". Какую информацию несёт такое число и типе свечей - бычья, медвежья? Правильно, ноль информации. Я ищу вариант, чтобы пользователь видел во входных параметрах "101" или "011" ... 

Но это возможно через string. Да будет красиво и информативно, НО: string не прогонишь в тестере :( . Бяда.

 
НО: string не прогонишь в тестере
Подскажите, пожалуйста, а что не так с тестером и стрингом? (не занимаюсь активно МТ4/МТ5)
 
Vladimir Karputov:


Это практически () - но проблема в том, ЧТО УВИДИТ ПОЛЬЗОВАТЕЛЬ. А увидит он ЧИСЛО "2314". Какую информацию несёт такое число и типе свечей - бычья, медвежья? Правильно, ноль информации. Я ищу вариант, чтобы пользователь видел во входных параметрах "101" или "011" ... 

Но это возможно через string. Да будет красиво и информативно, НО: string не прогонишь в тестере :( . Бяда.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Morse code

Vladimir Pastushak, 2017.04.05 12:45


сделайте входной параметр типом int далее перевидите тип инт в стринг и распарсите ....


 
А, нельзя инкрементировать значение для стринг в тестере?
Создайте файл, засуньте в него все-все стринги, и по индексу строки определяйтесь, что нужно тестить.
Индекс же можно инкрементировать
 
Битовые операции не пробовали >>,  <<,   &  ,  | ,  ^
 
Sergey Dzyublik:
А, нельзя инкрементировать значение для стринг в тестере?
Создайте файл, засуньте в него все-все стринги, и по индексу строки определяйтесь, что нужно тестить.
Индекс же можно инкрементировать

Нельзя. Все стринги серого цвета в тестере стратегий при попытке оптимизации.
 
Vladimir Karputov:


Это практически () - но проблема в том, ЧТО УВИДИТ ПОЛЬЗОВАТЕЛЬ. А увидит он ЧИСЛО "2314". Какую информацию несёт такое число и типе свечей - бычья, медвежья? Правильно, ноль информации. Я ищу вариант, чтобы пользователь видел во входных параметрах "101" или "011" ... 

Но это возможно через string. Да будет красиво и информативно, НО: string не прогонишь в тестере :( . Бяда.


Тогда остаётся один вариант:

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

В общем пока остановился на string.

version   "1.000": входной параметр комбинации свечей в виде 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);
  }
//+------------------------------------------------------------------+

в OnInit() проверки

  • сначала удаляются символы перевода каретки, пробелы и символы табуляции слева и справа
  • проверка на превышение максимальной длины (в данном коде "5")
  • проверка на нулевую длину
  • проверка на присутствие только "0" и "1" (CheckCode)
В OnTick() уже сравнивается тип свечи и обращение к входному параметру (комбинация свечей) как к массиву:

   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;
           }
        }
     }
Файлы:
Morse_code.mq5  12 kb
 
Vladimir Karputov:


Это практически () - но проблема в том, ЧТО УВИДИТ ПОЛЬЗОВАТЕЛЬ. А увидит он ЧИСЛО "2314". Какую информацию несёт такое число и типе свечей - бычья, медвежья? Правильно, ноль информации. Я ищу вариант, чтобы пользователь видел во входных параметрах "101" или "011" ... 

Но это возможно через string. Да будет красиво и информативно, НО: string не прогонишь в тестере :( . Бяда.

Проблема не только в наглядности. Допустим есть число 13 в DEC что это за паттерн: 1101 или 001101 или 0001101? Ведь все комбинации дают одно и тоже число 13.