Algorithmen, Lösungsmethoden, Vergleich ihrer Leistung

 

In diesem Thema werden wir verschiedene Möglichkeiten zur Lösung dieser oder jener Probleme diskutieren und die Leistung der vorgeschlagenen Lösungen vergleichen.

Jeder ist willkommen, Probleme und Lösungsansätze zu diskutieren ;)

 

Ich schlage vor, ein Problem zu lösen:

  1. Schreiben Sie eine Funktion, die bei jedem Aufruf eine Pseudo-Zufallszahl annimmt und schreibt, die ein bedingter"Honeyjack" sein wird.

2. eine zweite Funktion schreiben, die die erste Funktion pseudo-zufällig oft aufruft und ihr die (generierte) Bedingung "medjic" übergibt.

3. eine dritte Funktion schreiben, die die"medjic"-Nummer durch die vom Benutzer übergebene"Transaktions"-Nummer (eine beliebige Ordnungszahl) zurückgibt.


Anforderungen:

  1. Der Speicherverbrauch für das Schreiben von "medjic" sollte so nah wie möglich an der Anzahl der "medjic" liegen, deren Anzahl im Voraus nicht bekannt ist.
  2. Die Funktionen sollten schnell funktionieren.

//--------------------------------------------------------

Ich denke, dass die Bibliothek, um die es hier geht, die Mittel hat, um dieses Problem zu lösen.


ZS. Alle drei Funktionen simulieren die Arbeit mit EA-Aufträgen, deren Anzahl im Voraus nicht bekannt ist. Daher passt die Aufgabe zu unserem Thema.

 
Реter Konow:

Ich schlage vor, ein Problem zu lösen:

  1. Schreiben Sie eine Funktion, die bei jedem Aufruf eine Pseudo-Zufallszahl akzeptiert und schreibt, die eine bedingte"medjic" sein wird.

2. eine zweite Funktion schreiben, die die erste Funktion pseudozufällig oft aufruft und ihr ein (generiertes) bedingtes "medjic" übergibt.

3. die dritte Funktion zu schreiben, die die Nummer von"medjik" durch die Nummer von"deal" (eine beliebige Seriennummer), die vom Benutzer übertragen wird, zurückgeben wird.

Anforderungen:

  1. Der Speicherverbrauch für das Schreiben der "medgies" sollte möglichst nahe an der Anzahl der "medgies" liegen, deren Anzahl nicht im Voraus bekannt ist.
  2. Die Funktionen müssen schnell funktionieren.

Ich denke, die betreffende Bibliothek verfügt über die Mittel, um dieses Problem zu lösen.

Alle drei Funktionen imitieren die Arbeit mit Expert Advisor-Aufträgen, deren Anzahl im Voraus nicht bekannt ist. Daher passt das Problem zu unserem Thema.

Piotr, ich glaube, dass jede Funktion einen gewissen Nutzen haben muss. Ich verstehe nicht ganz, wozu eine der drei Funktionen gut sein soll?

 
Victor Ziborov:

Peter, ich denke, jede Funktion muss einen gewissen Nutzen haben. Ich bin mir nicht ganz sicher, welche positive Wirkung eine dieser drei Funktionen hat?

Dies ist ein Ableger von https://www.mql5.com/ru/forum/221917.

Hier testen wir die Wirksamkeit der von der Bibliothek vorgeschlagenen Lösungen in der Praxis.

In diesem Thread wurde vorgeschlagen, dass die Lösung, medjic-Befehle in eine Zeichenkette zu schreiben und sie dann in ein Array zu packen, ineffizient ist.

Die neue Generic-Bibliothek bietet auch für dieses Problem eine Lösung.

Es ist interessant, die Aussage zu bestätigen oder zu widerlegen, dass das Schreiben in eine Zeichenkette eine ineffektive Lösung ist.

Ich denke, es wird nützlich und interessant sein, zu sehen, was die Praxis zeigen wird.


Wer möchte, kann versuchen, diese Aufgabe mit Hilfe des Toolkits der Bibliothek zu lösen.

Ich werde versuchen, diese Aufgabe auf meine eigene Weise zu lösen.

Dann werden wir die Leistung vergleichen.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 

Reg Konow, wenn Sie etwas organisieren, dann tun Sie es bitte auf einem anständigen Niveau und nicht spontan und aus ......

Die Begriffe sollten klar, unmissverständlich und mit konkreten Beispielen....
Es folgt eine Liste von Fragen, die sich aus der genauen Lektüre des gesamten ersten Absatzes ergeben haben.

  1. Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".

1) Warum ist der Text fett gedruckt, wenn er nicht aussagekräftig ist?
2) Ist die Übernahme eines Zeigers ein "Aufruf" einer Funktion oder noch nicht? Die Funktion wird aufgerufen.
3) Der Begriff "eine Nummer schreiben" wird normalerweise bei der Arbeit mit Dateien verwendet. Handelt es sich dabei um eine Ungenauigkeit, die sich auf die Arbeit mit Daten im Speicher bezieht, oder müssen die Daten auch zwischen den Programmläufen gespeichert werden?
4) Wenn man will, kann eine Pseudo-Zufallszahl negativ sein, aber magisch ist sie nicht. Was haben wir also: Magie oder Pseudo-Zufall innerhalb eines bestimmten Bereichs? Welcher ist es?

 
Sergey Dzyublik:

Reg Konow, wenn Sie etwas organisieren, dann tun Sie es bitte auf einem vernünftigen Niveau und nicht spontan und von.....stand.

Die Begriffe sollten klar, eindeutig und mit konkreten Beispielen versehen sein....
Es folgt eine Liste von Fragen, die sich aus der genauen Lektüre des gesamten ersten Absatzes ergeben haben.

1) Warum ist der Text fett gedruckt, wenn er nicht aussagekräftig ist?
2) Ist die Übernahme eines Zeigers ein "Aufruf" einer Funktion oder noch nicht? Die Funktion wird aufgerufen.
3) Der Begriff "eine Nummer schreiben" wird normalerweise bei der Arbeit mit Dateien verwendet. Handelt es sich dabei um eine Ungenauigkeit, die sich auf die Arbeit mit Daten im Speicher bezieht, oder müssen die Daten auch zwischen den Programmläufen gespeichert werden?
4) Wenn man will, kann eine Pseudo-Zufallszahl negativ sein, aber magisch ist sie nicht. Was haben wir also: Magie oder Pseudo-Zufall innerhalb eines bestimmten Bereichs? Welcher ist es?

Hauptaufgabe:

Schnellzugriff auf einen bestimmten Zauberer über eine Transaktionsnummer.

Es ist notwendig, die Zauberer in ein "Wörterbuch" zu schreiben und über die Transaktionsnummer darauf zuzugreifen.

Die Anzahl der Aufträge ist nicht im Voraus bekannt, daher ist auch die Größe des Wörterbuchs nicht bekannt.

Der Zugriff muss jedoch schnell erfolgen und die Menge des zugewiesenen Speichers muss akzeptabel sein.

Die Aufgabe, die ich vorschlage, zielt darauf ab, die Arbeit eines EA zu imitieren, der Aufträge erteilt und dann seine Magier durch die Handelsnummer zur weiteren Arbeit mit ihnen bekommt.

Sie können das Problem auf jede beliebige Weise lösen.

Eine bestimmte Nummer eines Magiers spielt keine Rolle. Es kann eine beliebige Zahl sein. Es ist nur eine Simulation.


Hinzugefügt:

Korrigiert: "Implementierung eines schnellen Zugriffs auf einen bestimmten Zauber über die Transaktionsnummer. " .

 

Wenn wir drei magische Zahlen addieren: 10, 11, 12
Wie lauten dann ihre Transaktionsnummern? 0, 1, 2?

 
Sergey Dzyublik:

Wenn wir drei magische Zahlen addieren: 10, 11, 12
Wie lauten dann ihre Transaktionsnummern? 0, 1, 2?

In einem anderen Thread haben sachkundige Leute gesagt, dass es unmöglich ist, eine wirksame Lösung zu finden, um Zauberer an eine Schnur zu schreiben und sie schnell "on the fly" von der Schnur zu bekommen.

Wenn jedoch die Anzahl der künftigen Optionsscheine nicht bekannt ist, besteht meiner Meinung nach die einzige gute Lösung darin, Zauberer an die Kette zu legen.

Ich habe argumentiert, dass es keinen Geschwindigkeitsverlust geben würde.

Hier ist ein praktischer Beweis:

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+


Vielleicht findet jemand meine Lösung nützlich...

(der Code findet den richtigen Zauber aus mehr als 24.000 Zauberaufträgen in 15 Mikrosekunden!)

(Außerdem wird kein einziges Byte an zusätzlichem Speicherplatz verschwendet.)

Wenn es jemand schneller machen kann, bitte.
 
Sergey Dzyublik:

Wenn wir drei magische Zahlen addieren: 10, 11, 12
Wie lauten dann ihre Transaktionsnummern? 0, 1, 2?

Nein. Die Geschäftsnummern müssen mit eins beginnen.
 

Dies ist eine interessante Frage zu diesem Thema:

Zum Beispiel gibt es einen EA mit mehreren Währungen, bei dem das nächste Lot der nächsten Order auf den Ergebnissen der bereits eröffneten Orders für verschiedene Paare basiert


Bedingung für die Eröffnung eines Auftrags - wenn es ein Signal zur Eröffnung gibt, das Gesamtlot 0,1 nicht überschreitet und der Gesamtdrawdown nicht mehr als 101% der Einlage beträgt

Option eins: Füllen Sie alle Daten in das Array und rufen Sie sie ab, wenn der nächste Auftrag angefordert wird (wir werden nicht bei jedem Tick neue Aufträge eröffnen).


Version zwei - jedes Mal, wenn wir eine Anfrage zur Eröffnung des nächsten Auftrags stellen, sollten wir alle zum aktuellen Zeitpunkt verfügbaren Daten für alle Paare prüfen



Welche Lösung wird schneller und kostengünstiger sein?

 

Schade )