Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 737

 
Alexey Viktorov:
Qual é a dimensionalidade da matriz NewsArr na segunda dimensão?

Infelizmente, eu não entendo. Qual é a segunda dimensão?

Ah, eu acho que entendi: NewsArr assume valores 0,1,2 e 3. Isto?

Isto deve ser: string NewsArr[4][1000];

 
novichok2018:

Infelizmente, eu não entendo. Qual é a segunda dimensão?

Ah, acho que entendi: NewsArr assume valores 0,1,2 e 3. Isto?

Isto deve ser: string NewsArr[4][1000];

Primeira dimensão e segunda dimensão.

Mas provavelmente é a resposta errada.
 
Alexey Viktorov:

A primeira dimensão e a segunda dimensão.

Mas você deve ter respondido algo errado.

Onde procuro a dimensionalidade da segunda dimensão?

Ou a dimensionalidade da primeira dimensão 4 e da segunda dimensão 1000?
 
novichok2018:

E onde você procura a dimensionalidade da segunda dimensão?

Ou a primeira dimensão é a 4 e a segunda 1000?

Sim. Mas algo está bagunçado neste posto

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer dúvida que os novatos tenham sobre MQL4, ajuda e discussão sobre algoritmos e códigos

novichok2018, 2019.01.16 15:52

Provavelmente uma pergunta boba, já que ninguém responde, mas como lidar com a parada e retomada da EA após a compilação?

A plataforma dá uma mensagem:matriz fora do alcance (284,17).

linha 284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); aposição 17 abre um colchete com o NomNews, que é iniciado globalmente por 0.

Mudei de 0 para 1, sem sucesso.
Mudou a linha se (NomNews==300) quebrar; 300 a 360000, sem sucesso.

Eu o compenso - funciona bem por alguns minutos. E o que fazer?

Quando o número de valores na segunda dimensão é 1000 e

if(NomNews==300)break;
Não pode haver uma matriz ultrapassada na segunda dimensão.


 
psyman:

Eu não tenho pontos de ancoragem, apenas movimento vertical, e eu defino a horizontal uma vez em toda a largura da tela. Não é um problema contar do outro lado, mas é surpreendente que a mesma ação seja realizada de forma diferente em funções diferentes.


E outra pergunta - se eu quiser produzir Bid como um texto de etiqueta, qual função devo usar para fazê-lo de forma otimizada -OnChartEvent ouOnCalculate?

OBJ_LABEL tem um ponto de ancoragem mesmo que você não o tenha definido. Por padrão, é o canto superior esquerdo. A Licitação é alterada na OnCalculate e você pode alterar o texto no rótulo lá.

 
Alexey Viktorov:

Sim. Mas há algo de errado com esta mensagem

Quando o número de valores na segunda dimensão é 1000 e

Não pode haver uma matriz fora de alcance na segunda dimensão.


Não, não parece haver confusão. Aqui está a mensagem copiada: 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5: array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

Eu mostrei a linha 284 acima.
 
novichok2018:

Não, acho que não tenho nada de errado. Aqui está a mensagem copiada: 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5: array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

Eu mostrei a linha 284 acima.

A posição 17 abre um colchete com o NomNews, que é iniciado globalmente por 0.

Portanto, você tem um tamanho de célula de matriz zero-dimensional na segunda dimensão.

 
Artyom Trishkin:

Portanto, o tamanho da célula de sua matriz na segunda dimensão é zero.

É aqui que está localizado oNomNews:

dataHoraNewsFunck(int nomf)

{

string s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),"",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

return((datetime)(StringToTime(time) + GMTplus*3600))

}

//345678901234567890////////////////////////////////////////////////////////////////////////////////

nulo UpdateNews()

{

string TEXT=ReadCBOE();

int sh = StringFind(TEXTO, "pageStartAt>")+12;

int sh2= StringFind(TEXT,"</corpo>");

TEXT=StringSubstr(TEXT,sh,sh2-sh);


sh=0;

while(!IsStopped())

{

sh = StringFind(TEXT, "event_timestamp",sh)+17;

sh2= StringFind(TEXT, "onclick",sh)-2;

if(sh<17 || sh2<0)break;

NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);


sh = StringFind(TEXT,flagCur,sh)+10;

sh2= sh+3;

if(sh<10 || sh2<3)break;

NewsArr[1][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][NomNews])<0)continue;


sh = StringFind(TEXTO, "título",sh)+7;

sh2= StringFind(TEXT, "Volatilidade",sh)-1;

if(sh<7 || sh2<0)break;

NewsArr[2][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

if(StringFind(NewsArr[2][NomNews], "High")>=0 && !HighNews)continue;

if(StringFind(NewsArr[2][NomNews], "Moderado")>=0 && !MidleNews)continue;

if(StringFind(NewsArr[2][NomNews], "Low")>=0 && !LowNews)continue;


sh=StringFind(TEXTO, "evento à esquerda",sh)+12;

int sh1=StringFind(TEXT, "Fala",sh);

sh2=StringFind(TEXT,"<",sh);

if(sh<12 || sh2<0)break;

if(sh1<0 || sh1>sh2)NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

else NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh1-sh);


NomNews++;

if(NomNews==300)break;

}

}

Valores de 0 a 300. Ajustado globalmente para 4?

 
novichok2018:


Valores de 0 a 300. Devo definir globalmente para 4?

Ainda dá uma mensagem em 12 minutos.

 
novichok2018:

Ainda dá uma mensagem no 12º minuto de operação.

Eu posso dizer de tudo isso que o NomNews entra no loop já em um estado superior a 999. Então você precisa descobrir o que está causando isto e reiniciar esta variável em algum lugar.

Para verificar isso, escreva-o no início do laço:

if(NomNews > 999)
{
   Print(NomNews);
   break;
}
Razão: