Generische Klassenbibliothek - Bugs, Beschreibung, Fragen, Nutzungsmöglichkeiten und Vorschläge - Seite 16

 
fxsaber:

Interessant. Und hier ist eine Frage. Ich mochte die derzeitige Umsetzung nicht und habe sie überarbeitet. Natürlich ist es schief. Wie bekomme ich die Originalbibel?

Hier - ab 1702

Dateien:
Generic.zip  44 kb
 
Artyom Trishkin:

Hier - ab 1702

Ich danke Ihnen! Ich werde die Frage an die Entwickler weiterleiten. Da ich ein bisschen ein Glätteisen bin...

 

Beispiel 2: Handel mit mehreren EAs auf einem Nettokonto

Die Nettopositionierung bereitet denjenigen Kopfzerbrechen, die mit mehr als einem Expert Advisor für dasselbe Symbol gleichzeitig handeln. Um mit Situationen umzugehen, in denen beide EAs in einem Hedge sind, aber verstehen müssen, dass das Fehlen einer Nettoposition nicht wirklich bedeutet, dass sie nicht im Markt sind, wird ein komplexer Code erzeugt. Eine Lösung besteht darin, den Beitrag der einzelnen Experten zur Gesamtposition zu berechnen. Dazu müssen wir die gesamte Historie analysieren und berechnen, wie viele Verträge zu jeder einzelnen Medgie gehören. Bei einem Wert von 0,0 ist der Experte aus dem Markt ausgestiegen, bei einem negativen Wert ist er short, bei einem positiven Wert ist er long. Eigentlich ist es ganz einfach, wenn wir CHashMap verwenden und einfach alle Geschäfte nach magischen Aufträgen zerlegen und deren Volumen addieren. Ich habe unten einen sehr einfachen Code (Prototyp) skizziert:

//+------------------------------------------------------------------+
//|                                                 NettoByMagic.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Generic\HashMapGen.mqh>

CHashMap<ulong, double> PositionsByMagic;
int prev_deals = 0;
//+------------------------------------------------------------------+
//| Добавляет новый объем и его меджик                               |
//+------------------------------------------------------------------+
void AddVolume(ulong magic, double volume)
{
   double cur_volume = 0.0;
   if(PositionsByMagic.TryGetValue(magic, cur_volume))
      PositionsByMagic.TrySetValue(magic, cur_volume+volume);
   else
      PositionsByMagic.Add(magic, volume);
}
//+------------------------------------------------------------------+
//| Добавляет новые сделки в словарь                                 |
//+------------------------------------------------------------------+
void ParseDeals()
{
   HistorySelect(0, TimeCurrent());
   for(int i = prev_deals; i < HistoryDealsTotal(); i++)
   {
      ulong ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetString(ticket, DEAL_SYMBOL)!= Symbol())
         continue;
      ENUM_DEAL_TYPE deal_type = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
      double volume = 0.0;
      if(deal_type == DEAL_TYPE_BUY)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
      else if(deal_type == DEAL_TYPE_SELL)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME)*(-1);
      else
         continue;
      ulong magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      AddVolume(magic, volume);
   }
   prev_deals = HistoryDealsTotal();
}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   ParseDeals();
   for(int i = 0, k = 0; i < PositionsByMagic.Count(); i++)
   {
      ulong magic = PositionsByMagic.GetKeyAt(i);
      double valume = PositionsByMagic.GetValueAt(i);
      if(k == 10)
         break;
   }
}
//+------------------------------------------------------------------+

Achtung! Zur Vereinfachung berechnet der Code nur das Nettovolumen für das aktuelle Symbol. Auch CHashMap in der aktuellen Implementierung enthält keine Aufzählung Iteratoren, so dass ich hastig solche Iteratoren gemacht. Die geänderte CHashMap ist in der Anlage dargestellt.

Dateien:
HashMapGen.mqh  25 kb
 
fxsaber:

Ist die Geschwindigkeit des Testgeräts für den Handel wichtig? Wenn ja, wirkt sich die HashMap auch auf den Handel aus, da sie die Geschwindigkeit der Entwicklung und Ausführung des TS erhöht.

Tester, Optimierung und Handel sind unterschiedliche Dinge.

Aber ein konkretes Beispiel für eine Aufgabe, bei der es notwendig ist, diese effizienten Algorithmen für die Datenspeicherung und -extraktion zu verwenden, zumindest für Optimierer, da für den Handel, kann jemand ein Beispiel nennen?

 
Alexey Oreshkin:

Wenn ich mit automatisierten Handelssystemen handeln wollte, könnte ich keine Beispiele für Aufgaben nennen, bei denen diese effizienten Algorithmen für die Datenspeicherung und den Datenabruf erforderlich wären, zumindest nicht für den Optimierer, da es keine solchen Algorithmen für den Handel gibt.

Forum zum Thema Handel, automatische Handelssysteme und Strategietests

Generische Klassenbibliothek - Bugs, Beschreibung, Probleme, Anwendungsfälle und Vorschläge

fxsaber, 2017.12.08 22:46

Für einen realistischeren Testfall (2000 Trades und 1.000.000 einzelne Zugriffe auf die Historie) sieht das Ergebnis wie folgt aus

2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 122969
2017.12.05 00:00:00   Time[SetHashMap()] = 816
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 23852
2017.12.05 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 114427

Fast 100 ms Einsparung pro Durchgang! Wenn wir z. B. die Optimierung für 10.000 vollständige Durchläufe durchführen, wird die Hash-Variante am Ende 15 Minuten schneller sein.

 
Vasiliy Sokolov:

Beispiel 2: Handel mit mehreren EAs auf einem Nettokonto

Vergessen
prev_deals = HistoryDealsTotal();


Ein gutes Beispiel! Wirklich praktisch.

 
fxsaber:
Vergessen

Ein gutes Beispiel! Das ist in der Tat praktisch.

Korrigiert.

 

Es gibt Fahrräder, die man leichter selbst bauen kann, als sich mit den Feinheiten eines fremden Fahrrads auseinanderzusetzen und von ihm abhängig zu sein.

Generic ist nicht diese Art von Fahrrad. Sie können ihn nicht schnell und korrekt schreiben. Es wäre nur noch eine Frage der Fertigstellung.

 
fxsaber:

Großartiges theoretisches Beispiel! Hat jemand in der Praxis jemals Tausende von Geschäften betrieben?

p.s. Ich versuche nicht zu beweisen, dass es Quatsch ist und niemand es braucht. Ich versuche, den Wert für den realen Handel zu verstehen. Ich bin überhaupt kein Theoretiker, sondern ein reiner Praktiker.

 
Alexey Oreshkin:

Hat jemand in der Praxis jemals Tausende von Geschäften getätigt?

Auf Forts jeden ersten.