Morseschrift - Seite 2

 

Nutzen Sie die Vorteile))

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

Verwendung)).


Es ist praktisch) - aber das Problem ist, WAS DER BENUTZER SEHEN WIRD. Er wird die NUMMER "2314" sehen. Welche Informationen über die Anzahl und die Art der Kerzenständer - Bulle, Bär? Richtig, null Informationen. Ich bin auf der Suche nach einer Option, wenn der Benutzer "101" oder "011" in den Eingabeparametern sieht ...

Aber es ist möglich, über einen String. Ja, das wäre schön und informativ, aber: Sie können den String nicht im Tester ausführen :( . Bada.

 
НО: string не прогонишь в тестере
Können Sie mir sagen, was mit dem Tester und dem String nicht stimmt? (nicht aktiv mit MT4/MT5 beschäftigt)
 
Vladimir Karputov:


Das ist praktisch) - aber das Problem ist, WAS DER BENUTZER SEHEN WIRD. Und er wird die NUMMER "2314" sehen. Welche Informationen enthält diese Zahl und diese Art von Kerze - bullish, bearish? Richtig, null Informationen. Ich bin auf der Suche nach einer Option, wenn der Benutzer "101" oder "011" in den Eingabeparametern sieht ...

Aber mit einer Zeichenkette ist es möglich. Ja, das wäre schön und informativ, aber: der String kann nicht im Tester ausgeführt werden :( . Kummer.


Forum für Handel, automatisierte Handelssysteme und Strategietests

Morsezeichen

Vladimir Pastushak, 2017.04.05 12:45


Eingabeparameter als int-Typ festlegen, dann int-Typ in String ändern und parsen ....


 
Oh, Sie können den Wert für Strings im Tester nicht inkrementieren?
Erstellen Sie eine Datei, fügen Sie alle Zeichenfolgen ein und verwenden Sie den Zeichenfolgenindex, um zu bestimmen, was Sie testen möchten.
Der Index kann inkrementiert werden
 
Haben Sie die bitweisen Operationen >>, <<, & , | , ^
 
Sergey Dzyublik:
Oh, Sie können den Wert für Strings im Tester nicht inkrementieren?
Erstellen Sie eine Datei, fügen Sie alle Zeichenfolgen ein und verwenden Sie den Zeichenfolgenindex, um zu bestimmen, was Sie testen möchten.
Der Index kann inkrementiert werden.

Nein, das können Sie nicht. Alle Strings sind im Strategietester ausgegraut, wenn Sie versuchen zu optimieren.
 
Vladimir Karputov:


Das ist praktisch) - aber das Problem ist, WAS DER BENUTZER SEHEN WIRD. Er wird die NUMMER "2314" sehen. Welche Informationen über die Anzahl und die Art der Kerzenständer - Bulle, Bär? Richtig, null Informationen. Ich bin auf der Suche nach einer Option, wenn der Benutzer "101" oder "011" in den Eingabeparametern sieht ...

Aber mit einer Zeichenkette ist es möglich. Ja, das wäre schön und informativ, aber: der String kann nicht im Tester ausgeführt werden :( . Bada.


Dann gibt es nur noch eine Möglichkeit:

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

Bis jetzt habe ich mich für Schnur entschieden.

Version "1.000": Eingabeparameter der Candlestick-Kombination als 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);
  }
//+------------------------------------------------------------------+

In OnInit() prüft

  • Laufschriftzeichen, Leerzeichen und Tabulatoren auf der linken und rechten Seite werden zuerst entfernt
  • Prüfung auf Überschreitung der maximalen Länge (in diesem Code "5")
  • Prüfung auf Nulllänge
  • nur auf "0" und "1" prüfen (CheckCode)
In OnTick() wird bereits der Typ des Candlesticks verglichen und der Eingabeparameter (Kombination von Candlesticks) als Array bezeichnet:

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


Das ist praktisch) - aber das Problem ist, WAS DER BENUTZER SEHEN WIRD. Er wird die NUMMER "2314" sehen. Welche Informationen über die Anzahl und die Art der Kerzenständer - Bulle, Bär? Richtig, null Informationen. Ich bin auf der Suche nach einer Option, wenn der Benutzer "101" oder "011" in den Eingabeparametern sieht ...

Aber mit einer Zeichenkette ist es möglich. Ja, das wäre schön und informativ, aber: der String kann nicht im Tester ausgeführt werden :( . Bada.

Das Problem liegt nicht nur in der Klarheit. Angenommen, in DEC gibt es die Zahl 13. Was für ein Muster ist das: 1101 oder 001101 oder 0001101? Schließlich ergeben alle Kombinationen die gleiche Zahl 13.