Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1446

 
Alexey Viktorov #:

1. Se a alça da base não for recebida, a base não precisará ser fechada.

2. Se INVALID_HANDLE for recebido, por que continuar a execução do programa? Acho que, nesse caso, é melhor interromper e retornar

Agora estou tentando abrir e fechar repetidamente um banco de dados inexistente e não consigo obter a impressão do erro. Acho que essa impressão ocorre no momento da criação de consultas à base, que não pôde ser aberta.

Vou criar um Expert Advisor de teste mínimo que atualizará o registro no banco de dados a cada segundo. Vamos executá-lo em 10 pares e tudo ficará claro. Vou postá-lo aqui...
 
Evgeny Dyuka #:
Criarei um Expert Advisor de teste mínimo que atualizará o registro no banco de dados a cada segundo. Execute-o em 10 pares e tudo ficará claro. Vou postá-lo aqui.

Interessante. Estarei aguardando...

 
Alexey Viktorov #:

Interessante. Estarei esperando...

Aqui está um especialista. Ele cria uma base (se ela ainda não existir) e grava a hora atual nela uma vez por segundo.
Não há Print() no código.
Executei-o em 10 pares e ele apresentou erros:

CS      2       11:44:36.561    Test_DB (EURUSD,M10)    database error, database is locked
CS      2       11:55:27.018    Test_DB (BTCUSD,M10)    database error, database is locked
CS      2       11:55:28.026    Test_DB (BTCUSD,M10)    database error, database is locked
CS      2       11:55:49.177    Test_DB (TRXUSD,M10)    database error, database is locked
CS      2       11:55:51.183    Test_DB (EURUSD,M10)    database error, database is locked
CS      2       11:55:53.182    Test_DB (TRXUSD,M10)    database error, database is locked

Para obter um erro, você precisa fechar e reiniciar o MT5 e, em seguida, todos os EAs começam a funcionar de forma síncrona.

Seria bom:
1. Entender como se livrar desse erro.
2. Inventar um mecanismo de modelo que fizesse fila no caso de a base não estar disponível.

Resolvi o ponto 2 adicionando Sleep() com tempo aleatório, mas parece uma muleta.

ATUALIZAÇÃO: Fiznovo upload do arquivo, pois o primeiro apresentou um erro.

Arquivos anexados:
Test_DB_1.mq5  3 kb
 
Evgeny Dyuka #:

Aqui está um especialista. Ele cria uma base (se ela ainda não existir) e grava a hora atual nela uma vez por segundo.
Não há Print() no código.
Executei-o em 10 pares e ocorreram erros:

Para obter um erro, você deve fechar e reiniciar o MT5 para que todos os Expert Advisors comecem a funcionar de forma sincronizada.

Seria bom:
1. Entender como se livrar desse erro.
2. Inventar um mecanismo de modelo que faça fila em caso de indisponibilidade da base.

Resolvi o ponto 2 adicionando Sleep() com tempo aleatório, mas parece uma muleta.

ATUALIZAÇÃO: Fiznovo upload do arquivo, pois o primeiro apresentou um erro.

Infelizmente, meu conhecimento não é suficiente. Apenas o suficiente para perceber que um erro está sendo impresso

      DatabaseExecute(db, sql);

Não há possibilidade de verificar a disponibilidade antes de criar uma consulta.

O banco de dados é aberto, mas não é possível criar uma consulta.

 
Não há ordens abertas no servidor, não há stops e takes, os modos de algo estão ativados e o comando de configuração é aprovado, mas os registros são silenciosos na classeCTrade. No testador, funciona em silêncio de negociação real. O que verificar?
 
mwwm CTrade. No testador, funciona em silêncio de negociação real. O que verificar?

Registro do terminal

 
Vladimir Deryagin #:

registro do terminal

Acho que liguei os registros, mas não consigo calcular o lote. Não entendo por que ele não quer calcular em tempo real?

void OpenBuy(const int index,double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);
   double long_lot=0.0;
   if(InpLotOrRisk==risk)
     {
      long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,", OK: ","sl=",DoubleToString(sl,m_symbol.Digits()),
               ", CheckOpenLong: ",DoubleToString(long_lot,2),
               ", Balance: ",    DoubleToString(m_account.Balance(),2),
               ", Equity: ",     DoubleToString(m_account.Equity(),2),
               ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
      if(long_lot==0.0)
        {
         ArrayRemove(SPosition,index,1);
         if(InpPrintLog)
            Print(__FILE__," ",__FUNCTION__,", ERROR: ","CMoneyFixedMargin.CheckOpenLong returned the value of 0.0");
         return;
        }
     }
 
mwwm #:

Suponho que liguei os registros, mas ele não consegue calcular o lote. Não entendo por que ele não quer calcular o real?

Não há registros, portanto, pode haver muitas vezes mais suposições.

Como opção, ao negociar cruzamentos, se na visão geral do mercado não for selecionado o par com a moeda do depósito, não haverá negociação.

Por exemplo, negociamos EURJPY, depositamos a moeda USD, na visão geral do mercado devem estar presentes EURUSD e USDJPY.

 
Aleksandr Slavskii #:

Não há registros, portanto, pode haver muitas vezes mais suposições.

Como opção, ao negociar cruzamentos, se o par com a moeda de depósito não estiver selecionado na visão geral do mercado, não será negociado.

Por exemplo, negociamos EURJPY, moeda de depósito USD, e na visão geral do mercado devem estar presentes EURUSD e USDJPY.

Conta em USD por centavo, negociando XAUUSD

 

Olá a todos. Não consigo desenhar uma seta na primeira barra usando buffers na MQL5.

Em MQL4, faço o seguinte:

Declaro uma variável global double XX[];

escrevo em init:

SetIndexBuffer(0,XX);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,108);

Em Oncalculate, escrevo:

XX[1]=High[1]; obtenho uma seta desenhada sobre o castiçal 1. e é isso

Faço o mesmo em MQL5:

Declarouma variável global double XX[];

escrevo em init:

SetIndexBuffer(0,XX,INDICATOR_DATA);

PlotIndexSetInteger(0,PLOT_ARROW,108);

Em Oncalculate, escrevo:

XX[1]=high[1]; - não desenha

XX[1]=iHigh(Symbol(),PERIOD_CURRENT,1); - também não desenha.

É claro que até mesmo no cabeçalho está especificado:

#property indicator_buffers 1

#property indicator_plots 1

#property indicator_type1 DRAW_ARROW

#property indicator_color1 clrGreen

#property indicator_width1 1

O que estou fazendo de errado, por favor, me diga !!!!

Razão: