Libreria di classi generiche - bug, descrizione, domande, caratteristiche d'uso e suggerimenti - pagina 16

 
fxsaber:

Interessante. Ed ecco una domanda. Non mi piaceva l'attuale implementazione e l'ho modificata. È storto, ovviamente. Come posso ottenere la bibbia originale?

Qui - dal 1702

File:
Generic.zip  44 kb
 
Artyom Trishkin:

Qui - dal 1702

Grazie! Porterò la domanda agli sviluppatori. Siccome sono un po' un raddrizzatore...

 

Esempio 2: Trading di più EAs su un conto netto

Il posizionamento netto è un mal di testa, per coloro che scambiano più di un Expert Advisor sullo stesso simbolo allo stesso tempo. Per affrontare situazioni in cui entrambi gli EA sono in una copertura, ma hanno bisogno di capire che l'assenza di una posizione netta non indica realmente che non sono sul mercato, genera un codice complesso. Una soluzione è calcolare il contributo di ogni esperto alla posizione totale. Per fare questo, abbiamo bisogno di analizzare l'intera storia e calcolare quale numero di contratti appartiene a ciascun Medgie unico. Se il numero è 0,0, l'esperto è fuori dal mercato, se è negativo, l'esperto è corto, se è positivo, è lungo. In realtà è molto semplice, se usiamo CHashMap e decomponiamo semplicemente tutti gli affari per ordini magici aggiungendo i loro volumi. Ho abbozzato un codice molto semplice (prototipo) qui sotto:

//+------------------------------------------------------------------+
//|                                                 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;
   }
}
//+------------------------------------------------------------------+

Attenzione! Per semplificare, il codice calcola solo il volume netto per il simbolo corrente. Anche CHashMap nell'implementazione corrente non contiene iteratori di enumerazione, così ho creato frettolosamente tali iteratori. La CHashMap modificata è mostrata nell'allegato.

File:
HashMapGen.mqh  25 kb
 
fxsaber:

La velocità del tester è importante per il trading? Se è così, la HashMap influisce anche sul commercio, perché aumenta la velocità di sviluppo ed esecuzione del TS.

Tester, ottimizzazione e trading sono cose diverse.

Si commercia e si ottimizza una stessa idea, ma l'implementazione può differire drasticamente, anche questo è indiscutibile.Ma un esempio concreto di un compito in cui è necessario utilizzare questi algoritmi efficienti per la memorizzazione e l'estrazione dei dati, almeno per l'ottimizzatore, visto che per il trading, qualcuno può fare un esempio ?

 
Alexey Oreshkin:

Se volessi fare trading con sistemi di trading automatizzati, non sarei in grado di fornire esempi di compiti in cui questi algoritmi efficienti per l'archiviazione e il recupero dei dati sono necessari, almeno per l'ottimizzatore, dato che non ci sono algoritmi del genere per il trading ?

Forum sul trading, sistemi di trading automatico e test di strategia

Libreria di classi generiche - bug, descrizione, problemi, casi d'uso e suggerimenti

fxsaber, 2017.12.08 22:46

Per un caso di tester più realistico (2000 transazioni e 1.000.000 di accessi alla storia singola) il risultato appare così

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

Quasi 100ms di risparmio per ogni passaggio! Se, diciamo, facciamo Optimize per 10.000 passaggi completi, la variante Hash finirà per essere 15 minuti più veloce.

 
Vasiliy Sokolov:

Esempio 2: Trading di più EAs su un conto netto

Ho dimenticato
prev_deals = HistoryDealsTotal();


Un buon esempio! Davvero conveniente.

 
fxsaber:
Ho dimenticato

Buon esempio! Comodo davvero.

Corretto.

 

Ci sono moto che sono più facili da costruire da soli che risolvere le sfumature di usare quelle di qualcun altro e dipendere da loro.

Il generico non è quel tipo di moto. Non si può scrivere velocemente e correttamente. Si tratterebbe solo di completarlo.

 
fxsaber:

Grande esempio teorico! In pratica, qualcuno ha mai operato migliaia di scambi?

p.s. Non sto cercando di dimostrare che è una merda e che nessuno ne ha bisogno. Sto cercando di capire il valore per il trading reale. Non sono affatto un teorico, ma un puro praticante.

 
Alexey Oreshkin:

In pratica, qualcuno ha mai fatto migliaia di scambi?

Sui forti ogni primo.