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

 
Mikhail:

Quando eu faço uma pergunta como esta:

Eu recebo este resultado:

2020.06.17 13:49:53.270 2020.01.02 06:50:00 Símbolo EURUSD_i Dígitos 5 Ponto 1e-05

Quando eu faço um pedido como este:

Eu recebo este resultado:

2020.06.17 13:51:58.787 2020.01.02 06:45:00 Símbolo EURUSD_i Dígitos 0 Ponto 0.0

Ao mesmo tempo, quero notar que se eu não inserir a função Imprimir, não recebo nenhum erro, o pedido nem sequer tenta modificar-se a si mesmo. É como se a CTrade não visse meu pedido.

A verificação do símbolo e do número mágico não funciona:

Resultado:

2020.06.17 14:37:38.147 2020.01.02 06:50:00 Símbolo mágico 0 Ticket 2

O número mágico deve ser 12345, o símbolo é euro dólar.

Por que não posso ter um símbolo e uma tragédia médica?

Se você mudar a corda:

é alterado para

e remover a validação por número mágico, então temos problemas com os preços

2020.06.17 01:38:24.136 2020.01.02 07:40:00 falhou na modificação do pedido #2 buy stop 0.1 EURUSD_i a 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Preço inválido]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: modificar #2 a 1.00000 (sl: 1.00000 tp: 1.00000) [preço inválido]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 A modificação BUY STOP falhou! Resultado Retcode: 10015, descrição do Retcode: preço inválido

Já me arrebentei, enquanto este mesmo código funciona bem em outro Expert Advisor.

O que eu estou fazendo de errado?

Objeto incorretamente inicializado (ou não) da classe CSymbolInfo.

Se você não tiver este símbolo de corda. Nome(Símbolo()), então acrescente-o.

Se você tiver um, depurar no Nome (símbolo de corda) funciona o que acontece.

Preenchimento de campos m_digits etc. na função Refresh().

s.s. A julgar pelo que você acrescentou, você definitivamente tem o símbolo assimicializado.

 
Mikhail:

Até a chegada do novo tick, não há movimento dos botões. Isso é o que posso ver com meus olhos. Assim que o preço muda, os botões se movem.

Embora hoje mesmo no novo tick os botões tenham parado de ser redesenhados, embora eu não tenha mudado nada. Apenas o fundo está em movimento.

Para esclarecer - como você diz, você muda as coordenadas no OnTick, e alega que de fato os botões se movem no NEXT tick. O próximo tique de quê? aquele em que você mudou as coordenadas, ou aquele do Natal?

 
Aleksey Mavrin:

Seu objeto de classe CSymbolInfo é inicializado incorretamente (ou não é inicializado de forma alguma).

Se você não tiver esse símbolo de corda. Nome(Símbolo()), então acrescente-o.

Se você tiver um, depurar no Nome (símbolo de corda) funciona o que acontece.

Preenchimento de campos m_digits etc. com Refresh().

s.s. A julgar pelo que você acrescentou, seu símbolo é definitivamente não-inicializado.

No topo do meu código, tenho as seguintes linhas
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CTrade atrade;
COrderInfo aorder;
CPositionInfo apos;
CDealInfo adeal;
CSymbolInfo asymbol;

É uma inicialização? Ao compilar, recebo as seguintes informações

Trade.mq5 panel' Trade.mq5 panel 1 1

'Trade.mqh' Trade.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

OrderInfo.mqh' OrderInfo.mqh 1 1

HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

SymbolInfo.mqh' SymbolInfo.mqh 1 1

código gerado 1 1

0 erros, 0 avisos, 3192 msec decorridos 1 1

Após abrir um pedido Buy Stop, recalculo todos os pedidos, seleciono um pedido aberto e verifico se o símbolo e o número mqh correspondem:

for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  
              if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen())

Nada acontece neste estágio, como escrevi acima, asymbol.Name() não retorna o símbolo de ordem aberta por algum motivo, aorder.Magic() retorna valor 0 (embora meu número mágico seja 121345), asymbol.TickSize() retorna valor 0. Em outras palavras, a verificação falha e, portanto, o trabalho adicional sobre o pedido pára. Por favor, esclareça"debug in function Name(string symbol) what's going on", eu não entendo bem esta frase. O que devo acrescentar e onde?

 
Aleksey Mavrin:

Para esclarecer - como você diz, você muda as coordenadas no OnTick, e alega que de fato os botões se movem no NEXT tick. O próximo tique de quê? aquele em que você mudou as coordenadas, ou aquele do Natal?

Acho que a seqüência é a seguinte: um novo tick entra, eu mudo as coordenadas do painel, o fundo do painel começa a se mover para o local desejado, os botões ficam parados naquele momento, um novo tick entra e os botões se movem seguindo o painel para o local desejado. É possível gerar carrapatos diretamente da Natividade?
 
Mikhail:

Nesta fase, nada acontece, pois como já escrevi acima, a função asymbol.Name() por algum motivo não retorna o símbolo de ordem aberta, function aorder.Magic() retorna valor 0 (embora minha Magic seja 121345), function asymbol.TickSize() retorna valor 0. Em outras palavras, a verificação falha e, portanto, o trabalho adicional sobre o pedido pára. Por favor, esclareça"debug in function Name(string symbol) what's going on", eu não entendo bem esta frase. O que devo acrescentar e onde?

O erro no índice de ordem / bilhete pode ser um erro a julgar pelo mágico 0. No momento do acesso à estrutura da ordem, os dados da ordem errada são escritos lá. No loop de seleção, pode ser que o próximo número seja colocado no último conjunto de pedidos, mas não aquele que você precisa. Os dados do último pedido selecionado são devolvidos a partir da estrutura do pedido.

 
Mikhail:
no topo do meu código estão as linhas

Isto é uma inicialização? Ao compilar, eu recebo as seguintes informações

'Trade panel.mq5' Trade panel.mq5 1 1

'Trade.mqh' Trade.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

OrderInfo.mqh' OrderInfo.mqh 1 1

HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

SymbolInfo.mqh' SymbolInfo.mqh 1 1

código gerado 1 1

0 erros, 0 avisos, 3192 msec decorridos 1 1

Após abrir um pedido de Buy Stop, recalculo todos os pedidos, seleciono um pedido aberto e verifico se o símbolo e o número Majdic correspondem:

Nada acontece neste estágio, como escrevi acima, asymbol.Name() não retorna o símbolo de ordem aberta por algum motivo, aorder.Magic() retorna valor 0 (embora meu número mágico seja 121345), asymbol.TickSize() retorna valor 0. Em outras palavras, a verificação falha e, portanto, o trabalho adicional sobre o pedido pára. Por favor, esclareça"debug in function Name(string symbol) what's going on", eu não entendo bem esta frase. O que devo acrescentar e onde?

Nossa, por que você usa algo que não entende (e se for uma mala yadda yadda)? )

E você nem se dá ao trabalho de ler o que está escrito

Se você não tiver um símbolo. Nome(Símbolo()) então acrescente-o.

s.w. Eu queria explicar mais sobre a inicialização, mas acho que isso também seria inútil
 
Valeriy Yastremskiy:

Pode haver um erro no índice de ordem / bilhete de acordo com o mágico 0. No momento de se referir à estrutura da ordem, os dados da ordem errada são armazenados ali. No ciclo de seleção pode ser que o próximo número seja colocado no último conjunto de pedidos, mas não aquele que você precisa. Os dados do último pedido selecionado são devolvidos a partir da estrutura do pedido.

Ainda não consegui entender por que esta falha está acontecendo. Finalmente, peguei o código responsável pela criação de um painel com botões e o reescrevi no EA onde este mesmo código está funcionando corretamente e tudo funcionou. De qualquer forma, obrigado!
 

Boa tarde!

Ajude-me a resolver um problema simples.

Contador de falhas. Eu quero contar as lacunas que são mais de 10 pontos.

int start()
{
int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);

A "lacuna" variável é reposta a zero. Eu não entendo por que. Eu já tentei de tudo. Já tentei loops e estática - não funciona. Suspeito que escrevi os loops de forma incorreta.

 
Alexey Belyakov:

Boa tarde!

Ajude-me a resolver um problema simples.

Contador de falhas. Eu quero contar as lacunas que são mais de 10 pontos.

A "lacuna" variável é reposta a zero. Eu não entendo por que. Eu já tentei de tudo. Já tentei loops e estática - não funciona. Suspeito que escrevi os loops de forma incorreta.

A lacuna variável está no escopo da função de início - e a cada novo tick é reinicializada com zero

 
Alexey Belyakov:

Boa tarde!

Ajude-me a resolver um problema simples.

Contador de falhas. Eu quero contar as lacunas que são mais de 10 pontos.

A "lacuna" variável é reposta a zero. Eu não entendo por que. Eu já tentei de tudo. Já tentei loops e estática - não funciona. Suspeito que escrevi os loops de forma incorreta.

int gap=0;
int start()
{
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap++;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
int start()
{
static int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
Razão: