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[];//буффер для проверки нового бараvoidOnStart()
{
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
staticdatetime 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");
}
E aqui tenho uma ideia, e se eu tentar outra coisa. Por exemplo, "TimeCurrent".
Fez o seguinte código para optimização:
voidOnStart()
{
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:
staticdouble ind1;//записываю значенияstaticdouble ind2;// значенияstaticdouble 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; // хэндл индикатора TSIdouble TSI[]; // динамические массивы для хранения численных значений TSIintOnInit()
{
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
return(0);
}
voidOnDeinit(constint reason)
{
//--- освобождаем хэндлы индикаторовIndicatorRelease(TSIHandle);
ArrayFree(TSI);
}
voidOnTick()
{
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
staticdouble 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 retornonã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.
No guião, eu fiz isto:
tempo=0
SymbolInfoTick na segunda-feira.
Pode verificá-lo com este código:
Mas é preciso carraças por símbolo.
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.
iask=0Sim, SymbolInfoTick, sem verificação hoje.
Experimentei-o, até os carrapatos dispararem nada vai funcionar.
iask=0Esta 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.
Tanto mais interessante, existe um código de exemplo. Estamos à espera do resultado.
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):
E aqui tenho uma ideia, e se eu tentar outra coisa. Por exemplo, "TimeCurrent".
Fez o seguinte código para optimização:
Fez o seguinte código para optimização no Expert Advisor:
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:
Tentei colocar código com chamadas de puxadores no bloco onde ocorre a verificação de nova barra, aparece um erro se eu
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.
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 às variáveis estáticas? Actualizou-se hoje a velha construção do terminal e agora há erros na compilação:
Os dados estáticos dos membros da classe devem agora ser colocados: