Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 2008

 
elibrarius:
Sim. Os sinónimos são ficção, input, preditor.
Obrigado, sempre tive "fichas", embora a palavra seja torta.
 
Evgeny Dyuka:
obrigado, eu sempre tive uma 'coisa', embora a palavra seja torturante

até mesmo a porcaria da....

a palavra mais correcta na minha opinião é" características". mas há muitos sinónimos. e não os melhores.

elibrarius:
Sim. Os sinónimos são ficção, input, preditor.
 
Evgeny Dyuka:
obrigado, sempre tive "fiches", embora a palavra seja torta.

Especialmente quando você não está familiarizado com a transliteração.

 
Maxim Kuznetsov:

a barra não se abrirá até que um sinal sonoro tenha ocorrido no instrumento. Pode não haver um tique durante muito tempo ;-)

E este problema, infelizmente, não está totalmente resolvido no código. Você tem idéias de como resolver isso de tal forma que seria possível receber os mesmos dados de um símbolo em que a EA não está localizada no modo de modelagem OHLC e no modo "Cada tique é baseado em carrapatos reais"? Em geral, você tem alguma idéia de como resolver o problema OHLC com a sincronização sem demora, ou seja, se ainda não há barra em outro símbolo, então usamos os dados da barra anterior? Se verificarmos todos os ticks, podemos (embora eu não tenha tentado) receber os dados do primeiro tick na barra e ter certeza da sincronização, ou seja, saber se havia uma barra no gráfico atual no momento da abertura de um novo ou não.

 
Aleksey Vyazmikin:

E este problema, infelizmente, não é totalmente resolvido pelo código. Há alguma ideia de como se pode resolver para que seja possível receber os mesmos dados do símbolo, onde a EA não está localizada, tanto no modo de simulação OHLC como no modo "Cada tique-taque baseado em tiques reais"? Em geral, você tem alguma idéia de como resolver o problema de sincronização sem demora quando OHLC, ou seja, se ainda não há nenhuma barra em outro símbolo, então usamos os dados da barra anterior? Se verificarmos com todos os ticks, então é possível (embora eu não tenha tentado) receber dados do primeiro tick na barra e ter certeza da sincronização usando-a, ou seja, saber se havia uma barra no gráfico atual no momento da abertura de um novo ou não.

Pode até falhar algumas barras de minutos. Formar um bar ao preço de fecho do anterior. Isto pode ser bom para a análise do comportamento combinado de vários símbolos. Pode não ser importante para um par de moedas.
 
elibrarius:
Pode até falhar algumas barras de alguns minutos. Formar um bar ao preço de fecho do anterior. Para a análise do comportamento conjunto de vários instrumentos, será útil. Para uma moeda, provavelmente não é importante.

Desta forma será a dessincronização, pois segundo a OHLC a barra anterior será anterior, mas na negociação real pode ser a anterior a essa.

 

Para aqueles que não sabiam que o modo OHLC é uma série temporal de símbolos dessincronizados, é crítico para o MO


Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Nova versão do MetaTrader 5 build 2615: Análise Fundamental e Critérios Complexos no Testador de Estratégia

Aleksey Vyazmikin, 2020.09.26 13:26


Construir 2622, tempo de 1 minuto, ferramenta Si-12.20 corretor "Otkrytie".

Imprimir na abertura de um novo bar no modo"Cada tic tac baseado no tic real" e "OHLC no 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));

Os resultados acima são tabulados e eu tenho perguntas sobre eles:

1. Eu esperava que o atraso pudesse ser se houvesse uma nova barra para o símbolo atual, mas ainda não para o símbolo do qual solicitamos a informação - esta situação realmente acontece, mas apenas na abertura de um novo dia - ela é destacada em verde.

2) A situação é a mesma do primeiro ponto sem marcação, mas se é esperado no teste potik, então porque é que esta situação acontece em"OHLC na M1" - porque é que existe uma dessincronização - não é clara.

3. a situação em que dois ticks são recebidos ao mesmo tempo ou um tick para o símbolo solicitado é mais rápido do que para o símbolo a partir do qual a informação é chamada, é destacado com amarelo; mas por que não há tick nesta barra no modo "OHLC no M1", se já foi recebido no modo tickwise?

Peço aos desenvolvedores que esclareçam, era essa a intenção, então qual é a lógica, ou trata-se de um bug que será corrigido?


Resposta:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Novo MetaTrader 5 build 2615: Análise Fundamental e Critérios Complexos no Teste de Estratégia

Renat Fatkhullin, 2020.09.26 13:33

Sua pergunta é apenas sobre o modo de teste OHLC, porque tudo está correto no modo pegajoso?

A resposta é simples, você não pode ter nenhuma garantia de sincronização precisa de caracteres estrangeiros nos testes OHLC. OHLC é exclusivamente para testes sujos.


 

Parece ter resolvido o problema do out-of-sync, ao solicitar dados de outro símbolo - teve que sacrificar uma barra de um minuto em alguns casos, mas resultado estável ao modelar em todos os ticks e em OHLC, o que significa que o mesmo é esperado em negociação real.

//+------------------------------------------------------------------+
//|Получение информации о ценах 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);
         }
      }
   }
}
 
Para uma coisa robusta normal, um pequeno atraso não tem qualquer efeito. (Este é um problema rebuscado).
 
Maxim Dmitrievsky:
Para uma coisa robusta normal, um pequeno atraso não afecta nada. Estes são problemas rebuscados).

Onde arranjar estes "normais"? E afeta ou não - é aleatório aqui, se durante a quantização se entra na fronteira entre quantis, então durante o treinamento pode parecer que apenas 1 diferença de quantis fará com que o input salte no real. Em geral não gosto quando não consigo reproduzir no testador um dia de negociações fechado, então identifiquei o motivo e comecei a eliminá-lo.

Razão: