모스 식 부호 - 페이지 2

 

사용))

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

사용))


실용적입니다( ). 하지만 문제는 사용자가 보게 되는 것입니다. 그리고 그는 NUMBER "2314"를 보게 될 것입니다. 그러한 수와 유형의 양초에는 어떤 정보가 있습니까? 강세, 약세? 맞습니다, 제로 정보입니다. 사용자가 입력 매개변수에서 "101" 또는 "011"을 볼 수 있도록 옵션을 찾고 있습니다...

그러나 문자열을 통해 가능합니다. 예, 아름답고 유익할 것입니다. 하지만 테스터에서 문자열을 실행할 수 없습니다.(. Byada.

 
НО: string не прогонишь в тестере
테스터와 스트링에 무슨 문제가 있는지 말해주세요. (나는 MT4/MT5에 적극적으로 참여하지 않습니다)
 
Vladimir Karputov :


실용적입니다( ). 하지만 문제는 사용자가 보게 되는 것입니다. 그리고 그는 숫자 "2314"를 보게 될 것입니다. 그러한 수와 유형의 양초에는 어떤 정보가 있습니까? 강세, 약세? 맞습니다, 제로 정보입니다. 사용자가 입력 매개변수에서 "101" 또는 "011"을 볼 수 있도록 옵션을 찾고 있습니다...

그러나 문자열을 통해 가능합니다. 예, 아름답고 유익할 것입니다. 하지만 테스터에서 문자열을 실행할 수 없습니다.(. Byada.


거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

모스 식 부호

블라디미르 파투샤크 , 2017.04.05 12:45


입력 매개변수 유형을 int로 만든 다음 유형 int를 문자열로 변환하고 구문 분석합니다.


 
그리고 테스터에서 문자열 값을 증가시킬 수 없습니까?
파일을 만들고 모든 문자열을 파일에 넣고 라인 인덱스로 테스트해야 하는 항목을 결정합니다.
인덱스는 증가할 수 있습니다
 
비트 연산을 시도하지 않음 >>, <<, & , | , ^
 
Sergey Dzyublik :
그리고 테스터에서 문자열 값을 증가시킬 수 없습니까?
파일을 만들고 모든 문자열을 파일에 넣고 라인 인덱스로 테스트해야 하는 항목을 결정합니다.
인덱스는 증가할 수 있습니다

금지되어 있습니다. 최적화를 시도할 때 전략 테스터 에서 모든 문자열이 회색으로 표시됩니다.
 
Vladimir Karputov :


실용적입니다( ). 하지만 문제는 사용자가 보게 되는 것입니다. 그리고 그는 숫자 "2314"를 보게 될 것입니다. 그러한 수와 유형의 양초에는 어떤 정보가 있습니까? 강세, 약세? 맞습니다, 제로 정보입니다. 사용자가 입력 매개변수에서 "101" 또는 "011"을 볼 수 있도록 옵션을 찾고 있습니다...

그러나 문자열을 통해 가능합니다. 예, 아름답고 유익할 것입니다. 하지만 테스터에서 문자열을 실행할 수 없습니다.(. Byada.


그런 다음 한 가지 옵션이 남아 있습니다.

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

일반적으로 지금까지 문자열에 정착했습니다.

버전 "1.000" : 촛대 조합 입력 매개변수를 문자열로.

 //+------------------------------------------------------------------+
//|                                                   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"을 볼 수 있도록 옵션을 찾고 있습니다...

그러나 문자열을 통해 가능합니다. 예, 아름답고 유익할 것입니다. 하지만 테스터에서 문자열을 실행할 수 없습니다.(. Byada.

문제는 시각적인 것만이 아닙니다. DEC에 숫자 13이 있다고 가정해 보겠습니다. 이 패턴은 무엇입니까: 1101 또는 001101 또는 0001101? 결국, 모든 조합은 동일한 숫자 13을 제공합니다.
사유: