Algoritmi, metodi di soluzione, confronto delle loro prestazioni

 

In questo thread discuteremo diversi modi di risolvere questi o quei problemi e confronteremo le prestazioni delle soluzioni proposte.

Tutti sono invitati a discutere dei problemi e dei metodi per risolverli ;)

 

Propongo di risolvere un problema:

  1. Scrivete una funzione che ad ogni chiamata accetti e scriva un qualche numero pseudo-casuale, che sarà un"honeyjack" condizionale.

2. scrivere una seconda funzione che chiama la prima funzione un numero pseudo-casuale di volte e le passa la condizione (generata) "medjic".

3. Scrivere una terza funzione che restituisca il numero"medjic" per il numero"transazione" (qualsiasi numero ordinale) passato dall'utente.


Requisiti:

  1. Il consumo di memoria per scrivere "medjic" dovrebbe essere il più vicino possibile al numero di "medjic", il cui numero è sconosciuto in anticipo.
  2. Le funzioni dovrebbero funzionare rapidamente.

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

Penso che la biblioteca in discussione abbia gli strumenti per risolvere questo problema.


ZS. Tutte e tre le funzioni simulano il lavoro con ordini EA, il cui numero non è noto in anticipo. Quindi, il compito si adatta al nostro tema.

 
Реter Konow:

Propongo di risolvere un problema:

  1. Scrivete una funzione che ad ogni chiamata accetta e scrive un numero pseudo-casuale, che sarà un"medjic" condizionale.

2. scrivere una seconda funzione che chiama la prima funzione un numero pseudo-casuale di volte e le passa un "medjic" condizionale (generato).

3. scrivere la terza funzione, che restituirà il numero di"medjik" per il numero di"deal" (qualsiasi numero di serie), che viene trasferito dall'utente.

Requisiti:

  1. Il consumo di memoria per scrivere le "medaglie" dovrebbe essere il più vicino possibile al numero di "medaglie", il cui numero non è noto in anticipo.
  2. Le funzioni devono lavorare rapidamente.

Credo che la biblioteca in questione abbia gli strumenti per risolvere questo problema.

SZY. Tutte e tre le funzioni imitano il lavoro con gli ordini di Expert Advisor, il cui numero non è noto in anticipo. Quindi il problema si adatta al nostro tema.

Peter, credo che qualsiasi funzione debba essere di qualche utilità. Non capisco bene cosa ci sia di buono in nessuna delle tre funzioni?

 
Victor Ziborov:

Peter, penso che ogni funzione debba essere di qualche utilità. Non sono del tutto sicuro dell'effetto positivo di una di queste tre funzioni?

Questo è un ramo di https://www.mql5.com/ru/forum/221917

Qui stiamo testando l'efficacia delle soluzioni proposte dalla biblioteca nella pratica.

In quel thread, è stato suggerito che la soluzione di scrivere gli ordini medjic in una stringa e poi metterli in un array era inefficiente.

La nuova libreria Generic ha anche una soluzione a questo problema.

Interessante per confermare o confutare l'affermazione che scrivere su una stringa è una soluzione inefficace.

Penso che sarà utile e interessante vedere cosa mostrerà la pratica.


Tutti coloro che vogliono, possono provare a risolvere questo compito con l'aiuto del toolkit della biblioteca.

Cercherò di risolvere questo compito a modo mio.

Poi confronteremo le prestazioni.

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

Reg Konow, se stai organizzando qualcosa, per favore fallo ad un livello decente, non in modo spontaneo e da.....stand.

I termini devono essere chiari, non ambigui e con esempi concreti....
Ecco una lista di domande che sono nate da una lettura ravvicinata di tutto il primo paragrafo.

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

1) Perché mettere in grassetto il testo che non ha senso?
2) Prendere un puntatore è una "chiamata" a una funzione o no? La funzione viene chiamata.
3) Il termine "scrivere un numero" si usa di solito quando si lavora con i file. È un'imprecisione e si riferisce al lavoro con i dati in memoria, o richiede ancora il salvataggio dei dati tra le esecuzioni del programma?
4) Se si vuole, un numero pseudo-casuale può essere negativo, ma la magia non lo è. Allora cosa abbiamo: magia o pseudo-casualità entro un certo intervallo? Quale?

 
Sergey Dzyublik:

Reg Konow, se stai organizzando qualcosa, per favore fallo ad un livello decente, non in modo spontaneo e da.....stand.

I termini devono essere chiari, non ambigui e con esempi concreti....
Ecco una lista di domande che sono nate da una lettura ravvicinata di tutto il primo paragrafo.

1) Perché mettere in grassetto il testo che non ha senso?
2) Prendere un puntatore è una "chiamata" a una funzione o no? La funzione viene chiamata.
3) Il termine "scrivere un numero" si usa di solito quando si lavora con i file. È un'imprecisione e si riferisce al lavoro con i dati in memoria, o richiede ancora il salvataggio dei dati tra le esecuzioni del programma?
4) Se volete, un numero pseudo-casuale può essere negativo, ma la magia non lo è. Allora cosa abbiamo: magia o pseudo-casualità entro un certo intervallo? Quale?

Compito principale:

Per implementare l'accesso rapido a un mago specifico attraverso un numero di transazione.

È necessario scrivere i maghi in un "dizionario" e accedervi attraverso il numero di transazione.

Il numero di ordini non è noto in anticipo, quindi la dimensione del dizionario è sconosciuta.

Tuttavia, l'accesso deve essere veloce e la quantità di memoria allocata deve essere accettabile.

Il compito che suggerisco ha lo scopo di imitare il lavoro di un EA che piazza gli ordini e poi ottiene i suoi maghi dal numero di commercio per lavorare ulteriormente con loro.

Puoi risolvere il problema in qualsiasi modo tu voglia.

Un numero specifico di un mago non ha importanza. Può essere qualsiasi numero. È solo una simulazione.


Aggiunto:

Corretto sopra"Implementare l'accesso veloce a una magia specifica tramite il numero di transazione. " .

 

Se aggiungiamo tre numeri magici: 10, 11, 12
Allora quali sono i loro numeri di transazione? 0, 1, 2?

 
Sergey Dzyublik:

Se aggiungiamo tre numeri magici: 10, 11, 12
Allora quali sono i loro numeri di transazione? 0, 1, 2?

In un altro thread, persone competenti hanno detto che è impossibile fare una soluzione efficace per scrivere maghi su una stringa e ottenerli rapidamente "al volo" dalla stringa.

Tuttavia, secondo me, se il numero di mandati futuri è sconosciuto, allora l'unica buona soluzione è scrivere dei maghi alla corda.

Ho sostenuto che non ci sarebbe stata alcuna perdita di velocità.

Ecco una prova pratica:

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


Forse qualcuno troverà utile la mia soluzione...

(il codice trova la magia giusta tra più di 24.000 ordini di magia in 15 microsecondi!)

(Inoltre, non un byte di memoria extra viene sprecato).

Se qualcuno può renderlo più veloce, per favore.
 
Sergey Dzyublik:

Se aggiungiamo tre numeri magici: 10, 11, 12
Allora quali sono i loro numeri di transazione? 0, 1, 2?

No. I numeri degli accordi devono iniziare con uno.
 

Questa è una domanda interessante sull'argomento:

Per esempio, c'è un EA multivaluta in cui il lotto successivo dell'ordine successivo si basa sui risultati degli ordini già aperti su diverse coppie


condizione di apertura di un ordine - se c'è un segnale per aprirlo, il lotto totale non supera 0,1 e il drawdown totale non è più del 101% del deposito

Opzione uno: riempire tutti i dati nell'array e recuperarli quando viene richiesto il prossimo ordine (non apriremo nuovi ordini ogni tick)


Versione due - ogni volta che emettiamo una richiesta per aprire il prossimo ordine, dovremmo controllare tutti i dati disponibili al momento attuale per tutte le coppie



Quale soluzione sarà più veloce e meno costosa?

 

Bummer )

Motivazione: