摩尔斯电码 - 页 2

 

充分利用))。

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

使用))。


这实际上是)--但问题是用户会看到什么。他将看到数字 "2314"。有关烛台的数量和类型的信息是什么--牛市、熊市?对,零信息。我正在寻找一个选项,当用户在输入参数中看到 "101 "或 "011 "时...

但通过字符串是可以的。是的,这将是很好的信息,但是:你不能在测试器中运行字符串:( 。巴达。

 
НО: string не прогонишь в тестере
你能告诉我测试器和字符串有什么问题吗? (没有积极从事MT4/MT5的工作)
 
Vladimir Karputov:


这实际上是)--但问题是用户会看到什么。他将看到数字 "2314"。这个数字和蜡烛图的类型有什么信息--看涨、看跌?对,零信息。我正在寻找一个选项,当用户在输入参数中看到 "101 "或 "011 "时...

但用一个字符串就可以了。是的,这将是很好的信息,但是:字符串不能在测试器中运行:( 。悲伤。


关于交易、自动交易系统和策略测试的论坛

摩尔斯电码

Vladimir Pastushak, 2017.04.05 12:45


使输入参数为int类型,然后将int类型改为字符串并解析....。


 
哦,你不能为测试器中的字符串增加值?
创建一个文件,将所有的字符串放入其中,并使用字符串索引来确定你要测试的内容。
索引可以被递增
 
你是否尝试过位操作>>, <<, & , | , ^
 
Sergey Dzyublik:
哦,你不能为测试器中的字符串增加值?创建一个文件,将所有的字符串放入其中,并使用字符串索引来确定你要测试的内容。索引可以递增。


不,你不能。当你试图优化时,所有字符串在策略测试器中 都是灰色的。
 
Vladimir Karputov:


这实际上是)--但问题是用户会看到什么。他将看到数字 "2314"。有关烛台的数量和类型的信息是什么--牛市、熊市?对,零信息。我正在寻找一个选项,当用户在输入参数中看到 "101 "或 "011 "时...

但用一个字符串就可以了。是的,这将是很好的信息,但是:字符串不能在测试器中运行:( 。巴达。


那么就只剩下一个选择了。

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 "时...

但用一个字符串就可以了。是的,这将是很好的信息,但是:字符串不能在测试器中运行:( 。巴达。

这个问题不仅仅是清晰度的问题。假设在DEC中有数字13,它是什么样的模式:1101或001101或0001101?毕竟,所有的组合都产生相同的数字13。