L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 2008

 
elibrarius:
Sì. I sinonimi sono fic, input, predictor.
grazie, ho sempre avuto "fiches", anche se la parola è storta
 
Evgeny Dyuka:
grazie, ho sempre avuto una 'cosa', anche se la parola è storta

anche brutto....

la parola più corretta secondo me è" caratteristiche". ma ci sono molti sinonimi. e non il migliore.

elibrarius:
Sì. I sinonimi sono fic, input, predictor.
 
Evgeny Dyuka:
grazie, ho sempre avuto "fiches", anche se la parola è storta

Soprattutto quando non si ha familiarità con la traslitterazione.

 
Maxim Kuznetsov:

la barra non si aprirà finché non si sarà verificato un tick sullo strumento. Potrebbe non esserci una zecca per molto tempo ;-)

E questo problema, ahimè, non è completamente risolto nel codice. Avete idee su come si possa risolvere in modo tale che sia possibile ricevere gli stessi dati da un simbolo su cui l'EA non si trova in modalità di modellazione OHLC e in modalità "Ogni tick è basato su tick reali"? In generale, hai qualche idea su come risolvere il problema OHLC con la sincronizzazione senza ritardo, cioè se non c'è ancora una barra su un altro simbolo, allora usiamo i dati della barra precedente? Se controlliamo tutti i tick, possiamo (anche se non l'ho provato) ricevere i dati del primo tick della barra ed essere sicuri della sincronizzazione, cioè sapere se c'era una barra nel grafico corrente al momento di aprirne uno nuovo o no.

 
Aleksey Vyazmikin:

E questo problema, ahimè, non è completamente risolto dal codice. Ci sono idee su come si possa risolvere in modo che sia possibile ricevere gli stessi dati dal simbolo, dove l'EA non si trova, sia in modalità di simulazione OHLC che in modalità "Every tick based on real ticks"? In generale, hai qualche idea su come risolvere il problema OHLC con la sincronizzazione senza ritardo, cioè se non c'è ancora una barra su un altro simbolo, allora usiamo i dati della barra precedente? Se lo controlliamo con tutti i tick, allora è possibile (anche se non l'ho provato) ricevere i dati del primo tick della barra ed essere sicuri della sincronizzazione usando questo, cioè sapere se c'era una barra nel grafico corrente al momento dell'apertura di una nuova barra o no.

Può anche mancare alcune battute minime. Forma una barra al prezzo di chiusura della precedente. Questo può essere buono per l'analisi del comportamento combinato di diversi simboli. Può essere poco importante per una coppia di valute.
 
elibrarius:
Può anche perdere qualche minuto di battuta. Forma una barra al prezzo di chiusura della precedente. Per l'analisi del comportamento congiunto di diversi strumenti andrà bene. Per una moneta probabilmente non è importante.

In questo modo sarà desincronizzazione, perché secondo l'OHLC la barra precedente sarà precedente, ma nel trading reale potrebbe essere quella precedente.

 

Per coloro che non sapevano che la modalità OHLC è una serie temporale di simboli non sincronizzati, è fondamentale per MO


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

Nuova versione di MetaTrader 5 build 2615: Analisi fondamentale e criteri complessi in Strategy Tester

Aleksey Vyazmikin, 2020.09.26 13:26


Build 2622, timeframe 1 minuto, strumento Si-12.20 broker "Otkrytie".

Stampa all'apertura di una nuova barra nel modo"Ogni tick basato sui tick reali" e "OHLC su M1". :

Print("Time",TimeToString(iTime(Symbol(),PERIOD_CURRENT,0),TIME_DATE|TIME_MINUTES), " Time_TOM=",TimeToString(iTime("USDRUB_TOM",PERIOD_CURRENT,0),TIME_DATE|TIME_MINUTES));

I risultati di cui sopra sono tabulati e ho delle domande su di essi:

1. Mi aspettavo che il ritardo potesse essere se c'è una nuova barra per il simbolo corrente, ma non ancora per il simbolo di cui richiediamo l'informazione - questa situazione accade davvero, ma solo all'apertura di un nuovo giorno - è evidenziata in verde.

2) La situazione è la stessa del primo punto senza marcatura, ma se è prevista nel test di Potik, allora perché questa situazione accade in"OHLC su M1" - perché c'è una desincronizzazione - non è chiaro.

3. la situazione in cui si ricevono due tick allo stesso tempo o un tick per il simbolo richiesto è più veloce che per il simbolo da cui si chiama l'informazione, è evidenziata in giallo; ma perché non c'è nessun tick su questa barra nel modo "OHLC su M1", se è già stato ricevuto nel modo tickwise?

Chiedo agli sviluppatori di chiarire, era questa l'intenzione, poi qual è la logica, o è un bug che verrà risolto?


Risposta:

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

Nuova versione di MetaTrader 5 build 2615: Analisi fondamentale e criteri complessi in Strategy Tester

Renat Fatkhullin, 2020.09.26 13:33

La tua domanda riguarda solo la modalità di test OHLC, perché tutto è corretto nella modalità poticky?

La risposta è semplice, non si può avere alcuna garanzia di sincronizzazione accurata dei caratteri stranieri nei test OHLC. OHLC è esclusivamente per i test sporchi.


 

Sembra aver risolto il problema dell'out-of-sync, quando si richiedono dati da un altro simbolo - ha dovuto sacrificare una barra di un minuto in alcuni casi, ma il risultato è stabile quando si modella su tutti i tick e su OHLC, il che significa che lo stesso è previsto nel trading reale.

//+------------------------------------------------------------------+
//|Получение информации о ценах OHLC текущего бара                   |
//+------------------------------------------------------------------+
void Get_OHLC(string symbol,ENUM_TIMEFRAMES TF, double &arr_OHLC[])
{
   ArrayResize(arr_OHLC,4);
   arr_OHLC[0]=iOpen(symbol,TF,0);
   arr_OHLC[3]=iOpen(symbol,PERIOD_M1,0);
   datetime s=iTime(symbol,TF,0);
   datetime f=iTime(symbol,PERIOD_M1,1);
   datetime Time_1=iTime(Symbol(),PERIOD_M1,1);

   if(TF!=PERIOD_M1)
   {
      double arr_High[];
      double arr_Low[];
      int copied=0;
      if(Symbol()!=symbol)//Если берем данные с другого символа, то проверяем синхронизацию - нужно, так как при открытии новой свечи на текущем символе данных можнт небыть на опрашиваемом символе
      {
         if(Time_1>f)//На текущем символе открылись раньше появления нового бара на запрашиваемом
         {
            f=iTime(symbol,PERIOD_M1,0);
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,0);
         }
         else
         {
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,1);
         }
         if(s>f)//Если текущий бар ТФ открылся раньше, чем минутный бар до которого включительно берем информацию OHLC
         {
            s=iTime(symbol,TF,1);
            arr_OHLC[0]=iOpen(symbol,TF,1);
         }
         copied=CopyHigh(symbol,PERIOD_M1,s,f,arr_High);
         if (copied>0)
         {
            arr_OHLC[1]=arr_High[ArrayMaximum(arr_High,0,WHOLE_ARRAY)];
         }
         else
         {
            Print("Ошибка копирования в массив arr_High");
         }
         copied=CopyLow(symbol,PERIOD_M1,s,f,arr_Low);
         if (copied>0)
         {
            arr_OHLC[2]=arr_Low[ArrayMinimum(arr_Low,0,WHOLE_ARRAY)];
         }
         else
         {
            Print("Ошибка копирования в массив arr_Low");
         }

      }
      else
      {
         if(s<f)
         {
            copied=CopyHigh(symbol,PERIOD_M1,s,f,arr_High);
            if (copied>0)
            {
               arr_OHLC[1]=arr_High[ArrayMaximum(arr_High,0,WHOLE_ARRAY)];
            }
            else
            {
               Print("Ошибка копирования в массив arr_High");
            }
            copied=CopyLow(symbol,PERIOD_M1,s,f,arr_Low);
            if (copied>0)
            {
               arr_OHLC[2]=arr_Low[ArrayMinimum(arr_Low,0,WHOLE_ARRAY)];
            }
            else
            {
               Print("Ошибка копирования в массив arr_Low");
            }
         }
         else
         {
            if(s==f)//Если ТФ открылся на прошлом минутном баре
            {
               arr_OHLC[1]=iHigh(symbol,PERIOD_M1,1);
               arr_OHLC[2]=iLow(symbol,PERIOD_M1,1);
            }
            if(s>f)//Если ТФ открылся на текущем минутном баре
            {
               arr_OHLC[1]=iOpen(symbol,PERIOD_M1,0);
               arr_OHLC[2]=iOpen(symbol,PERIOD_M1,0);
            }
         }
      }
   }
   else
   {
      arr_OHLC[0]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[1]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[2]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[3]=iOpen(symbol,PERIOD_M1,0);
      if(Symbol()!=symbol)
      {
         if(Time_1>iTime(symbol,PERIOD_M1,1))//Если не появился новый бар
         {
            arr_OHLC[0]=iOpen(symbol,PERIOD_M1,0);
            arr_OHLC[1]=iHigh(symbol,PERIOD_M1,0);
            arr_OHLC[2]=iLow(symbol,PERIOD_M1,0);
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,0);
         }
         else//Если появился новый бар
         {
            arr_OHLC[0]=iOpen(symbol,PERIOD_M1,1);
            arr_OHLC[1]=iHigh(symbol,PERIOD_M1,1);
            arr_OHLC[2]=iLow(symbol,PERIOD_M1,1);
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,1);
         }
      }
   }
}
 
Per una normale algo robusta, un piccolo ritardo non ha alcun effetto. (Questi sono problemi inverosimili).
 
Maxim Dmitrievsky:
Per una normale algo robusta, un piccolo ritardo non influisce su nulla. Questi sono problemi inverosimili).

Dove trovare questi "normali"? E influisce o no - qui è casuale, se durante la quantizzazione si arriva al confine tra i quantili, allora durante l'addestramento può sembrare che solo 1 quantile di differenza causerà il salto dell'input sul reale. In generale non mi piace quando non posso riprodurre un giorno di trading chiuso nel tester, così ho identificato la ragione e ho iniziato a sistemarla.

Motivazione: