Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 245

 
forexman77:

No guião, eu fiz isto:

tempo=0

SymbolInfoTick na segunda-feira.

Pode verificá-lo com este código:

void OnStart()
{
  double ask;
  uint start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  }
  uint time=GetTickCount()-start;
  Print("SymbolInfoDouble = ",time," ms");
  
  MqlTick tick;
  start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    SymbolInfoTick(Symbol(),tick);
  }
  time=GetTickCount()-start;
  Print("SymbolInfoTick = ",time," ms");
}

Mas é preciso carraças por símbolo.

 
Fleder:

Pode verificá-lo com este código:

Mas é preciso carraças por símbolo.

Sim,"SymbolInfoTick", sem verificação hoje.

Experimentei-o, não vai funcionar até que os carrapatos cheguem.

void OnStart()
  {
uint start=GetTickCount();
double iask=0;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if(!SymbolInfoTick(_Symbol,latest_price)){iask=latest_price.ask;}
Alert("iask=",iask);
uint time=GetTickCount()-start;
Alert("time=",time);  
  }
iask=0
 
forexman77:

Sim, SymbolInfoTick, sem verificação hoje.

Experimentei-o, até os carrapatos dispararem nada vai funcionar.

iask=0

Esta função é demasiado rápida.

Para medir o desempenho, é necessário aplicar várias chamadas num loop com um grande número de iterações e medir o tempo total de execução.

 
barabashkakvn:
Tanto mais interessante, existe um código de exemplo. Estamos à espera do resultado.
 
forexman77:
Obrigado. Vai ser útil.
 

Para verificar uma nova barra na EA utilizei funções baseadas em "CopyTime", "CopyRates", que encontrei nos fóruns. Cheguei à conclusão de que os seus cálculos levam muito tempo.

Aqui estão os dados de verificação (é digno de nota que a chamada do indicador leva 171 ms):

datetime New_Time[];//буффер для проверки нового бара
void OnStart()
  {
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
static datetime t;//записываем старое время  
ArraySetAsSeries(New_Time,true);//направление индексации
CopyTime(_Symbol,_Period,0,1,New_Time);//копируем время нового бара
t=New_Time[0];   
}
uint time=GetTickCount()-start;
Print("New_Time = ",time," ms");
  }

MqlRates rates[]; 
void OnStart()
  {
datetime t;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),Period(),0,1,rates);  
t=rates[0].time; 
}
uint time=GetTickCount()-start;
Print("t = ",time," ms");
  }

E aqui tenho uma ideia, e se eu tentar outra coisa. Por exemplo, "TimeCurrent".

Fez o seguinte código para optimização:

void OnStart()
  {
int t;
int s;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{

MqlDateTime m;
TimeCurrent(m);
t=m.min;
s=m.sec;
}
uint time=GetTickCount()-start;
Print("time = ",time," ms");    
  }

Fez o seguinte código para optimização no Expert Advisor:

static double ind1;//записываю значения
static double ind2;// значения
static double indsmall;//индикаторов
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
if (MIN==0 && SEC==0)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

Resultado em execução única sem verificação de uma nova barra, quando são recebidos valores indicadores a cada tick: 817,196 ms

Com verificação de um novo bar: 735 904 ms

A diferença não é particularmente impressionante, há algumas melhorias, mas não é suficiente.

Recebo o indicador da seguinte forma:

int TSIHandle;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit()
  {
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
   return(0);
  }

void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(TSIHandle);
   ArrayFree(TSI);
  }

void OnTick()
  {
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
static double tsismall;

if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферов
   if(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
     {
      Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
      return;
     }
tsismall=TSI[1];
}
}

Tentei colocar código com chamadas de puxadores no bloco onde ocorre a verificação de nova barra, aparece um erro se eu

if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}

Coloco retorno não devolve nada, nenhum erro, mas a EA não funciona.

Suponho que a chamada hendle, se for possível e em geral todo o código principal excepto a variável estática deve ser colocada dentro da declaração condicional, verificando a existência de uma nova barra.

Se não me engano, li algures que mesmo que chamemos uma pega mas não solicitemos um indicador em amortecedores, ainda assim é calculado.

 
Alguém pode por favor aconselhar como fazer um indicador para produzir os resultados da fórmula tampão[i] = (1,3747-(MarketInfo("EURUSD", MODE_BID))+0,8835-(MarketInfo("USDCHF", MODE_BID)))*10000;
 
rus-lot:
Quem pode sugerir como fazer um indicador que exibe os resultados de um buffer de fórmula única[i] = (1,3747-(MarketInfo("EURUSD", MODE_BID))+0,8835-(MarketInfo("USDCHF", MODE_BID)))*10000;

É necessário escrever um indicador personalizado. Para facilitar o processo - pegar num dos indicadores mais simples -iMa e reescrever um pouco. Aqui está outro tópico, onde se fala de MarketInfo. Escreva o código, pergunte, se algo não funcionar.

 
O que aconteceu com as variáveis estáticas? Actualizou-se hoje a velha construção do terminal e agora há erros na compilação:

unresolved static variable
 
sgreen:
O que aconteceu às variáveis estáticas? Actualizou-se hoje a velha construção do terminal e agora há erros na compilação:

unresolved static variable

Os dados estáticos dos membros da classe devem agora ser colocados:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;
Razão: