Hier ist meine Variante, das Problem der Wiederholungssuche zu lösen:
//+------------------------------------------------------------------+//| FindRetryPrices.mq5 |//| Copyright 2016, Vasiliy Sokolov. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2016, Vasiliy Sokolov."#property link"http://www.mql5.com"#property version"1.00"#include <Dictionary.mqh>
inputint RatesPeriod = 10; // Период за который ищутся повторенияinputint RoundPoints = 10; // Загрубление цены в прайсстепахclass CBar : public CObject
{
private:
MqlRates m_bar;
public:
CBar(MqlRates& bar){m_bar = bar;}
datetime Date(){return m_bar.time;}
doubleOpen(){return m_bar.open;}
doubleHigh(){return m_bar.high;}
doubleLow(){return m_bar.low;}
doubleClose(){return m_bar.close;}
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
// Нахождение повторяющихся баровMqlRates rates[];
int total = CopyRates(Symbol(), Period(), 0, RoundPoints, rates);
CDictionary* BarsCollections = new CDictionary(total);
for(int i = 0; i < total; i++)
{
double price = PriceToLevel(rates[i].high);
CBar* bar = new CBar(rates[i]);
if(!BarsCollections.ContainsKey(price))
BarsCollections.AddObject(price, new CList());
CList* equal_bars = BarsCollections.GetObjectByKey(price);
equal_bars.Add(bar);
}// Вывод повторов
FOREACH_DICT(BarsCollections)
{
CList* list = node;
if(list.Total() < 2)continue;
string retry_bars = "";
for(CBar* bar = list.GetFirstNode(); bar != NULL; bar = list.GetNextNode())
retry_bars += " [" + TimeToString(bar.Date()) + ", " + DoubleToString(bar.High(), Digits()) + "]";
printf("Обнаружено совпадение баров:" + retry_bars);
}
delete BarsCollections;
}
//+------------------------------------------------------------------+//| Округляет цену в соответствии с параметром RoundPoints |//+------------------------------------------------------------------+double PriceToLevel(double price)
{
double price_step = RoundPoints*Point();
double mn = MathFloor(price/price_step);
return mn * price_step;
}
//+------------------------------------------------------------------+
Damit das Skript funktioniert, muss die Dictionary-Datei in MQL5\Include kopiert werden
Die Suche wird in der gelb markierten for-Schleife in einem Durchgang durchgeführt. Die resultierende Liste enthält keine Wiederholungen (wenn A B wiederholt und B A wiederholt, wird eine Menge {A, B} anstelle von zwei {A, B} und {B, A} ausgegeben). ).
Hier ist meine Version der Lösung für das Problem der Wiederholungssuche:
Ich danke Ihnen allen sehr!!! Ich werde versuchen, das alles heute zu klären. Es ist wichtig, nicht nur ein Stück Code in Expert Advisor zu kopieren, sondern zu verstehen, warum er so geschrieben ist.
Hier ist meine Variante, das Problem der Suche nach Wiederholungen zu lösen:
Vasily, wenn ich#include <Dictionary.mqh> öffne, öffnet es sich genauso wie im EA-Körper. Sollte es so sein, oder sollte da ein anderer Code drin sein?
Denn in dem Code, den ich sehe, ist nicht klar, wie er nach Wiederholungen sucht ((
// строку int searchPeriod=(Search_Period<1)?1:Search_Period;// можно расписать так:inputint Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройкахint searchPeriod; // Сюда будем записывать входной параметрif(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен нулюelse searchPeriod=Search_Period; // иначе примем входной параметр// соответственно и строку int delta=(Delta<0)?0:Delta;// можно расписать точно так же
Liege ich richtig in der Annahme, dass es sich um einen Tippfehler handelt? Es sollte 0 statt 1 sein.
wie diese:int searchPeriod=(Search_Period<1)?0:Search_Period;
und weiter in dem ausführbaren Skript:
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // die Anzahl der zu kopierenden Kerzen
In diesem Fall sollten wir wahrscheinlich bereits eine Variable verwenden: searchPeriod. richtig?
------
Eine andere Frage: Was bewirkt diese Linie? Ich habe festgestellt, dass jedes Element der Struktur auf Null zurückgesetzt wird. Und ich verstehe nicht, was wir hier nullen, wenn wir diese Daten scheinbar nur geschrieben haben und sie weiter verwenden sollen.
ZeroMemory(dataCandle); // Nullstellung der Daten in der Struktur
Liege ich richtig in der Annahme, dass es sich um einen Tippfehler handelt? Es sollte 0 statt 1 sein.
wie diese:int searchPeriod=(Search_Period<1)?0:Search_Period;
und weiter in dem ausführbaren Skript:
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // die Anzahl der zu kopierenden Kerzen
In diesem Fall sollten wir wahrscheinlich bereits eine Variable verwenden: searchPeriod. richtig?
------
Eine andere Frage: Was bewirkt diese Linie? Ich habe festgestellt, dass jedes Element der Struktur auf Null zurückgesetzt wird. Und ich verstehe nicht, was wir hier nullen, wenn wir diese Daten scheinbar nur geschrieben haben und sie weiter verwenden sollen.
ZeroMemory(dataCandle); // Löschung der Daten in der Struktur
Nein, das ist es nicht. So haben Sie es (wörtlich): Wenn der vom Benutzer in den Einstellungen festgelegte Suchzeitraum kleiner als eins ist, ist searchPeriod gleich null; andernfalls ist searchPeriod gleich dem vom Benutzer in den Einstellungen festgelegten Wert von Search_Period. Dies ist nicht korrekt. Wir brauchen keinen Suchbereich, der gleich Null ist. Wenn dieser Bereich also vom Benutzer auf 0 oder weniger als Null (weniger als eins) gesetzt wird, dann setzen wir diesen Bereich gleich dem Minimum - eins.
"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // Anzahl der zu kopierenden Candlesticks Hier sollten wir bereits die Variable: searchPeriod. verwenden, richtig? "
Ja, das stimmt, es ist ein Tippfehler.
"Noch eine Frage: Wozu dient diese Linie? Wozu ist sie da? Ich habe festgestellt, dass es jedes Element der Struktur auf Null zurücksetzt. Und hier verstehe ich nicht, warum und was wir nullen, wenn wir gerade diese Daten geschrieben haben und sie weiter verwenden sollen. ZeroMemory(dataCandle); // Nullung der Daten in der Struktur".
Dies geschieht, bevor wir die Struktur mit Daten füllen. Zuerst setzen wir ihn auf Null, dann füllen wir ihn. Schauen Sie - wir setzen sie vor der Schleife auf Null. Und dann füllen wir in der Schleife die Struktur mit Daten.
Hier ist meine Variante, das Problem der Wiederholungssuche zu lösen:
Damit das Skript funktioniert, muss die Dictionary-Datei in MQL5\Include kopiert werden
Die Suche wird in der gelb markierten for-Schleife in einem Durchgang durchgeführt. Die resultierende Liste enthält keine Wiederholungen (wenn A B wiederholt und B A wiederholt, wird eine Menge {A, B} anstelle von zwei {A, B} und {B, A} ausgegeben). ).
Die Ausgabe dieses Skripts zeigt Folgendes:
Aus der Referenz:
Hier ist meine Version der Lösung für das Problem der Wiederholungssuche:
Bitte helfen Sie mir, eine Funktion zur Berechnung des Standard-RSI zu finden, die Anforderungen sind einfach:
1. Rückgabe des RSI-Wertes für einen bestimmten Balken
2. Berechnen Sie den Index nur für die Balken (falls erforderlich), die angefordert werden (wünschenswert)
3. Mit der angegebenen TF rechnen können
4. Arbeitet auf Kosten von Punkt 2 schneller als der Indikator
Ich möchte die Funktion in den Expert Advisor integrieren, wenn jemand eine fertige Funktion hat, bitte teilen Sie sie mit mir.
Ich frage, weil der Indikator sehr häufig vorkommt und kein Geheimnis ist.
Bitte helfen Sie mir, eine Funktion zur Berechnung des Standard-RSI zu finden, die Anforderungen sind einfach:
1. Rückgabe des RSI-Wertes für einen bestimmten Balken
2. Berechnen Sie den Index nur für die Balken (falls erforderlich), die angefordert werden (erwünscht)
3. Mit der angegebenen TF rechnen können
4. Arbeitet auf Kosten von Punkt 2 schneller als der Indikator
Ich möchte die Funktion in den Expert Advisor integrieren, wenn jemand eine fertige Funktion hat, bitte teilen Sie sie mit mir.
Ich frage, weil der Indikator sehr häufig vorkommt und kein Geheimnis ist.
Was ist mit dem Standard-iRSI nicht in Ordnung? Nicht geheim genug?
Es gibt einige Änderungen, die ich an der Funktion vornehmen muss...
Nehmen Sie dann ein vorgefertigtes Modell und ändern Sie es nach Ihren Wünschen:
Nehmen Sie dann ein vorgefertigtes Modell und ändern Sie es nach Ihren Wünschen:
Hier ist meine Variante, das Problem der Suche nach Wiederholungen zu lösen:
Vasily, wenn ich#include <Dictionary.mqh> öffne, öffnet es sich genauso wie im EA-Körper. Sollte es so sein, oder sollte da ein anderer Code drin sein?
Denn in dem Code, den ich sehe, ist nicht klar, wie er nach Wiederholungen sucht ((
Liege ich richtig in der Annahme, dass es sich um einen Tippfehler handelt? Es sollte 0 statt 1 sein.
wie diese:int searchPeriod=(Search_Period<1)?0:Search_Period;
und weiter in dem ausführbaren Skript:
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // die Anzahl der zu kopierenden Kerzen
In diesem Fall sollten wir wahrscheinlich bereits eine Variable verwenden: searchPeriod. richtig?
------
Eine andere Frage: Was bewirkt diese Linie? Ich habe festgestellt, dass jedes Element der Struktur auf Null zurückgesetzt wird. Und ich verstehe nicht, was wir hier nullen, wenn wir diese Daten scheinbar nur geschrieben haben und sie weiter verwenden sollen.
ZeroMemory(dataCandle); // Nullstellung der Daten in der Struktur
Liege ich richtig in der Annahme, dass es sich um einen Tippfehler handelt? Es sollte 0 statt 1 sein.
wie diese:int searchPeriod=(Search_Period<1)?0:Search_Period;
und weiter in dem ausführbaren Skript:
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // die Anzahl der zu kopierenden Kerzen
In diesem Fall sollten wir wahrscheinlich bereits eine Variable verwenden: searchPeriod. richtig?
------
Eine andere Frage: Was bewirkt diese Linie? Ich habe festgestellt, dass jedes Element der Struktur auf Null zurückgesetzt wird. Und ich verstehe nicht, was wir hier nullen, wenn wir diese Daten scheinbar nur geschrieben haben und sie weiter verwenden sollen.
ZeroMemory(dataCandle); // Löschung der Daten in der Struktur
"so:int searchPeriod=(Search_Period<1)?0:Search_Period;"
Nein, das ist es nicht. So haben Sie es (wörtlich): Wenn der vom Benutzer in den Einstellungen festgelegte Suchzeitraum kleiner als eins ist, ist searchPeriod gleich null; andernfalls ist searchPeriod gleich dem vom Benutzer in den Einstellungen festgelegten Wert von Search_Period. Dies ist nicht korrekt. Wir brauchen keinen Suchbereich, der gleich Null ist. Wenn dieser Bereich also vom Benutzer auf 0 oder weniger als Null (weniger als eins) gesetzt wird, dann setzen wir diesen Bereich gleich dem Minimum - eins.
"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // Anzahl der zu kopierenden Candlesticks
Hier sollten wir bereits die Variable: searchPeriod. verwenden, richtig? "
Ja, das stimmt, es ist ein Tippfehler.
"Noch eine Frage: Wozu dient diese Linie? Wozu ist sie da? Ich habe festgestellt, dass es jedes Element der Struktur auf Null zurücksetzt. Und hier verstehe ich nicht, warum und was wir nullen, wenn wir gerade diese Daten geschrieben haben und sie weiter verwenden sollen. ZeroMemory(dataCandle); // Nullung der Daten in der Struktur".
Dies geschieht, bevor wir die Struktur mit Daten füllen. Zuerst setzen wir ihn auf Null, dann füllen wir ihn. Schauen Sie - wir setzen sie vor der Schleife auf Null. Und dann füllen wir in der Schleife die Struktur mit Daten.