Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 209

 
Alexey Viktorov:

Le problème se situe dans cette ligne

Comme je veux vérifier plusieurs devises sur une barre, je dois vérifier l'heure et la devise pour éviter de répéter une alerte sur une barre et un symbole mais autoriser une alerte sur la même barre avec un symbole différent. A première vue, nous avons besoin d'un tableau supplémentaire avec des drapeaux indiquant si le symbole est vu ou non.

En général, nous devons soit ajouter une vérification du symbole à cette ligne, soit répéter la boucle uniquement lorsqu'une nouvelle barre apparaît. Mais j'ai peur que lorsqu'une nouvelle barre apparaît sur le symbole avec cet indicateur, une nouvelle barre ne soit pas encore apparue sur un autre symbole.

Conclusion : nous devons solliciter les muscles de notre tête pour déterminer si une nouvelle barre apparaît sur chaque symbole séparément, mais en même temps pour ne pas étirer le nombre de lignes à l'infini. Je n'ai pas de solution toute faite. Et je n'aime pas le suggérer en écrivant du code...

Et je n'ai pas résolu son problème ?

J'ai peut-être manqué quelque chose quelque part - j'ai écrit le code sur mon genou.

 
Artyom Trishkin:

Et je n'ai pas résolu son problème ?

J'ai peut-être manqué quelque chose quelque part - j'ai écrit le code sur mon genou.

Artem, la dernière phrase de mon post explique tout. Je n'ai même pas regardé ton code. J'ai ouvert la première question non lue avec une citation de ma réponse précédente, j'ai répondu et j'ai ensuite vu les autres conseils. Je ne doute pas de l'exactitude de votre code, même de mon genou...

 
Alexey Viktorov:

Artyom, la dernière phrase de mon post explique tout. Je n'ai même pas regardé ton code. J'ai ouvert la première question non lue, avec une citation de ma réponse précédente, j'ai répondu et j'ai ensuite vu d'autres conseils. Je ne doute pas de l'exactitude de votre code, même de mon genou...

J'aurais dit paresseux ;)

Même au premier coup d'œil, vous pouvez voir que le code dépend des ticks sur le symbole actuel. Et donc nous devons enlever la boucle de OnTick() et la mettre dans un timer. Et modifier légèrement la définition des alertes temporelles.

 

Bonjour à tous, il y a un malentendu sur le processus, dans la fonction "start" dans le cycle mm++ ; et suivre les changements dans celui-ci à travers Print(); donc la question : "Pourquoi au lieu de 1,2,3,4, etc. apparaissent des nombres à quatre chiffres ? "

le code lui-même

int start()

  {
   int    counted_bars=IndicatorCounted();
   int limit, i;
                                               int mm=0;     // ======= ПЕРВОЕ========
  

   if(counted_bars<0) return(-1);

   limit=(Bars-counted_bars)-1;

for (i=limit; i>=0;i--)
    { 
       if (TimeDayOfWeek(Time[i]) != 0)
       {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];}
 

if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0)
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print(" TEST= ",mm);// ========ТРЕТЬЕ========
  
   LastLow=Open[i]; LastHigh=Open[i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
     ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return(0);
  }
//+------------------------------------------------------------------+
 
виталик:

Bonjour à tous, il y a un malentendu sur le processus, dans la fonction "start" dans le cycle mm++ ; et suivre les changements dans celui-ci à travers Print() ; donc la question : "Pourquoi au lieu de 1,2,3,4, etc. apparaissent des nombres à quatre chiffres ? "

le code lui-même


Au premier passage, 10 secondesIndicateurCounted()=0

 limit=(Bars-counted_bars)-1;

donclimite = nombre maximum de barres dans l'historique-1

 
Alekseu Fedotov:


Au premier lancement, pendant 10 secondesIndicatorCounted()=0

limite des moyens= barres maximales dans l'historique-1

toujours pas clair, la déclaration et l'initialisation avec zéro en dehors de la boucle int mm=0 ; et placé dans la boucle mm++ ; print() montre des nombres à quatre chiffres changeant avec une différence d'une unité seulement dans le sens descendant pour une raison quelconque.
 
виталик:
toujours pas clair, déclaration et initialisation avec zéro en dehors de la boucle int mm=0 ; et placé dans la boucle mm++ ; print() montre des nombres à quatre chiffres changeant avec une différence d'une unité, seulement dans le sens descendant pour une raison quelconque.
Toutes les empreintes ne sont pas imprimées dans ce journal. Regardez dans le dossier.
 

Alexey Viktorov:

...vous devez forcer les muscles de votre tête...

Merci à tous ceux qui ont répondu.

Artyom Trishkin: Comme ça :

Artem, pourquoi écrivez-vous que vous ne l'avez pas résolu ? Il envoie les signaux pour tous les outils, mais il ne fait que charger lourdement le système. Est-il possible de réduire la charge ?

Limiter la vérification à une nouvelle barre ne fonctionnera pas car il y aura également des conditions qui devront être vérifiées à chaque tick.

J'ai essayé d'ajouter OnTimer() à votre code. Cela a fonctionné dans l'EA avec OnTick() mais comment le faire avec OnCalculate ?

int OnInit()
  {
  EventSetMillisecondTimer(1);
//--- indicator buffers mapping
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
{// ---
        EventKillTimer();
 // ---
}
void OnTimer()
  {
   RefreshRates();
  // OnTick();
   OnCalculate();
  }

 
Ibragim Dzhanaev:

Pouvez-vous me dire pourquoi les commandes ne s'ouvrent pas ?


OK, ça va s'ouvrir :
//пересечение вверх
bool PeresVverh()
  {//Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
      if(Ma(MaPer1,1)>=Ma(MaPer2,1))
         if(Ma(MaPer1,0)<Ma(MaPer2,0))
            return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  {//Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
      if(Ma(MaPer1,1)<=Ma(MaPer2,1))
         if(Ma(MaPer1,0)>Ma(MaPer2,0))
            return(true);
   return(false);
  }

 
Sile Si:

Merci à tous ceux qui ont répondu.

Artyom, pourquoi écrivez-vous que vous ne l'avez pas résolu ? Il signale tous les instruments, mais il ne fait que charger lourdement le système. Y a-t-il un moyen de réduire la charge ?

La limite de la vérification sur une nouvelle barre ne suffira pas car il y aura aussi des conditions qui devront être vérifiées à chaque tick.

Dans votre code, j'ai essayé d'ajouter OnTimer(), cela a fonctionné dans l'EA avec OnTick() mais comment le faire avec OnCalculate ?


Essayez-le avec une minuterie de 200 millisecondes.

//+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string   name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(200);
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   for(int i=0; i<ArraySize(symbols_array); i++) {
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);;
         if(symbols_array[i].time_alert!=tm) {
            Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);
         if(symbols_array[i].time_alert!=tm) {
            Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition(string symbol_name,int shift) {
   MqlRates array[];
   if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){
      if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY);
      if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL);
      }
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
ushort SetSymbols(string symbols_list,SSymbolsData &array[]){
   symbols_list+=","; // Добавим признак конца строки
   short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list);
   string sy="";
   Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке
   while(beg<len) {
      beg++;
      end=(short)StringFind(symbols_list,",",beg);
      if(end==beg || end<0) continue;
      sy=StringSubstr(symbols_list,beg,end-beg);
      if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue;
      ushort sz=(ushort)ArraySize(array);
      ArrayResize(array,sz+1);
      array[sz].name=sy;
      array[sz].time_alert=0;
      //--- Посмотрим корректность найденного символа и записи его в массив
      Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name);
      }
   return((ushort)ArraySize(array));
}
//+------------------------------------------------------------------+
bool CheckSymbol(string symbol_name,SSymbolsData &array[]){
   for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true);
   return(false);
}
//+------------------------------------------------------------------+
bool IsPresentSymbol(string symbol_name){
   for(ushort i=0; i<SymbolsTotal(false); i++){
      if(SymbolName(i,false)==symbol_name) {
         SymbolSelect(symbol_name,true);
         return(true);
         }
      }
   return(false);
}
//+------------------------------------------------------------------+
Raison: