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

 

Como se conectar aos servidores Meta Quotes para que a biblioteca dll possa enviar pedidos e trocar dados para que a linguagem c++, não mql4, esteja envolvida na implementação da EA o máximo possível?


É possível desenhar objetos no MT4 usando a biblioteca dll, o que pode ser aprendido sobre isso?

 
Mihail Matkovskij:

Mas por que com iBars(symbol, timeframe) a história se revela incompleta, enquanto com iBars(Symbol(), Period()) ela é bastante normal? E isso acontece somente quando o terminal é reiniciado, nem sempre. E o símbolo das variáveis, o período de tempo é inicializado corretamente, na seção de inicialização (eu mesmo verifiquei).

Tente apertar meu exemplo:https://c.mql5.com/3/324/Test.mq5

Seqüência de ações:

1. atire o arquivo compilado para o gráfico. As mensagens que você recebe quando faz isso:

2. Termine o terminal e inicie-o novamente. As mensagens no log serão as seguintes:

Resolvido.

Em vez deste código

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }

Eu escrevi o seguinte

public:  
  Loader(): symbol(NULL), timeframe(PERIOD_CURRENT) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe));
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); 
  }

Agora não há erros ao reiniciar o terminal. Mas o símbolo e o cronograma precisam ser inicializados apenas com valores vazios.

Aqui estão duas versões do código-fonte, com o bug e uma que funciona. Deixe-me lembrá-lo, a seqüência de testes é a seguinte:https://www.mql5.com/ru/forum/160683/page1189#comment_17047032

Arquivos anexados:
Bug.mq5  7 kb
Correct.mq5  6 kb
 
Seric29:

Como se conectar aos servidores Meta Quotes para que a biblioteca dll possa enviar pedidos e trocar dados para que a implementação do Expert Advisor envolva o máximo possível a linguagem C++ e não o mql4?

Não há como. O protocolo está fechado.

A biblioteca dll pode desenhar objetos no MT4? O que posso estudar sobre isso?

Não, você não pode.

 
Seric29:

Uau, eu vou checar. Sei que você pode inicializar variáveis com elementos de matriz com funções, mas não sabia que isso muda automaticamente, acho que também não há nada disso no c++, vou verificar mais tarde.

Eu cometi um erro (

Se você precisar recalcular o lote antes das operações comerciais, é melhor colocar a definição do lote no início do OnTick

ou (como eu o mudei) OnTimer

 

Olá! Por favor, ajude-me a emitir todos os valores, só posso emitir os últimos. E a segunda pergunta, como emitir esses valores com um deslocamento para a direita(definir qualquer deslocamento). Obrigado!

   for(int p = 0; p < 4; p++)
      for(int c = 0; c < 4; c++)
         for(int ps = 0; ps < 4; ps++)
            Comment(StringFormat("Выводим значения\nP = %G\nC = %G\nPS = %d", p, c, ps));
 

Onde posso ler sobre delimitadores na impressão? É mais ou menos delimitadores por vírgula, não consigo entender, é complicado.

Imprimir(a, b + "abc") ;

 
Koldun Zloy:

Negativo. O protocolo está fechado.

Você não pode.

O que significa que o protocolo está fechado. Há funções de abertura de ordem em mql4, é essencialmente apenas código. O mesmo se aplica aos objetos gráficos. Ouvi dizer que o mql4 é um produto comercial e por isso não há código fonte ou funções embutidas (por exemplo, Arrayresize/Range etc.). Por exemplo, não me sinto confortável em usar mql4 para escrever um programa, é uma linguagem muito morta, muito limitada. E quanto à linguagem Win API 32, ela não pode fazer nada em relação às minhas perguntas? Acho que tudo está fechado para Win API 32 também.

 
Seric29:

O que significa que o protocolo está fechado. Há funções de abertura de ordem em mql4, é essencialmente um código simples. O mesmo se aplica aos objetos gráficos. Ouvi dizer que o mql4 é um produto comercial e por isso não há código fonte ou funções embutidas (por exemplo, Arrayresize/Range etc.). Por exemplo, não me sinto confortável em usar mql4 para escrever um programa, é uma linguagem muito morta, muito limitada. E quanto à linguagem Win API 32, ela não pode fazer nada em relação às minhas perguntas? Provavelmente, tudo está trancado para Win API 32 também.

Seria melhor fazer um tópico separado, será mais animado)

 
MakarFX:

Eu cometi um erro(

Se você precisar recalcular o lote antes de fazer uma operação comercial, é melhor colocar a definição do lote no início do OnTick

ou (como eu o mudei) OnTimer

O que eu quero dizer é que você inicializou a variável "lote" com expressão, você não pode ter esta expressão preenchida automaticamente. Você pode até mesmo verificá-lo, pegar um contador simples, atribuir o valor do contador durante a inicialização e depois mudar o contador e o valor do lote não mudará, a menos que você mesmo o mude. Funciona em C++.

int Pomidor=9;
int Pomidor1(int q=Pomidor){return q;}//при инициализации
Вызов
Print(Pomidor());// результат будет автоматически равен Pomidor и это будет регулярная смена значений 

Mas não funciona em mql4, só funciona assim

int Pomidor1(int q=67){return q;}

Resultado 67.

 
Valeriy Yastremskiy:

Melhor fazer um tópico separado, será mais animado)

Eu também estava pensando, o tópico é relevante, mas é claro que não vale a pena entupir o fórum, talvez não seja interessante para muitas pessoas. Estou interessado, eu gosto de escrever código em C++.

Razão: