Erros, bugs, perguntas - página 2634

 

Olá!

Quero executar algum MT4 com um ficheiro de lote.

Pode dizer-me como fazer isto e porque é que o meu código não funciona?

SET MY_PATH=C:\"Program Files (x86)"
%MY_PATH%\001\terminal.exe
TIMEOUT /T 160
%MY_PATH%\002\terminal.exe
TIMEOUT /T 160
%MY_PATH%\003\terminal.exe
TIMEOUT /T 160
%MY_PATH%\004\terminal.exe
TIMEOUT /T 160
%MY_PATH%\005\terminal.exe
TIMEOUT /T 160
%MY_PATH%\006\terminal.exe
TIMEOUT /T 160
%MY_PATH%\007\terminal.exe
TIMEOUT /T 160
%MY_PATH%\008\terminal.exe
TIMEOUT /T 160
%MY_PATH%\009\terminal.exe
TIMEOUT /T 160
%MY_PATH%\010\terminal.exe
TIMEOUT /T 160
%MY_PATH%\011\terminal.exe
TIMEOUT /T 160
%MY_PATH%\012\terminal.exe
TIMEOUT /T 160

Na melhor das hipóteses, corre alguns MT4 e depois pendura.

É claro que não há falta de RAM.

Além disso, já experimentei em diferentes computadores

 
Igor Zakharov:

não, não tem.

a hora do servidor, a propósito, não pára no sábado. aqui é o contrário: no terminal, a hora do servidor é actualizada com a chegada de uma nova citação. Por exemplo, tem apenas um símbolo aberto na visão geral do mercado (não só no testador, mas também na realidade). e não há ticks durante cinco segundos - todo este tempo o temporizador do servidor não se moverá. isto é verdade para sábado: o tempo do servidor está a correr, mas o terminal não o sabe, porque não há ticks. o testador simplesmente falhará este período.

Já verifiquei. No testador, oTimeLocal trabalha aos fins-de-semana, oTimeTradeServer também trabalha, mas oTimeCurrent, claro, não. Não há carrapatos, mas o tempo do servidor ainda está lá.

int OnInit()
{
  Print(__FUNCTION__," TimeCurrent     ",TimeCurrent());
  Print(__FUNCTION__," TimeLocal       ",TimeLocal());
  Print(__FUNCTION__," TimeTradeServer ",TimeTradeServer());

    EventSetTimer(3*3600);
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTimer()
{
  Print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
  Print(__FUNCTION__," TimeCurrent     ",TimeCurrent());
  Print(__FUNCTION__," TimeLocal       ",TimeLocal());
  Print(__FUNCTION__," TimeTradeServer ",TimeTradeServer());
}
 
Igor Zakharov:

https://www.mql5.com/ru/forum/328008/page2#comment_14166682

Como sempre, as bicicletas.

A questão aqui é porque é que não passa.
Afinal de contas, as variáveis dos parâmetros, têm valores iniciais.

void MxResize(int row=1, int col=1)
{
   int A[row][col];    
      
}

E se especificar o tamanho das medidas em números

void MxSize(int row=1, int col=1)
{
   int A[1][1];    
      
}

O compilador salta, qual é o truque?

Comentaria o promotor sobre isto?

 
Andrey Khatimlianskii:

Com que objectivo? Para fazer uma auto-optimização no fim-de-semana? Em seguida, a definição de um temporizador da OnTick a uma distância de alguns minutos funcionaria. Se funcionar, então as carraças pararam e é possível optimizar.

Se, para outros fins, formulá-los.

Não, não para outros fins.

Não pensei que o TimeLocal trabalhasse nos fins-de-semana, por isso fiz isto: adicionei algumas horas ao TimeCurrent e verifiquei o dia da semana. Se é sábado, então comece a optimizar.

Claro que não posso ter a certeza sobre o início do sábado, porque o mercado fecha de forma diferente na sexta-feira ou nos feriados.

Além disso, não encontrei em lado nenhum um meio para determinar se o mercado está fechado ou não.

 
Petros Shatakhtsyan:

Não, não para qualquer outro fim.

Não pensei que o TimeLocal trabalhasse aos fins-de-semana, por isso fiz isto: adicionei algumas horas ao TimeCurrent e verifiquei o dia da semana. Se é sábado, então comece a optimizar.

Claro que não posso ter a certeza sobre o início do sábado, porque o mercado fecha de forma diferente na sexta-feira ou nos feriados.

Além disso, não encontrei em lado nenhum um meio para determinar se o mercado está fechado ou não.

Já tentou ?

SymbolInfoSessionTrade

ou

SymbolInfoInteger(SYMBOL_TRADE_MODE)

Algo deles deve ser bom

 
Aleksey Mavrin:

Já o experimentou?

SymbolInfoSessionTrade

ou

SymbolInfoInteger(SYMBOL_TRADE_MODE)

Um deles deve ser bom, lembro-me.

Não, não o fiz. O manual não especifica como determinar se o mercado é aberto ou não.

O problema é que quando o mercado "abre" na segunda-feira, por exemplo num corretor, as cotações começam a chegar às 02:05, mas as transacções não são aceites durante alguns minutos e exibe "Mercado fechado".

Não sei se isto vai ajudar ou não.

SYMBOL_START_TIME

Data de início do instrumento (normalmente utilizado para futuros)

 
Petros Shatakhtsyan:

Não, não o fiz. O guia não diz especificamente como determinar se o mercado está aberto ou não.

O problema é que quando o mercado "abre" na segunda-feira, por exemplo num corretor, as cotações começam a chegar às 02h.05, mas nenhum negócio é aceite por mais alguns minutos, dá "Mercado fechado".

Não sei se isto vai ajudar ou não.

SYMBOL_START_TIME

Este é o símbolo_start_time (normalmente utilizado para futuros)

OSymbolInfoSessionTrade mostra quando o comércio começa eSymbolInfoSessionQuote quando as cotações chegam.

ap: isto deve ajudar.

boolIsTradeAllowed(
símbolo const string// símbolo
datahora_tempo testado// hora
);

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

Como sempre, as bicicletas.

A questão aqui é porque é que uma tal entrada não é aprovada.
Depois de todas as variáveis dos parâmetros terem valores iniciais.

E se especificar o tamanho das medidas em números

então o compilador salta-a, qual é o senão?

Será que o promotor comentará esta questão?

Roman, esta é a segunda vez que cai por uma falta de vontade elementar de ler a documentação.

Apenas umnúmero inteiro pode ser um índice de matriz. Não são permitidas mais do que arrays tetradimensionais. A numeração dos elementos da matriz começa com 0. O último elemento de um array unidimensional é numerado 1 menos do que o tamanho do array, ou seja, aceder ao último elemento de um array de 50 inteiros parecerá um[49]. O mesmo acontece com as matrizes multidimensionais, sendo uma dimensão indexada de 0 a dimensão tamanho 1. O último elemento da matriz bidimensional no exemplo pareceria m[6][49].

As matrizes estáticas não podem ser representadas como séries temporais, ou seja, a função ArraySetAsSeries() que define o acesso aos elementos da matriz desde o fim de uma matriz até ao seu início não é aplicável a elas. Se quiser dar acesso a uma matriz como nas séries cronológicas, utilize um objecto de matriz dinâmica.

Se aceder fora da matriz, o subsistema de execução irá gerar um erro crítico e a execução do programa irá parar.

E na documentação mql4, se a memória me serve correctamente, foi claramente afirmado que as variáveis não devem ser utilizadas como um tamanho de matriz.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов...
 
Roman:

Como sempre, as bicicletas.

A questão aqui é porque é que uma tal entrada não funciona.
Afinal, as variáveis dos parâmetros, têm valores iniciais.

E se especificar o tamanho das medidas em números

Então o compilador salta, qual é o truque?

Será que o criador comentará a questão?

Não sou um programador, mas vou comentar.

Para uma matriz estática, o compilador tem de atribuir um certo número de bytes na memória já em tempo de compilação.

Quanta memória tem de ser atribuída pelo compilador se não soubermos linha e col no momento da compilação?

Os valores iniciais só são utilizados se os parâmetros forem omitidos ao chamar. Os parâmetros reais só são conhecidos em tempo de execução.

Assim, sem truques, aprenda a língua.

 
Aleksey Mavrin:

Não, não é isso,SymbolInfoSessionTrade mostra quando há negociação eSymbolInfoSessionQuote quando as cotações entram.

ap: isto deve ajudar.

boolIsTradeAllowed(
símbolo const string// símbolo
datahora_tempo testado// hora
);

Não me parece que o faça. Há um tópico especial aqui :https://www.mql5.com/ru/forum/40295

Não o examinou até ao fim, especialmente porque é para a MQL4.

Não creio que o servidor deva enviar cotações simbólicas se o mercado estiver fechado.

O meu robô não é realmente afectado por isto porque depois de o mercado "abrir" quando os carrapatos entram nele, analisa a tendência, as suas inversões, e isso leva algum tempo. Durante este tempo, o mercado abre-se.

Mas atrapalha-se se quisermos executar manualmente algumas transacções durante este tempo. Se a execução for baseada no mercado, o pedido está pendente até que o mercado abra e é naturalmente executado ao preço actual.

A função directa que recebe o nome do símbolo e retorna verdadeiro/falso (mercado aberto/fechado) está claramente em falta.

Как правильно выяснить, что рынок закрыт? (mql4)
Как правильно выяснить, что рынок закрыт? (mql4)
  • 2015.01.31
  • www.mql5.com
Перевел советника в режим работы OnTimer() теперь когда рынок закрыт он этого не понимает и пытается торговать, в общем обращается к серверу и естественно получает ошибки и забивает логи журнала.