Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 202

 
Yurij Kozhevnikov:

=

Este parece ser o caso, se eu entender corretamente o princípio da substituição.

Ponto-e-vírgula extra após os colchetes encaracolados. E não está claro o que mais está sendo mencionado.

É uma pena que aparentemente não exista uma maneira fácil de automatizar a expansão macro para ver o que acontece. A menos que eu possa inventar meu próprio roteiro.

Obrigado! Há uma razão pela qual não há ponto-e-vírgula depois de estar na macro.

Macros são uma coisa boa, mas a linha entre o bem e o mal, no caso deles, é ainda mais fina do que com uma mulher)))) Você tem que ser muito, muito cuidadoso com eles. E sim, no meu exemplo, não ';', mas exatamente o contrário, que começou a se referir a se, que está no macro, depois de você remover ;.

Sou muito bom em macros, por isso, para um caso como o seu eu desisti de usá-los há cerca de 1,5 anos, é ótimo:

inline bool CheckRead(){
   ...
}

if (!CheckRead()) return;
 

Exceto que eu não consigo encontrar nada sobre o inline aqui.

E eu não sei C++.

 

Boa tarde! Por favor, ajudem!

Existe um código bastante simples para abrir e modificar um pedido. As funções OrderSend, OrderSelect e OrderModify são colocadas em um loop com um pequeno atraso entre as tentativas. Para minimizar erros de comunicação, etc.

Acontece o seguinte estranho: a ordem é normalmente aberta, seguida pela modificação bem sucedida do StopLoss e a modificação bem sucedida do TakeProfit. Mas quando eu defino o TP, o StopLoss é anulado. Não consigo entender a razão.

Aqui está esta parte do código:

enviar = 5; // número máximo de tentativas para estabelecer um pedido

tick=0;

sendchet=0; // contador de entradas

while(!tick && sendchet<=send)

{

tick=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Bid,150,0.0,0.0.0,komm,MagNum,0,Yellow);

sendchet++;

Dormir(1000); //Depreender 1 segundo antes da próxima tentativa

}

selecionar = 5; // número máximo de tentativas para selecionar um pedido

slschet=0; // contador de entradas para seleção de pedidos

while(!OrderSelect(tick,SELECT_BY_TICKET) && slschet<=select)

{

slschet++;

Dormir(500); //Delay 0,5 segundo antes da próxima tentativa

}

se(slschet<select) //tries foram inferiores ao máximo, isso significa que a ordem foi selecionada com sucesso

{

modificar = 5; // número máximo de tentativas para modificar a ordem

mdschet=0;

while(!OrderModify(tick,OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Yellow)

&& mdschet<=modificar)

{

mdschet++;

Dormir(500); //Delay 0,5 segundo antes da próxima tentativa

}

*Aqui está tudo bem - SL está pronto

mdschet=0; // contador de reposição antes de mudar TP

while(!OrderModify(tick,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TP,Digits),0,Yellow)

&& mdschet<=modificar)

{

mdschet++;

Sleep(500);

}

}

*Aqui TP é definido normalmente, mas SL já é igual a 0,0. Portanto, acontece que OrderStopLoss() é igual a 0,0.

No entanto, a seleção do pedido não mudou.

Se acrescentarmos OrderSelect mais uma vez entre o ajuste SL e TP, tudo parece funcionar. Mas isso contradiz a lógica.

Agradecemos antecipadamente a sua ajuda neste assunto.

 

Boa tarde!

Por favor, ajude-me a lidar com a mudança do tamanho de uma matriz dinâmica.

Digamos que eu estou montando uma matriz:

int DB[][8];

Depois, na primeira sub-rotina do loop, possivelmente várias vezes (sem perguntas sobre isso - até agora funciona como pretendido):

ushort i = 0;
ArrayResize(DB,i+1);

Na próxima sub-rotina, acrescentarei elementos na primeira dimensão do laço. Não sei quantos com antecedência. Sei que é mais lento do que se você declarar a dimensão de antemão. Mas acho que até 500 acréscimos por ano não farão diferença.

A questão é: como descobrir o tamanho da matriz existente nesta sub-rotina? Tomá-lo como um tamanho de base e acrescentar-lhe um novo valor.

Pegar ArraySize() e dividir por 8? Ou existe alguma outra função que me convém melhor?

Obrigado de antemão!

 
Oleg_Ko:

Boa tarde!

Por favor, ajude-me a lidar com a mudança do tamanho de uma matriz dinâmica.

Digamos que eu estou montando uma matriz:

Depois, na primeira sub-rotina do loop, possivelmente várias vezes (sem perguntas sobre isso - até agora funciona como pretendido):

Na próxima sub-rotina, acrescentarei elementos na primeira dimensão do laço. Não sei quantos com antecedência. Sei que é mais lento do que se você declarar a dimensão de antemão. Mas acho que até 500 acréscimos por ano não farão diferença.

A questão é: como descobrir o tamanho da matriz existente nesta sub-rotina? Tomá-lo como um tamanho de base e acrescentar-lhe um novo valor.

Pegar ArraySize() e dividir por 8? Ou existe alguma outra função que me convém melhor?

Obrigado de antemão!

ArrayRange()

Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

ArrayRange()

Artem, obrigado.
 

Boa tarde.

Há muito tempo que não negociava no MT4, decidiu tentar novamente. Anteriormente utilizado o roteiro (anexado), mas agora ele não vai funcionar, por favor veja o que deu errado.

Arquivos anexados:
RiskAdvisor.mq4  12 kb
 
Nauris Zukas:

Olá!
Há alguma maneira de saber imediatamente CopyHigh o número de elementos de uma matriz em qualquer período de tempo?

Eu mesmo responderei, talvez alguém se depare com a pergunta através de um mecanismo de busca.

SeriesInfoInteger(symbol_name,timeframe,SERIES_BARS_COUNT);
 
Nauris Zukas:

Eu mesmo responderei, talvez alguém se depare com a pergunta através de um mecanismo de busca.

Também Bars(), iBars()
 
Artyom Trishkin:
Também Bars(), iBars()

Com Bars(), você não pode descobrir o número de elementos da matriz em qualquer período de tempo, mas somente no gráfico atual.