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

 
neverness:

Eu lhe disse diretamente que você não deveria ensinar os outros quando você não tem idéia de si mesmo.

A ajuda deve ser "qualificada", não "da rua"!

Descrever novamente o problema, o que é necessário.

 
Vitaly Muzichenko:

Re-descreva a tarefa novamente, o que exatamente é necessário.

Estou interessado em poder transferir dados em MT4/MT5 entre diferentes módulos.

Por exemplo:

Como transferir dados de um indicador para outro ?

Como transferir dados de um indicador para um script ?

Como transferir dados do indicador para o Expert Advisor? etc. ... e assim por diante.

A simples adição de dados transferidos a um arquivo separado e a leitura desses dados do arquivo em outros módulos é bastante óbvia e comum para transferi-los.

Mas neste caso há um problema de sincronização dos dados transferidos/leidos.

Intuitivamente, suponho que o terminal MT4/MT5 deve ter uma certa área de memória buffer compartilhada e deve haver procedimentos que regulem o intercâmbio de dados através desta área.

Mas eu não encontrei nada parecido na descrição.

 
neverness:

Estou interessado no procedimento de transferência MT4/MT5 entre diferentes módulos.

Por exemplo:

Como transferir dados de um indicador para outro ?

Como transferir dados de um indicador para um script?

Como transferir dados do indicador para o Expert Advisor ? etc. ... e assim por diante.

A simples adição de dados transferidos a um arquivo separado e a leitura desses dados do arquivo em outros módulos é bastante óbvia e comum para transferi-los.

Mas neste caso há um problema de sincronização dos dados transferidos/leidos.

Intuitivamente, suponho que o terminal MT4/MT5 deve ter uma certa área de memória buffer compartilhada e deve haver alguns procedimentos que regulam o intercâmbio de dados através desta área.

Mas não encontrei nada de tal espécie na descrição.

Bem, a transferência de dados pode ser realizada através de um arquivo ou de uma variável global do terminal.

Se for uma variável global:

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

Esta é a maneira mais fácil de trocar entre todos os programas em um único terminal

 
Vitaly Muzichenko:

Bem, a transferência de dados como previamente escrita pode ser via arquivo, ou uma variável global do terminal

Se uma variável global:

Esta é a maneira mais fácil de trocar entre todos os programas em um único terminal

Ok. Vamos escrever em indicador uma expressão:

GlobalVariableSet("Sname", 123,25); Este evento ocorre, por exemplo, onTick().

Mas os scripts não funcionam com matrizes de dados, e não têm evento OnTick(). Como o roteiro sabe que o evento OnTick() ocorreu e deve aplicar o procedimento para obter novos dados

GlobalVariableGet("Sname");

Você pode usar o evento OnTimer() em vez do OnTick(). Mas o roteiro tem seu próprio OnTimer(), enquanto o indicador tem seu próprio e eles não estão inter-relacionados.

Aqui está o problema:

Como garantir que aGlobalVariableSet("Sname", 123,25); e a GlobalVariableGet("Sname"); os eventos sejam síncronos?

Ou existe um procedimento que monitora a mudança do valor "Sname"? Como a OnChange.

Ou seja, como o roteiro sabe que o indicador mudou o valor de "Sname", e este valor tornou-se 125,35 ?

Onde está a ponte entreGlobalVariableSet("Sname", 123,25); e GlobalVariableGet("Sname"); ?

Eles estão em diferentes programas.


 
neverness:

OK. Vamos escrever uma expressão no indicador:

GlobalVariableSet("Sname", 123,25); Este evento ocorre, por exemplo, quando OnTick().

Mas os scripts não funcionam com matrizes de dados, e não têm evento OnTick(). Como o roteiro sabe que o evento OnTick() ocorreu e deve aplicar o procedimento para obter novos dados

GlobalVariableGet("Sname");

Você pode usar o evento OnTimer() em vez do OnTick(). Mas o roteiro tem seu próprio OnTimer(), enquanto o indicador tem seu próprio e eles não estão relacionados entre si.

Aqui está o problema:

Como garantir que aGlobalVariableSet("Sname", 123,25); e a GlobalVariableGet("Sname"); os eventos sejam síncronos?

Ou existe um procedimento que monitora a mudança do valor "Sname"? Como a OnChange.

Ou seja, como o roteiro sabe que o indicador mudou o valor de "Sname", e este valor tornou-se 125,35 ?

Onde está a ponte entreGlobalVariableSet("Sname", 123,25); e GlobalVariableGet("Sname"); ?

Eles estão em diferentes programas.

O link de conexão é um disco rígido de computador. Registro Eu acho que o problema não é, e você pode obtê-lo em qualquer caso, mesmo no script, não difere de como você obtém o valor atual ASK e BID


P.S. Eu anexei um indicador e roteiro, por exemplo, no indicador registramos os volumes de tick

Indicador

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Roteiro

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
Arquivos anexados:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

O link de conexão é o disco rígido do computador. Eu acho que não será um problema escrevê-lo, mas você pode obtê-lo de qualquer evento, mesmo em um script, não é diferente de como você obtém os valores ASK e BID atuais

Legal!

E como fazer isso?

Dê-me um exemplo.

Por exemplo, como simular um caso desse tipo.

O indicador recebe dados, calcula a variância dos dados e prepara as coordenadas do ponto da elipse para o script (4 variáveis globais Q1, Q2, T1, T2 a serem passadas para o script).

Agora o indicador deve dar um comando ao roteiro que irá desenhar uma elipse usando estas variáveis globais.

Como o indicador pode fazer isso?

 
Vitaly Muzichenko:

O link de conexão é o disco rígido do computador. Acho que não será um problema gravar, mas você pode obtê-lo de qualquer evento, mesmo no script, não difere de como você obtém os valores atuais de ASK e BID


P.S. Eu anexei um indicador e roteiro, por exemplo, no indicador registramos os volumes de tick

Indicador

O roteiro

Em seu exemplo, o roteiro funciona apenas uma vez - no início, ou seja, quando o evento OnStart() ocorre.

E então como?

Onde está a sincronização?

Como você faz o roteiro funcionar sincronizado com o indicador?

Por exemplo, como habilitar o roteiro sempre que os volumes excederem um determinado valor?

 
neverness:

Portanto, em seu exemplo, o roteiro funciona apenas uma vez - na inicialização, ou seja, quando ocorre o evento OnStart().

E então como?

Onde está a sincronização?

Como você faz o roteiro funcionar sincronizado com o indicador?

Por exemplo, como habilitar o roteiro sempre que os volumes excederem um determinado valor?

É sua tarefa como trabalhar com o roteiro. Talvez seja mais fácil criar um Expert Advisor do que um roteiro?

Um indicador que dá valores:

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(time,true);
  ArraySetAsSeries(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Um exemplo simples de um roteiro em loop:

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.S. Corrigido o código.

 
Vitaly Muzichenko:

Depende de você como trabalhar com o roteiro. Não seria mais fácil para você criar uma EA em vez de um roteiro?

Um indicador que dá valores:


Um exemplo simples de um roteiro em loop:

Entendi que na MQL não há possibilidade de sincronizar diferentes módulos.

Ok. Então aqui vai uma pergunta. E se eu colocar o botão no campo e alimentar o script com esse botão?

Existe tal possibilidade na MQL? Ou também não existe tal possibilidade?

Afinal de contas, o roteiro deve ser lançado de alguma forma!

 
neverness:

Entendo que na MQL não há possibilidade de sincronizar diferentes módulos.

Ok. Então aqui vai uma pergunta. E se eu colocar o botão no campo e colocar o roteiro neste botão?

Existe tal possibilidade na MQL? Ou também não existe tal possibilidade?

O roteiro deve ser lançado de alguma forma!

O tema é antigo, mas ainda lido, ou talvez alguém sugira algo novo. Não executo roteiros e não trabalho com eles de forma alguma)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...