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

 
Vitaly Muzichenko:

Vergleichen Sie den nächsten Takt, und wenn die Reihenfolge unterbrochen ist, setzen Sie die Markierung zurück und notieren Sie, wie viele davon richtig waren, und fahren Sie in der Schleife fort.

Es reicht, wenn man feststellt, dass der Balken bullisch und der nächste bärisch ist. Ist der nächste Balken derselbe wie der vorherige, notiert man den Wert und setzt die Flagge zurück. Und so weiter bis zum Ende.

Die erste ist jedoch nicht unbedingt bullish.

   for(int i=limit-1; i>0; i--)

     {


      if(open[i]<close[i]&&open[i+1]>close[i+1]&&open[i+3]<close[i+3])

        {

         up++;

        }

      else up=0;

    
    
if(max_c<up)max_c=up;

Comment(max_c);
}

//--- return value of prev_calculated for next call

   return(rates_total);

  }

 
PolarSeaman:

aber der erste ist vielleicht kein Stier, aber es gibt keine Möglichkeit.

Hier ist eine Variante, wenn auch nicht ganz richtig, die immer von einer bärischen Kerze ausgeht

Dateien:
aCandle.mq4  8 kb
 
Vitaly Muzichenko:

Hier ist eine Variante, wenn auch nicht ganz richtig, die immer von einer bärischen Kerze ausgeht

Ich danke Ihnen. Wenn man diese Zahl quadriert und eins hinzufügt, ist das Ergebnis richtig.

Wird geprüft if(i%2==0)?
 
PolarSeaman:

aber der erste ist vielleicht kein Stier, auf keinen Fall.


Hier ein Beispiel dafür, wie man dieselben Kerzen findet und die Richtung der Kette ändert:

//+------------------------------------------------------------------+
//|                                              CandlesSequence.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Sequence
#property indicator_label1  "Sequence"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen,clrRed,clrGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- enums
enum ENUM_CANDLE_TYPE
  {
   CANDLE_TYPE_BULL  =  0,       // Bullish candle
   CANDLE_TYPE_BEAR  =  1,       // Bearish candle
   CANDLE_TYPE_DOJI  = -1        // Doji candle
  };
//--- indicator buffers
double         BufferSeq[];
double         BufferSeqColors[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferSeq,INDICATOR_DATA);
   SetIndexBuffer(1,BufferSeqColors,INDICATOR_COLOR_INDEX);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Candles sequence");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferSeq,true);
   ArraySetAsSeries(BufferSeqColors,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<2) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
   ENUM_CANDLE_TYPE type_refs=CANDLE_TYPE_DOJI;
   ENUM_CANDLE_TYPE type_curr=CANDLE_TYPE_DOJI;
//--- Проверка и расчёт количества просчитываемых баров   
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferSeq,EMPTY_VALUE);
      BufferSeq[rates_total-1]=open[rates_total-1];
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      type_refs=GetTypeCandle(i+1,open,close);
      type_curr=GetTypeCandle(i,open,close);
   //--- смена направления цепочки свечей
      if(!CheckCandle(type_refs,type_curr))
        {
         BufferSeq[i]=(type_curr==CANDLE_TYPE_BULL ? low[i]: type_curr==CANDLE_TYPE_BEAR ? high[i]: open[i]);
        }
   //--- свечи одного типа
      else
        {
         BufferSeq[i]=BufferSeq[i+1];
        }
      BufferSeqColors[i]=(type_curr==CANDLE_TYPE_BULL ? 0 : type_curr==CANDLE_TYPE_BEAR ? 1 : 2);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает тип свечи                                             |
//+------------------------------------------------------------------+
ENUM_CANDLE_TYPE GetTypeCandle(const int shift,const double &open[],const double &close[])
  {
   return(close[shift]>open[shift] ? CANDLE_TYPE_BULL : close[shift]<open[shift] ? CANDLE_TYPE_BEAR : CANDLE_TYPE_DOJI);
  }
//+------------------------------------------------------------------+
//| Сравнивает два типа свечей                                       |
//+------------------------------------------------------------------+
bool CheckCandle(const ENUM_CANDLE_TYPE reference_candle_type,const ENUM_CANDLE_TYPE checked_candle_type)
  {
   return(reference_candle_type==checked_candle_type ? true : false);
  }
//+------------------------------------------------------------------+

An den Stellen, an denen die Kette weiterläuft, können Sie nun die Anzahl der Kerzen in der Kette zählen und in einer Liste speichern, und an den Stellen, an denen die Kette in eine neue übergeht, eine neue Zählung beginnen.

Die Anzahl der Kerzen in jeder Kette kann in einer sortierten Liste gespeichert werden. Durch Sortieren der Liste können dann die maximalen und minimalen Sequenzen gefunden werden.

 
PolarSeaman:

Ich danke Ihnen. Wenn die erhaltene Zahl quadriert und eins addiert wird, ist das Ergebnis richtig.

Ist es das, was wir überprüfen, wenn (i%2==0)?

Wenn i ein Vielfaches von zwei ist.

Es ist der Rest von i geteilt durch 2

 
Juer:

Hier ist die Größe der lokalen Variablen während der Kompilierung zu groß (mehr als 512kb).

Wo soll man suchen und was soll man tun? Es gibt ein String-Array CArrayString in der Funktion, ich vermute, es kann ein Fehler sein.

Ich fülle sie mit der Methode Add() und führe dann Clear() und Shutdown() erneut aus. Und dann fülle ich sie wieder mit neuen Daten mit der Methode Add(). Wird in diesem Fall das Array wieder mit null Elementen gefüllt?

Wir müssen solche Mitglieder aus den Klassen entfernen, die bereits in der Kompilierungsphase Speicherplatz belegen. Diese Daten werden im Stapelspeicher abgelegt, der immer sehr klein ist. Die Lösung für dieses Problem ist die dynamische Zuweisung von Speicher für Klassenmitglieder, die viel Speicherplatz benötigen.

Zum Beispiel, wenn es ein Klassenmitglied gibt:

class A
{
   double m_arrfArray[9999999];
};

sollte er durch ersetzt werden:

class A
{
   double m_arrfMyArray[];
};

bool A::Init()
{
   if (ArrayResize(m_arrfMyArray, 9999999) != 9999999)
      return false;
   ....
}
 
Ihor Herasko:

Wir müssen aus den Klassen diejenigen Mitglieder entfernen, die bereits bei der Kompilierung Speicherplatz belegen. Diese Daten werden im Stapelspeicher abgelegt, der immer sehr klein ist. Die Lösung für dieses Problem ist die dynamische Zuweisung von Speicher für Klassenmitglieder, die viel Speicherplatz benötigen.

Zum Beispiel, wenn es ein Klassenmitglied gibt:

dann sollte sie durch ersetzt werden:

Danke. Irgendwie bin ich dieses Problem losgeworden, indem ich die Klasse aus den Parametern der einzelnen Funktionen entfernt habe. Im Allgemeinen war es möglich, dieses Objekt einmal für alle Methoden zu initialisieren.

Ich habe eine weitere Frage über die CArray-Klasse, genauer gesagt CArrayObj. Gibt es eine Delete()-Methode, aber sie verschiebt kein Element im Array? Das heißt, wenn ich Delete(18) lösche, wird ein Element an dieser Position entfernt, und wenn ich später das Element über diesen Index abfragen möchte, erhalte ich einen ungültigen Zeiger. Gibt es eine Methode, mit der Elemente gelöscht und verschoben werden können, so dass in diesem Fall das 18. Element nach dem Löschen das 19.

 
Juer:

Ich danke Ihnen. Irgendwie habe ich dieses Problem gelöst, indem ich die Klasse aus den Parametern der einzelnen Funktionen entfernt habe. Im Allgemeinen war es möglich, dieses Objekt einmal für alle Methoden zu initialisieren.

Ich habe eine weitere Frage über die CArray-Klasse, genauer gesagt CArrayObj. Gibt es eine Delete()-Methode, aber sie verschiebt kein Element im Array? Das heißt, wenn ich Delete(18) lösche, wird ein Element an dieser Position entfernt, und wenn ich später das Element über diesen Index abfragen möchte, erhalte ich einen ungültigen Zeiger. Gibt es eine Methode, mit der Elemente gelöscht und verschoben werden können, so dass das 18. Element nach dem Löschen das 19. ist?

Ich habe nicht mit der Standardbibliothek gearbeitet, aber laut der Hilfe sollte die Delete()-Methode das Element physisch entfernen und dabei die Größe des Arrays ändern. Ausnahme: wenn der Speicherverwaltungsmechanismus deaktiviert ist. Standardmäßig ist dieser Mechanismus aktiviert. Die FreeMode-Methode wird verwendet, um den Zustand des Speicherverwaltungsflags zu überprüfen.

Ich für meinen Teil würde empfehlen, meine eigenen Arrays in MQL zu verwenden (obwohl ich in C++ Vektoren und Listen verwende) und die Speicherverwaltung selbst zu übernehmen, da ich keinen besonderen Komfort oder Vorteil in der CArray-Klasse sehe. Ich lösche Array-Elemente in meinen eigenen Arrays ziemlich schnell mit dieser Methode:

template<typename Array>
bool DeleteArrayElement(Array &array[], int nIndex)
{
   int nArraySize = ArraySize(array);
   if (nIndex < 0 || nIndex >= nArraySize)
      return true;
   
   array[nIndex] = array[nArraySize - 1];
   return (ArrayResize(array, nArraySize - 1, ARRAY_RESERVE_SIZE) == nArraySize - 1);
}

Ihr einziger Nachteil ist, dass sie die Reihenfolge der Array-Elemente nicht beibehält. Das heißt, sie kann auf alle Arrays angewendet werden, außer auf geordnete (sortierte) Arrays.

 

Hallo, könnten Sie mir bitte sagen, wo ich ein Skript finden kann, das mir erlaubt, schwebende Kauf- und Verkaufsaufträge in MT4 auf einmal für eine bestimmte Anzahl von Pips vom aktuellen Kurs zu platzieren, d.h. nicht manuell zu zählen und vielleicht nicht einmal das Auftragsfenster zu betreten? Ich möchte nicht zum Bestellfenster gehen. Vielen Dank.

PS: vielleicht frage ich etwas Falsches, ich habe noch nie Skripte benutzt.

 

Bitte erklären Sie mir den Punkt -"Marktaufträge können nicht geschlossen werden, wenn ihre StopLoss- oder TakeProfit-Werte den FreezeLevel-Parameter verletzen."

Bedeutet dies wörtlich, dass ein Marktauftrag nicht geschlossen werden kann, wenn sein TakeProfit oder StopLoss nicht dem FreezeLevel entspricht? Ich verstehe nur nicht ganz, wie eine Open Market Order Stops haben kann, die gegen die StopLevel oder FreezeLevel Regeln verstoßen? Denn wenn die falschen Haltestellen gesetzt werden, gibt der Server nur eine Fehlermeldung aus und es werden keine Haltestellen gesetzt.

Bitte teilen Sie uns auch mit, was wir sonst noch wissen müssen, wenn ein Broker FreezeLevel verwendet, um eine Marktorder zu schließen.

Требования и ограничения при проведении торговых операций - Приложения - Учебник по MQL4
Требования и ограничения при проведении торговых операций - Приложения - Учебник по MQL4
  • book.mql4.com
В таблицах указаны расчётные значения, ограничивающие проведение торговых операций при открытии, закрытии, установке, удалении и модификации ордеров. Для получения значения минимальной дистанции StopLevel и дистанции заморозки FreezeLevel необходимо вызвать функцию MarketInfo(). Требования. Правильные цены, используемые при осуществлении...
Grund der Beschwerde: