Argomento interessante per molti: cosa c'è di nuovo in MetaTrader 4 e MQL4 - grandi cambiamenti in arrivo - pagina 66

 
MetaDriver:

Se lo spread è più alto della commissione del trader (questa è la situazione sui minori), diventa redditizio per i trader fare pips sui limitatori all'interno dello spread (nella prossima partita). Il che porta automaticamente a spread più bassi e rende i cross più attraenti per il trading.... ecc.

In breve - vai a imparare qualche lezione... :)

Beh, non succederà
 
Mischek:
Beh, non ci sarà.

Cosa esattamente non accadrà? L'accoppiamento o le sue conseguenze automatiche?

Sia più specifico... ;)

 
MetaDriver:

Cosa esattamente non accadrà? L'accoppiamento o le sue conseguenze automatiche?

Sia specifico, per favore... ;)

Non ci saranno lezioni, ecco cosa. :)
 
MetaDriver:

Cosa esattamente non accadrà? L'accoppiamento o le sue conseguenze automatiche?

Sia specifico, per favore... ;)

Le vostre conseguenze esagerate.
 
MetaDriver:

Cosa esattamente non accadrà?

Non ci sarà nulla. Un grande metatrader. E il silenzio).
 
MetaDriver:

L'introduzione di massa del Matching sulle piattaforme MT5 in un certo senso può diventare una "bomba" di mercato, perché teoricamente potrebbe portare ad una "rivoluzione anti-mercato" nel mercato Forex in un futuro molto prossimo. Forse il termine "rivoluzione" è un'esagerazione, forse no, perché qualsiasi trader sarà in grado di fare market maker (influenzare i prezzi). Con la diffusione massiccia di aggregatori nativi che coprono segmenti significativi del mercato mondiale.... l'era del potere (beh, quasi) monopolistico dei fornitori di liquidità sui prezzi delle valute potrebbe essere finita per sempre.

In questo contesto, si pone la domanda "epocale": i trader sono pronti per la "nuova era"? Quali strumenti regolari hanno le "masse generali dei trader" per testare, ottimizzare e debuggare gli algoritmi di diffusione?

Nessuna.

Il formato della base di quotazione non lascia la possibilità di utilizzarla per testare e ottimizzare le strategie HFT che utilizzano ordini limite (che sono tutti algoritmi di diffusione).

Sono d'accordo. Solo una contro-argomentazione: l'attuale formato delle quotazioni è tanto stupido per le strategie di breakout quanto per quelle inverse, ma non si può risolvere con un metodo semplice come questo. Si può curare almeno una classe di strategie, mentre nella situazione imminente prende una "forma drammatica" (vedi sopra). E le altre strategie non ne soffriranno! Se lo vedi, fammi un esempio di una classe di strategie per cui modificare lo spread nel modo proposto renderà il test/ottimizzazione meno realistico.

In effetti il tester è ancora tickwise, quindi è solo una questione di formato della storia. E anche la possibilità di utilizzare "citazioni non standard" se necessario.
MetaDriver:

Sto cercando di "guardare dietro la curva" un po' più in là // Tutto quello che hai scritto è corretto.

Il "market making di massa", proprio per l'innesco degli scenari da te descritti, può alla fine portare alla perdita della posizione di "scambiatore universale" da parte del dollaro. Questa è una semplice conseguenza del crollo degli spread sui "minori". Il mercato dei cambi diventerà più dinamico ed efficiente. E saranno i sistemi di trading basati sulla previsione (piuttosto che sulla manipolazione dei prezzi) a beneficiarne. Per quanto mi riguarda, qualsiasi regolamentazione non di mercato dei tassi di cambio è irta di grandi abusi. Non importa quanto nobili siano gli obiettivi dichiarati - c'è sempre la possibilità di monetizzare l'insider ed è sciocco supporre che qualsiasi meccanismo legale possa opporsi.

In breve - sono interessato al "Forex onesto", forse io personalmente non beneficerò finanziariamente da una tale inversione (o forse sì). Ma se perdo, almeno saprò che ho perso perché ho sviluppato un algoritmo stupido, e non perché sono stato "truffato".

No comment per ora. Ci penserò ancora un po'. Non ho visto una sola strategia redditizia che faccia trading di un lotto costante puramente sugli stop. Neanche uno. Teoricamente è molto comprensibile. (Affermare che tali strategie esistono significa affermare che esiste un qualsiasi orizzonte di trading in cui la H-volatilità è costantemente maggiore di 2.0) Tutte le strategie di tendenza che ho visto funzionare sono o riempite usando ordini di mercato o entrando/uscendo sui pullback usando limitatori (o marche). Per le marche highAsk/lowBid la storia non ha più valore di LowAsk/HighBid. Per loro l'informazione importante è piuttosto lo spread in tutti i punti della barra OHLC.

Infine arriva la comprensione che le mezze misure come HighBid+LowAsk non saranno sufficienti a rendere un tester adeguato.

 
Urain:

Infine è chiaro che le mezze misure come HighBid+LowAsk non saranno sufficienti a rendere adeguato il tester.

Se stai traendo una tale conclusione da quello che ho scritto... allora non lo capisci nemmeno tu)
 
TheXpert:
Se questa è la conclusione che stai traendo da quello che ho scritto... ...allora non capisci neanche tu).

Che cosa farai?! Entrerà, dirà qualche parola ed è tutto, un paio di notti insonni sono garantite. )

Il post non era per me, ma non voglio nemmeno dormire.

 
MetaDriver:

(Sostenere che questi esistono significa sostenere che ci sono orizzonti di trading in cui la volatilità H è costantemente maggiore di 2.0)

Beh, questo è proprio un graal di una tendenza. Né è costantemente inferiore a 2x. Non ci sono strumenti in cui la volatilità H lungo tutta la serie è costantemente inferiore o superiore a 2. Su segmenti separati / in momenti separati. Sapere quando scambiare una tendenza, quando scambiare un ritorno. Filtrare il bazar))
 
hrenfx:

Avevo bisogno di migliorare il mio tester per un nuovo commercio. Capire il codice di quello vecchio è stato più tempo sprecato (ho ucciso diverse settimane - approcci occasionali), che scrivere uno nuovo.

Così, ho impiegato 5 ore (con il debug) per scrivere un nuovo tester da zero. Le sue prestazioni (soddisfacenti per me, come principiante):

  • Funziona con M1 HighBid + LowAsk (i risultati sono più accurati che nel MT5-tester).
  • Un simbolo.
  • Velocità (i7 2700K) circa 100.000.000 di barre al secondo (277 anni FOREX al secondo) su test TS - non vuoto, molte cose sono calcolate. Costantemente sul mercato.
  • Niente MM - niente lotti.
  • Profitto solo in pip.
  • Il trader ha la possibilità di controllare lo slippage e la commissione.
  • Ottimizzatore con i propri criteri di ottimizzazione - per ognuno di essi apre il proprio file (può richiedere molti GB) con stringhe ordinate di trade.
  • Non ci sono controlli degli errori nel tester - conosco tutte le sfumature del mio tester, quindi non lo permetto.
  • TS è scritto in un MQL4 leggermente abbreviato - tutte le cose inutili sono state rimosse. Ma potete usare tutta la potenza del C++.
  • Il tester è scritto senza OOP - non so come farlo in modo competente. Quindi è praticamente un linguaggio C puro.
  • Codice sorgente in C++ libero~ 20Kb.
  • Le fermate e i mercati sono stati buttati via (OrderClose è rimasto) - non è necessario.
  • Ogni esecuzione (a scelta - specificare il numero di esecuzione) può essere visualizzata e studiata nel pacchetto matematico - il file delle modifiche di Equity and Balance è scritto semplicemente.
  • Nessuna genetica.
  • No OpenCL - non può farlo.
  • A thread singolo. Carica tutti i core stupidi - ottimizzatori multipli eseguiti manualmente.
  • Applicazione console.
  • I parametri di ingresso TC, le impostazioni del tester e gli intervalli di ottimizzazione sono impostati nel file.
  • TC è compilato insieme al tester in un file EXE.
  • Prima dell'inizio ci sono solo tre file: EXE, storia, impostazioni.
  • L'ottimizzatore ha un'interruzione della corsa, se lo stato attuale della corsa non soddisfa le condizioni (per esempio, la subsidenza è troppo alta).
  • Lo script MQL4 prepara la storia per il tester, è stato scritto molto tempo fa.
  • Nessuna allocazione dinamica della memoria per la tabella degli ordini - una volta allocata la memoria e dimenticata.
  • Nessun registro - non li guardo.
  • Nessuna storia di ordini - allo stesso modo.
  • Non c'è nessuna idea sugli indicatori e tutto ciò che ha a che fare con loro - non ne abbiamo bisogno per il TS.
  • I prezzi sono interi (long int).

Se la stessa assurdità è implementata in MQL5, possiamo usare Cloud nella modalità di ottimizzazione della matrice. Solo la storia deve essere inviata ogni volta - la compressione incorporata di tali informazioni è necessaria.

Teoricamente, la velocità di ~ 100 Bb/s (al test TS) può essere teoricamente raggiunta. Mi chiedo quale sia la performance di MT5-tester su tutta la nuvola negli stessi pappagalli?

100 miliardi di barre al secondo è una buona velocità per ogni tipo di ricerca. Se convertito in altre unità, questa velocità dice che un anno di un minuto di storia del FOREX viene eseguito ~300.000 volte al secondo su un simbolo.

La maggior parte del tempo è stata spesa per imparare la sintassi del linguaggio - solo googlando. Non è un programmatore.

Ve lo dico subito, è un'enorme perdita di tempo scrivere un framework universale per le vostre modeste esigenze. Meglio esplorare. Se qualcosa deve essere preso in considerazione - basta finirlo.

Questo è solo un nucleo, ora avete bisogno di un toolkit astuto per l'ottimizzatore. Qui ci vorrà molto più tempo - bisogna pensarci bene.

Sono qui a leggere tutto questo e mi viene in mente che o una persona è completamente persa nei flussi della sua coscienza o almeno la metà di quello che ha scritto è solo una comune bugia.

Un programmatore autodidatta senza una profonda conoscenza del linguaggio ha scritto un tester single-threaded con una performance di 100 000 000 di battute al secondo per diverse ore? Al contrario: persone del più alto livello di professionalità spendono anni per creare un tester HFT competente e performante, creano interi team per lavorarci e lo riempiono di strategie, e qui una persona ha deciso di costruire un tester per conto suo e ha immediatamente ottenuto un ordine di grandezza superiore alle prestazioni delle principali piattaforme HFT (chiuse).

Calcoliamo quanta memoria di banda ci serve per eseguire 100 000 000 di barre al secondo. Ogni barra è 4 prezzi + AskLow HighBid, che risulta in 6 tipi interi con 64 bit ciascuno(i prezzi sono interi (long int)). Per 100.000.000 di barre al secondo ci vorrebbe

64 bit * 6 prezzi * 100.000.000 barre = 38.400.000.000 bit = 4.800.000.000 byte = . 4 577 Mbyte al secondo..


Ciò significa che queste prestazioni possono, fondamentalmente e puramente teoricamente, essere raggiunte su moduli di memoria DDR2 533 e superiori. Almeno le prestazioni dichiarate sono paragonabili al limite fisico dell'hardware moderno.

Ma i costi del tempo del software impongono vincoli ancora più significativi. Questi non possono essere ignorati. Ecco perché ho preso un veloce compilatore C a 64 bit Win-Lcc 64 e ho misurato le prestazioni di una ricerca diretta di un array di barre senza pesanti calcoli matematici. Attenzione: stiamo parlando di ricerca diretta, cioè la più veloce. Senza manipolazione dell'ambiente e altre spese generali. A differenza di dickfix, io fornisco il codice sorgente completo del mio "strategy tester", in modo che chiunque possa compilarlo e misurarne le prestazioni nel suo compilatore preferito:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define  LAPS 10000              //Количество серий
#define  ELEMENTS 10000          //Количество баров в одной серии
#define  INVOKE                  //Определено, если требуется эмулировать
                                //вызов функции

//Представление бара
struct bar
{
        long long Open;
        long long High;
        long long Low;
        long long Close;
        long long AskLow;
        long long BidHigh;
};

int main(void)
{
        struct bar bar_array[ELEMENTS];
        //Общее время выполнения стратегии
        clock_t eleps_time = 0;
        //Общее время выполения
        clock_t total_time = 0;
        //К сожалению заявленный объем памяти (100 000 000 баров) выделить не удалось,
    //поэтому выделяем память порциями, 1000 раз, по 100 000 баров за раз.
        clock_t ttime = clock();
        for(int lap = 0; lap < LAPS; lap++)
        {
                //Заполняем бары случайными числами
                for(int i = 0; i < ELEMENTS; i++)
                {
                        bar_array[i].Open = (long long)rand();
                        bar_array[i].High = (long long)rand();
                        bar_array[i].Low = (long long)rand();
                        bar_array[i].Close = (long long)rand();
                        bar_array[i].AskLow = (long long)rand();
                        bar_array[i].BidHigh = (long long)rand();
                        //if(i < 5)
                        //      printf("%i\n", bar_array[i].High);
                }
                //Эмулируем работу ТС c массивом котировок
                //Рассчитываем время на выполнение этого блока и суммируем его, получая общее время
                //выполнения
                clock_t btime = clock();
                //Наша стратегия будет проверять простое соответствие проверяемого бара настоящему.
                //Настоящий бар, это бар чей high > open, low, close а low < high, open, close
                int signal = 0;

                for(int i = 0; i < ELEMENTS; i++)
                {
                        #ifndef  INVOKE
                        if( bar_array[i].High > bar_array[i].Low &&
                            bar_array[i].High > bar_array[i].Open &&
                                bar_array[i].High > bar_array[i].Close)
                                signal++;
                        #endif
                        #ifdef  INVOKE
                        signal += TradeSystem(&bar_array[i]);
                        #endif
                }
                eleps_time += clock() - btime;
        }
        printf("Bars was worked: %i\n", LAPS*ELEMENTS);
        //Печатаем общее время выполнения
    double timedif = ((double)clock() / (double)CLOCKS_PER_SEC);
    printf("Bars %f seconds\n", timedif);
        //Печатаем время выполнения торговой системы
        double eleps_diff = (double)eleps_time / (double)CLOCKS_PER_SEC;
        printf("The TradeSystem time is %f seconds\n", eleps_diff);
        printf("The Eleps tik is %i tiks\n", eleps_time);
        return 0;
}
//
// Функция торговой системы. Принимает на вход бар,
// обрабатывает его и возвращает целочисленный результат
int TradeSystem(struct bar &cbar)
{
        if( cbar.High > cbar.Low &&
                cbar.High > cbar.Open &&
                cbar.High > cbar.Close)
                                return 1;
        return 0;
}

Potete vedere che questo codice, a seconda della direttiva Invoke, o passa attraverso l'array ed esegue un semplice confronto (un'operazione molto veloce) o chiama una funzione che esegue lo stesso confronto.

Vediamo quanto tempo impiega questo codice per cercare e confrontare 100 000 000 di barre:

Possiamo vedere che ci sono voluti 1,28 secondi per passare direttamente attraverso 100.000.000 di barre, che è quasi un terzo peggiore delle prestazioni pubblicizzate.

Si può vedere che la ricerca di 100 000 000 di barre con la chiamata della funzione di calcolo su ogni barra ha richiesto 1,79 secondi, che è più di 1,5 volte peggiore della performance dichiarata.

Tutti i test sono stati eseguiti su hardwarei7 870, DDR3 3200 8Gb.

La maggior parte del tempo è stata spesa nella preparazione effettiva dei dati (circa 9 secondi). Che alla minima non ottimalità nel design dell'ottimizzatore si tradurrà in un enorme overhead. Ma non ho tenuto conto di questo tempo, dato che stavamo parlando solo della corsa strategica.

Traete le vostre conclusioni. Spero di aver dimostrato con le cifre che il risultato dichiarato, per usare un eufemismo, non corrisponde alla realtà. Anche la performance teorica del codice che descrive l'ottimizzatore non corrisponde al risultato dichiarato. E se si implementa un vero tester che si avvicina alla funzionalità di quello rivendicato, le prestazioni scenderanno ancora di più, poiché ogni chiamata di funzione e ogni calcolo matematico più o meno utile ridurrà immediatamente il tempo della nuda ricerca.