Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 209

 
Alexey Viktorov:

Das Problem liegt in dieser Zeile

Da ich mehrere Währungen auf einem Balken überprüfen möchte, sollte ich die Zeit und die Währung überprüfen, um zu vermeiden, dass ein Alarm auf einem Balken und einem Symbol wiederholt wird, aber einen Alarm auf demselben Balken mit einem anderen Symbol zuzulassen. Auf den ersten Blick brauchen wir ein weiteres Array mit Flags, die anzeigen, ob das Symbol angezeigt wird oder nicht.

Im Allgemeinen müssen wir entweder eine Symbolprüfung in diese Zeile einfügen oder die Schleife nur wiederholen, wenn ein neuer Balken erscheint. Aber ich habe die Befürchtung, dass wenn ein neuer Balken auf dem Symbol mit diesem Indikator erscheint, ein neuer Balken noch nicht auf einem anderen Symbol erschienen ist.

Die Schlussfolgerung: Wir müssen unsere Kopfmuskeln anstrengen, um festzustellen, ob ein neuer Balken auf jedem einzelnen Symbol erscheint, aber gleichzeitig die Anzahl der Zeilen nicht ins Unendliche zu dehnen. Ich habe keine fertige Lösung. Und ich mag es nicht vorschlagen, indem ich Code schreibe...

Und ich habe sein Problem nicht gelöst?

Vielleicht habe ich irgendwo etwas übersehen - ich habe den Code auf meinem Knie geschrieben.

 
Artyom Trishkin:

Und ich habe sein Problem nicht gelöst?

Vielleicht habe ich irgendwo etwas übersehen - ich habe den Code auf meinem Knie geschrieben.

Artem, der letzte Satz in meinem Beitrag erklärt alles. Ich habe mir Ihren Code nicht einmal angesehen. Ich öffnete die erste ungelesene Frage mit einem Zitat aus meiner vorherigen Antwort, antwortete und sah dann die anderen Ratschläge. Ich zweifle nicht an der Korrektheit Ihres Codes, auch nicht von meinem Knie aus...

 
Alexey Viktorov:

Artyom, der letzte Satz in meinem Beitrag erklärt alles. Ich habe mir Ihren Code nicht einmal angesehen. Ich öffnete die erste ungelesene Frage mit einem Zitat aus meiner vorherigen Antwort, ich antwortete und sah dann andere Ratschläge. Ich zweifle nicht an der Korrektheit Ihres Codes, auch nicht von meinem Knie aus...

Ich hätte "faul" gesagt ;)

Schon auf den ersten Blick ist zu erkennen, dass der Code von den Ticks des aktuellen Symbols abhängt. Daher müssen wir die Schleife aus OnTick() entfernen und sie in einen Timer verschieben. Und ändern Sie die Definition von Zeitwarnungen leicht ab.

 

Hallo zusammen, es gibt ein Missverständnis des Prozesses, in der Funktion "Start" im Zyklus mm++; und folgen Sie die Änderungen in ihm durch Print(); so die Frage: "Warum statt 1,2,3,4, etc. pop-up vierstellige Zahlen? "

der Code selbst

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);
  }
//+------------------------------------------------------------------+
 
виталик:

Hallo zusammen, es gibt ein Missverständnis des Prozesses, in der Funktion "Start" im Zyklus mm++; und folgen Sie die Änderungen in ihm durch Print(); so die Frage: "Warum statt 1,2,3,4, etc. pop-up vierstellige Zahlen? "

der Code selbst


Beim ersten Durchlauf, 10 SekundenIndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

alsoLimit= max. Balken in Geschichte-1

 
Alekseu Fedotov:


Beim ersten Durchlauf, für 10 SekundenIndicatorCounted()=0

Mittelwertgrenze= maximale Balken in Geschichte-1

immer noch nicht klar, Deklaration und Initialisierung mit Null außerhalb der Schleife int mm=0; und in der Schleife platziert mm++; print() zeigt vierstellige Zahlen, die sich aus irgendeinem Grund nur in absteigender Richtung mit einer Differenz von einer Einheit ändern
 
виталик:
immer noch nicht klar, Deklaration und Initialisierung mit Null außerhalb der Schleife int mm=0; und in der Schleife platziert mm++; print() zeigt vierstellige Zahlen, die sich mit einer Differenz von einer Einheit ändern, aus irgendeinem Grund nur in absteigender Richtung
Nicht alle Drucke werden in diesem Protokoll gedruckt. Schauen Sie in der Datei nach.
 

Alexey Viktorov:

...müssen Sie Ihre Kopfmuskeln anspannen...

Vielen Dank an alle, die geantwortet haben.

Artyom Trishkin: Genau so:

Artem, warum schreibst du, dass du das Problem nicht gelöst hast? Es sendet die Signale für alle Werkzeuge, belastet aber das System nur stark. Ist es möglich, die Belastung zu verringern?

Die Prüfung auf einen neuen Balken zu beschränken, wird nicht funktionieren, weil es auch Bedingungen geben wird, die bei jedem Tick geprüft werden müssen.

Ich versuche, OnTimer() zu Ihrem Code hinzuzufügen. Es funktionierte in EA, wenn OnTick(), aber wie man es mit OnCalculate tun?

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:

Können Sie mir sagen, warum die Bestellungen nicht geöffnet werden?


OK, es wird sich öffnen:
//пересечение вверх
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:

Vielen Dank an alle, die geantwortet haben.

Artyom, warum schreiben Sie, dass Sie das Problem nicht gelöst haben? Alle Instrumente zeigen Signale an, aber das System ist stark belastet. Gibt es eine Möglichkeit, die Belastung zu verringern?

Die Beschränkung auf die Überprüfung bei einem neuen Balken reicht nicht aus, da es auch Bedingungen gibt, die bei jedem Tick überprüft werden müssen.

In Ihrem Code, ich versuche, OnTimer() hinzufügen, es funktionierte in EA, wenn OnTick(), aber wie man es mit OnCalculate tun?


Versuchen Sie es mit einem Timer für 200 Millisekunden.

//+------------------------------------------------------------------+
//|                                                      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);
}
//+------------------------------------------------------------------+
Grund der Beschwerde: