Le code morse - page 2

 

Profitez-en))

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

Utiliser)).


C'est pratiquement) - mais le problème est de savoir CE QUE L'UTILISATEUR VA VOIR. Il verra le NUMÉRO "2314". Quelles informations concernant le nombre et le type de chandeliers - bull, bear ? Exact, zéro information. Je cherche une option, lorsque l'utilisateur voit "101" ou "011" dans les paramètres d'entrée ...

Mais c'est possible via une chaîne de caractères. Oui, ce sera agréable et informatif, mais : la chaîne ne fonctionnera pas dans le testeur :( . Bada.

 
НО: string не прогонишь в тестере
Pouvez-vous me dire ce qui ne va pas avec le testeur et la corde ? (pas activement engagé dans MT4/MT5)
 
Vladimir Karputov:


C'est pratiquement) - mais le problème est de savoir CE QUE L'UTILISATEUR VA VOIR. Et il verra le NUMÉRO "2314". Quelle information donne ce nombre et ce type de chandelier - haussier, baissier ? Exact, zéro information. Je cherche une option, lorsque l'utilisateur voit "101" ou "011" dans les paramètres d'entrée ...

Mais c'est possible avec une chaîne. Oui, ce sera agréable et informatif, mais : la chaîne ne peut pas être exécutée dans le testeur :( . Le deuil.


Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Le code morse

Vladimir Pastushak, 2017.04.05 12:45


faire en sorte que le paramètre d'entrée soit de type int, puis changer le type int en chaîne et analyser ....


 
Oh, vous ne pouvez pas incrémenter la valeur des chaînes de caractères dans le testeur ?
Créez un fichier, placez-y toutes les chaînes et utilisez l'index des chaînes pour déterminer ce que vous voulez tester.
L'indice peut être incrémenté
 
Avez-vous essayé les opérations par bit >>, <<, & , | , ^.
 
Sergey Dzyublik:
Oh, vous ne pouvez pas incrémenter la valeur des chaînes de caractères dans le testeur ?
Créez un fichier, placez-y toutes les chaînes et utilisez l'index des chaînes pour déterminer ce que vous voulez tester.
L'indice peut être incrémenté.

Non, tu ne peux pas. Toutes les chaînes sont grisées dans le testeur de stratégie lorsque vous essayez d'optimiser.
 
Vladimir Karputov:


C'est pratiquement) - mais le problème est de savoir CE QUE L'UTILISATEUR VA VOIR. Il verra le NUMÉRO "2314". Quelles informations concernant le nombre et le type de chandeliers - bull, bear ? Exact, zéro information. Je cherche une option, lorsque l'utilisateur voit "101" ou "011" dans les paramètres d'entrée ...

Mais c'est possible avec une chaîne. Oui, ce sera agréable et informatif, mais : la chaîne ne peut pas être exécutée dans le testeur :( . Bada.


Alors il ne reste qu'une seule option :

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

Pour l'instant, j'ai opté pour la ficelle.

version "1.000": paramètre d'entrée de la combinaison de chandeliers sous forme de chaîne.

//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+

Dans les contrôles OnInit()

  • les caractères de transport, les espaces et les tabulations à gauche et à droite sont supprimés en premier.
  • vérification du dépassement de la longueur maximale (dans ce code "5")
  • vérifier la longueur zéro
  • contrôle uniquement pour "0" et "1" (CheckCode)
Dans OnTick(), il compare déjà le type de chandelier et se réfère au paramètre d'entrée (combinaison de chandeliers) comme un tableau :

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


C'est pratiquement) - mais le problème est de savoir CE QUE L'UTILISATEUR VA VOIR. Il verra le NUMÉRO "2314". Quelles informations concernant le nombre et le type de chandeliers - bull, bear ? Exact, zéro information. Je cherche une option, lorsque l'utilisateur voit "101" ou "011" dans les paramètres d'entrée ...

Mais c'est possible avec une chaîne. Oui, ce sera agréable et informatif, mais : la chaîne ne peut pas être exécutée dans le testeur :( . Bada.

Le problème n'est pas seulement une question de clarté. Supposons qu'il y ait le numéro 13 dans DEC, de quel type de motif s'agit-il : 1101 ou 001101 ou 0001101 ? Après tout, toutes les combinaisons donnent le même nombre 13.
Raison: