MQL4 Relógio de Tempo Real (segundo por segundo) - página 3

[Excluído]  
brewmanz:

A) Não se preocupe em usar o MT4 como um relógio em tempo real. É um pouco como conseguir que um cão ande sobre suas patas traseiras - interessante vê-lo feito, mas na verdade não alcança muito.

B) Por que é tão crítico processar a cada segundo? Se não está acontecendo muita coisa com os carrapatos, então não está acontecendo muita coisa com os preços.

(cada comentário vale 1 centavo)


A) Por que não deveríamos! Ou é apenas tempo de computador ou servidor
; acho que podemos obter informações com precisão.

B) Por que é crítico ... deixe-me ver - comércio de alta freqüência - não baseado em informações assíncronas onde o tick-by-tick está ! isso deveria ser uma razão válida, acho eu.

Eu ainda estou esperando por meus 2 centavos.

[Excluído]  
Ais:

Referência MQL4 : https://docs.mql4.com/runtime/start: "Roteiros e especialistas trabalham em seu próprio fio condutor. Os indicadores personalizados trabalham no fio principal da interface".


Então seu indicador exibe o tempo na Interface do usuário na GUI ? tempo real / segundo por segundo.
 

Para trabalhar "segundo por segundo" usamos a função "Sleep()".

Para fazer isso, medimos o tempo de execução da rotina principal.

Por exemplo, deixe o tempo de execução ser armazenado na variável "int Runtime;", e deixe "RunTime < 1000".

Então invocamos "Sleep (1000 - RunTime);" para assegurar que a próxima execução ocorrerá em 1000 ms, com a devida precisão, é claro.

Mas.

Referência MQL4 : https://docs.mql4.com/common/Sleep: "A função Sleep() não pode ser chamada a partir de indicadores personalizados, pois eles calculam na rosca da interface e podem não desacelerá-la".

 

Solução simples:

Inclua os cálculos em sua EA e você está bem.

Prós:

Não há necessidade de chamar o icustom

Nenhum indicador

Cons:

Sem Indicador. Mas, para comércio de alta freqüência, você *deve* usar um EA porque os seres humanos devem diminuir a velocidade.

 

"Alta freqüência" e "baixa latência" são ligeiramente diferentes.

E, visualizações freqüentemente utilizadas para análise ou para monitoramento, não apenas para comercialização.

 
Ais:

"Alta freqüência" e "baixa latência" são ligeiramente diferentes.

E, visualizações freqüentemente utilizadas para análise ou para monitoramento, não apenas para comercialização.

Se você realmente precisa de monitoramento, pode reconstruir o comportamento do acusador com linhas. Com certeza, o alto desempenho é algo diferente.

 

E se quisermos analisar e monitorar os eventos com base em intervalos de tempo?
Por exemplo, a cada 1 segundo.

[Excluído]  
Ais:

E se quisermos analisar e monitorar os eventos com base em intervalos de tempo?
Por exemplo, a cada 1 segundo.

Assim que você fala sobre tick-by-tick você significa ultra alta freqüência ....

Análise de dados financeiros de ultra-alta freqüência utilizando transformadas avançadas de Fourier" (2009) Finance Research Letters Vol 6, pp 47-53 (com I.Giampaoli e W.L.Ng)

A amostragem em intervalos predefinidos pode ser definida como amostragem de alta freqüência onde T<t

 
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Black
#property indicator_color2 Black
#property indicator_color3 Red
#property indicator_color4 Blue
#property indicator_color5 Red
#property indicator_color6 Red
#property indicator_color7 Red
#property indicator_color8 Red
//---- buffers
double open[];
double close[];
double high[];
double low[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
 
extern int MaxHistory=200;
extern int TimeInSeconds=5;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
double a.open[];
double a.close[];
double a.high[];
double a.low[];
 
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,high);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,low);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,5);
   SetIndexBuffer(2,open);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,5);
   SetIndexBuffer(3,close);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,ExtMapBuffer6);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(7,ExtMapBuffer8);
   ArrayResize(a.high,MaxHistory);
   ArrayResize(a.low,MaxHistory);
   ArrayResize(a.open,MaxHistory);
   ArrayResize(a.close,MaxHistory);      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void redraw(){
   for(int i=200;i>=0;i--){
      if(i==200){
      open[i]=0;
      close[i]=0;
      high[i]=0;
      low[i]=0;
      }else{
      open[i]=a.open[i];
      close[i]=a.close[i];
      high[i]=a.high[i];
      low[i]=a.low[i];      
      }
   }
}
 
void shift(){
   for(int i=200;i>0;i--){
      a.open[i]=a.open[i-1];
      a.close[i]=a.close[i-1];
      a.high[i]=a.high[i-1];
      a.low[i]=a.low[i-1];
   }
}
 
extern int sleep=100;
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   bool running=true;
   static double price=0;
   static int t=0;
   static datetime t.r=0; 
   static bool updates=false;
   //t=TimeCurrent();
   //while(running){
      updates=false;
      if(TimeCurrent()>(t+TimeInSeconds)){
 
         shift();
         if(a.open[1]==EMPTY || a.open[1]==EMPTY_VALUE || a.open[1]==0){
            a.open[0]=Bid;
            a.close[0]=Bid;
            a.high[0]=Bid;
            a.low[0]=Bid;
         }else{
         a.open[0]=a.close[1];
         a.high[0]=a.close[1];
         a.low[0]=a.close[1];
         a.close[0]=a.close[1];
         }
         Print("shift "+a.open[0]+" - "+a.open[1]);
         updates=true;
         t=TimeCurrent();
      }
      if(price!=Bid){
            price=Bid;
            a.close[0]=price;
            a.high[0]=MathMax(price,a.high[0]);
            a.low[0]=MathMin(price,a.low[0]);
            updates=true;
      }       
      if(Time[0]!=t.r){
         t.r=Time[0];
         redraw();
      }else{
         if(updates){
            redraw();
         }
      }
      if(IsStopped()) running=false;
   //   Sleep(sleep);
   //}
//----
   return(0);
  }
facilmente re-codificável para um EA para usar a função de sono apropriada. Isto já foi feito.
[Excluído]  
zzuegg:
facilmente re-codificável para um EA para usar a função de sono apropriada. Isto já foi feito.


Belo programa . TimeCurrent() é o preço do tick-by-tick que precisamos para obter o preço do computador!

Talvez possamos construir um relógio sintético, por exemplo:

if(Time[0]!=t.r){
t.r=Tempo[0];
redraw();

nos dê uma dica! zzuegg :)