Mors kodu - sayfa 2

 

Kullanmak))

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

Kullanmak))


Pratiktir ( ) - ama sorun KULLANICININ GÖRECEKLERİDİR. Ve "2314" NUMARASINI görecek. Böyle bir sayıda ve türde mum hangi bilgileri taşır - yükseliş, düşüş? Bu doğru, sıfır bilgi. Kullanıcının giriş parametrelerinde "101" veya "011" görmesi için bir seçenek arıyorum ...

Ancak dize ile mümkündür. Evet, güzel ve bilgilendirici olacak, AMA: test cihazında string çalıştıramazsınız :(. Byada.

 
НО: string не прогонишь в тестере
Söyle bana, lütfen, test cihazı ve ipin nesi var? (MT4/MT5'e aktif olarak dahil değilim)
 
Vladimir Karputov :


Pratiktir ( ) - ama sorun KULLANICININ GÖRECEKLERİDİR. Ve "2314" NUMARASINI görecek. Böyle bir sayıda ve türde mum hangi bilgileri taşır - yükseliş, düşüş? Bu doğru, sıfır bilgi. Kullanıcının giriş parametrelerinde "101" veya "011" görmesi için bir seçenek arıyorum ...

Ancak dize ile mümkündür. Evet, güzel ve bilgilendirici olacak, AMA: test cihazında string çalıştıramazsınız :(. Byada.


Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mors kodu

Vladimir Pastushak , 2017.04.05 12:45


girdi parametre türünü int yapın, ardından int türünü dizeye dönüştürün ve ayrıştırın ....


 
Ve test cihazındaki dizenin değerini artıramaz mısınız?
Bir dosya oluşturun, tüm dizeleri içine itin ve satır dizini tarafından neyin test edilmesi gerektiğini belirleyin.
Endeks artırılabilir
 
Bit düzeyinde işlemleri denemedim >>, <<, & , | , ^
 
Sergey Dzyublik :
Ve test cihazındaki dizenin değerini artıramaz mısınız?
Bir dosya oluşturun, tüm dizeleri içine itin ve satır dizini tarafından neyin test edilmesi gerektiğini belirleyin.
Endeks artırılabilir

Yasaktır. Optimize etmeye çalışırken strateji test cihazında tüm dizeler gridir.
 
Vladimir Karputov :


Pratiktir ( ) - ama sorun KULLANICININ GÖRECEKLERİDİR. Ve "2314" NUMARASINI görecek. Böyle bir sayıda ve türde mum hangi bilgileri taşır - yükseliş, düşüş? Bu doğru, sıfır bilgi. Kullanıcının giriş parametrelerinde "101" veya "011" görmesi için bir seçenek arıyorum ...

Ancak dize ile mümkündür. Evet, güzel ve bilgilendirici olacak, AMA: test cihazında string çalıştıramazsınız :(. Byada.


O zaman bir seçenek kalır:

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

Genel olarak, şimdiye kadar dizeye yerleştim.

sürüm "1.000" : bir dize olarak mum kombinasyonu giriş parametresi.

 //+------------------------------------------------------------------+
//|                                                   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() kontrollerinde

  • ilk olarak, satır başı karakterleri, boşluklar ve sekme karakterleri soldan ve sağdan kaldırılır
  • maksimum uzunluğu aşıp aşmadığını kontrol edin (bu kodda "5")
  • sıfır uzunluk kontrolü
  • sadece "0" ve "1" olup olmadığını kontrol edin (CheckCode)
OnTick() zaten mum türünü karşılaştırır ve giriş parametresine (mum kombinasyonu) bir dizi olarak erişir:

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


Pratiktir ( ) - ama sorun KULLANICININ GÖRECEKLERİDİR. Ve "2314" NUMARASINI görecek. Böyle bir sayıda ve türde mum hangi bilgileri taşır - yükseliş, düşüş? Bu doğru, sıfır bilgi. Kullanıcının giriş parametrelerinde "101" veya "011" görmesi için bir seçenek arıyorum ...

Ancak dize ile mümkündür. Evet, güzel ve bilgilendirici olacak, AMA: test cihazında string çalıştıramazsınız :(. Byada.

Sorun sadece görsel değil. Diyelim ki Aralık'ta 13 sayısı var, bu kalıp nedir: 1101 mi 001101 mi yoksa 0001101 mi? Sonuçta, tüm kombinasyonlar aynı 13 sayısını verir.
Neden: