2) há frequentemente problemas quando se tenta testar a execução com ligação aos núcleos (funciona com a nona execução). ver a imagem.
TheXpert: Um grupo de telepatas já está a analisar o seu problema.
não é necessário ser um telepata para compreender que iCustom() não funciona como deveria.
para o testar, pode executar o código do Expert Advisor: duplo tampão[]; ResetLastError(); int MA_handle = iCustom(NULL, 0, "Exemplos\\\\Média Móvel Personalizada", 21, 0, MODE_SMMA); //int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN); Print("MA_handle = ", MA_handle, " error = ", GetLastError())); int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer); if (copy == -1) Print("Failed to get Custom Moving Average indicator"); senão for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
e a mensagem "Failed to get Custom Moving Average indicator values" resultará.
ou seja, CopyBuffer dá um erro (devolve -1) para o indicador iCustom(). se tomarmos o indicador padrão iMA(), o mesmo código funciona!
Urain: Olhe para a direcção de indexação da matriz resultante, talvez necessite de ser expandida.
tudo está bem com a direcção de indexação e em construções anteriores isto também funcionou. em 448 e 450 não funciona. Tenho sugerido muitas vezes que os programadores devem testar a funcionalidade principal do terminal mais minuciosamente, mas de construção em construção obtêm diferentes erros críticos em vez de erros críticos. Isto é, uma coisa é fixa e outra que normalmente funcionava parte-se e não há fim à vista.
O deslize antes de copiar os dados, leva tempo a calcular o indicador, por isso mesmo que o cabo regresse correctamente, os dados ainda não foram calculados,
Em geral, recomenda-se chamar indicadores no inite, e solicitar dados já em OnTick() ou outras funções especiais.
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);Print("MA_handle = ", MA_handle, " error = ", GetLastError());
Sleep(100);
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average");
elsefor (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
mais uma vez, copia-se 5 dados da barra zero, mas no copybuffer zero bar está algures por volta de 1970 (depende das definições da barra máxima), foi por isso que eu disse para olhar para a indexação da matriz.
O deslize antes de copiar os dados, leva tempo a calcular o indicador, por isso, embora o cabo retorne correctamente, os dados ainda não foram calculados.
Sleep(1000); // 1 seg. depois de chamar iCustom() ajudou, MAS. como devo saber quanto tempo demorará o processo de cálculo? é errado dar o manípulo indicador correcto que aponta para o lixo ! e deve ter funcionado correctamente antes porque não havia tal problema.
Urain:
em geral, é recomendado chamar indicadores nas iniciais, e pedir dados já em OnTick() ou outras funções especiais.
Essa é uma boa dica para mim, obrigado ) porque se o tivesse feito dessa forma, não teria visto o problema...
Mais uma vez está a copiar 5 dados da barra zero, mas no copyBuffer a barra zero está algures por volta de 1970(depende das definições da barra máxima), foi por isso que eu disse para olhar para a indexação da matriz.
Tanto quanto entendi da documentação de ajuda, em CopyBuffer() barra zero é na realidade "tempo presente", e já quando se copia, a matriz é expandida.
Sleep(1000); // 1 seg. depois de chamar iCustom() ajudou, MAS... como é suposto eu saber quanto tempo demora o processo de cálculo? é errado dar a pega indicadora correcta que indica o lixo ! e deve ter funcionado correctamente antes, porque não existia tal problema.
Não é necessário ajustar o tempo de atraso para a função Sleep(), se dividir por tempo a chamada iCustom e o acesso aos valores deste indicador. Além disso, existe a função BarsCalculated()
Não sei se isto é um bug, mas penso que existem erros no código das bibliotecas para todos os tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para o mestre, verCSignalTEMA::ShortCondition()
//| "Voting" that price will grow. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will grow. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::LongCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)<0.0)
{
//--- the close price is below the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)>0.0 && DiffMA(idx)>0.0)
{
//--- the open price is above the indicator (i.e. there was an intersection), but the indicator is directed upwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is above the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)>0.0)
{
//--- the indicator is directed upwardsif(DiffOpenMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is above the indicatorif(DiffLowMA(idx)<0.0)
{
//--- the low price is below the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
//+------------------------------------------------------------------+//| "Voting" that price will fall. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will fall. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::ShortCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
//--- the close price is above the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)<0.0 && DiffMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection), but the indicator is directed downwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)<0.0)---------------------------------------->ДОЛЖЕН БЫТЬ ЗНАК "БОЛЬШЕ"!!!
{
//--- the open price is above the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is below the indicatorif(DiffHighMA(idx)>0.0)
{
//--- the high price is above the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
Também na biblioteca SignalMA em
int CSignalMA::ShortCondition()
{
.......
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
.......
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is used
То что ниже не корректно:
if(DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(IS_PATTERN_USAGE(2) && DiffOpenMA(idx)<0.0)
{
.....
}
Последние 2 условия должны выглядеть так:
if(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)>0.0)
{
.....
}
Não sei se isto é um bug, mas penso que existem erros no código das bibliotecas para todos os tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para o mestre, ver CSignalTEMA::ShortCondition()
Também na biblioteca SignalMA em
Muito obrigado. Será corrigido. (Pasta de copipo maldita)
Qual deles?
ambos costumavam funcionar bem, agora não.
2) há frequentemente problemas quando se tenta testar a execução com ligação aos núcleos (funciona com a nona execução). ver a imagem.
Um grupo de telepatas já está a analisar o seu problema.
não é necessário ser um telepata para compreender que iCustom() não funciona como deveria.
para o testar, pode executar o código do Expert Advisor:
duplo tampão[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Exemplos\\\\Média Móvel Personalizada", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);
Print("MA_handle = ", MA_handle, " error = ", GetLastError()));
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Failed to get Custom Moving Average indicator");
senão
for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
e a mensagem "Failed to get Custom Moving Average indicator values" resultará.
ou seja, CopyBuffer dá um erro (devolve -1) para o indicador iCustom(). se tomarmos o indicador padrão iMA(), o mesmo código funciona!
Olhe para a direcção de indexação da matriz resultante, talvez necessite de ser expandida.
tudo está bem com a direcção de indexação e em construções anteriores isto também funcionou. em 448 e 450 não funciona.
Tenho sugerido muitas vezes que os programadores devem testar a funcionalidade principal do terminal mais minuciosamente,
mas de construção em construção obtêm diferentes erros críticos em vez de erros críticos.
Isto é, uma coisa é fixa e outra que normalmente funcionava parte-se e não há fim à vista.
O deslize antes de copiar os dados, leva tempo a calcular o indicador, por isso mesmo que o cabo regresse correctamente, os dados ainda não foram calculados,
Em geral, recomenda-se chamar indicadores no inite, e solicitar dados já em OnTick() ou outras funções especiais.
mais uma vez, copia-se 5 dados da barra zero, mas no copybuffer zero bar está algures por volta de 1970 (depende das definições da barra máxima), foi por isso que eu disse para olhar para a indexação da matriz.
O deslize antes de copiar os dados, leva tempo a calcular o indicador, por isso, embora o cabo retorne correctamente, os dados ainda não foram calculados.
Sleep(1000); // 1 seg. depois de chamar iCustom() ajudou, MAS. como devo saber quanto tempo demorará o processo de cálculo?
é errado dar o manípulo indicador correcto que aponta para o lixo ! e deve ter funcionado correctamente antes porque não havia tal problema.
em geral, é recomendado chamar indicadores nas iniciais, e pedir dados já em OnTick() ou outras funções especiais.
Essa é uma boa dica para mim, obrigado ) porque se o tivesse feito dessa forma, não teria visto o problema...
Mais uma vez está a copiar 5 dados da barra zero, mas no copyBuffer a barra zero está algures por volta de 1970(depende das definições da barra máxima), foi por isso que eu disse para olhar para a indexação da matriz.
Tanto quanto entendi da documentação de ajuda, em CopyBuffer() barra zero é na realidade "tempo presente", e já quando se copia, a matriz é expandida.
Sleep(1000); // 1 seg. depois de chamar iCustom() ajudou, MAS... como é suposto eu saber quanto tempo demora o processo de cálculo?
é errado dar a pega indicadora correcta que indica o lixo ! e deve ter funcionado correctamente antes, porque não existia tal problema.
As seguintes opções indicadoras (circuladas a vermelho) podem ser definidas programticamente?
Não encontrei uma forma de o fazer.
Não sei se isto é um bug, mas penso que existem erros no código das bibliotecas para todos os tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para o mestre, verCSignalTEMA::ShortCondition()
Também na biblioteca SignalMA em
Não sei se isto é um bug, mas penso que existem erros no código das bibliotecas para todos os tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para o mestre, ver CSignalTEMA::ShortCondition()
Também na biblioteca SignalMA em
https://www.mql5.com/ru/forum/1111/page391#comment_67358
Dar a linha completa da chamada.
/i:<caminho para a pasta MQL5>.
Dar a cadeia de chamada completa.
Aqui estão todas as opções tentadas:
Após cada tentativa, foi feita uma verificação para ver se o ficheiro existia no caminho
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Scripts\sInstallerTestScript.ex5O inluder no caminho
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Include\InstallerTestInclude\IncInstallerTest.mqhexiste.
A verificação da existência foi realizada pela função: