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

 
Artyom Trishkin:
Bem, eu formaria tudo isto numa função, e chamá-la-ia quando precisasse - mesmo a cada toque (se for razoável e necessário), ou à abertura de uma vela nova - por exemplo, uma vez por hora, se trabalharmos no H1.

Com a função, é claro, é útil. Já tenho o código definido. Agora está claro. Pensarei, como levá-lo a esses propósitos que quero e compreendo, quando e em que fase tomar os dados necessários.

 
Koldun Zloy:

Se fosse absolutamente "o cúmulo da imprudência", seria banido.

WinAPI alarga grandemente as capacidades da MQL. E pode fazer algo estúpido mesmo sem dll.

E aqui está um exemplo de corda passando para a prancheta:

Bem feito, e também com comentários.

Obrigado.

Aqui está outra questão.

Seria possível emular um clique do rato em determinadas coordenadas?

 
mila.com:

Óptimo, e também com comentários.

Obrigado.

Mais uma pergunta.

É possível fazer uma emulação de um clique do rato nas coordenadas dadas?

Se não tiver de o fazer a partir da MQL, olhe para AutoIT, pode fazer qualquer coisa lá. O produto é gratuito, só é necessário um DLL para interagir com o MQL.
 
mila.com:

Óptimo, e também com comentários.

Obrigado.

Mais uma pergunta.

É possível emular um clique do rato em determinadas coordenadas?

Sim, nós podemos.

#define  MK_LBUTTON     0x0001
#define  WM_LBUTTONDOWN 0x0201
#define  WM_LBUTTONUP   0x0202

struct POINT
{
   int x;
   int y;
};

#import "User32.dll"
   uint WindowFromPoint( int x, int y );
   uint PostMessageW( uint hWnd, uint Msg, uint wParam, uint lParam );
   int ScreenToClient( uint hWnd, POINT& lpPoint );
#import

int x = 1000;  // Экранные координаты
int y = 350;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uint hwnd = WindowFromPoint( x, y ); // Получаем дескриптор окна в нужном месте
   
   if( hwnd ){
      POINT point;
      point.x = x;
      point.y = y;
      ScreenToClient( hwnd, point );  // Преобразуем экранные координаты в координаты рабочей области окна
      
      uint lParam = (point.y * 65536) + (point.x & 0xFFFF);  // Упаковываем координаты в 32-разрядное целое
      
      PostMessageW( hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam ); // Посылаем сообщения от "мыши"
      PostMessageW( hwnd, WM_LBUTTONUP, MK_LBUTTON, lParam );
   }
}
 
Artyom Trishkin:
Bem, eu formaria tudo numa função e chamá-la-ia quando precisasse - a cada toque (se necessário e razoável) ou à abertura de uma vela nova - por exemplo, uma vez por hora, se trabalharmos com H1.

Artem, entendo correctamente, se tivermos um laço:for(int i=0; i<copy_bars; i++) e houver um laço para(int j=0; j<copy_bars; j++) onde if(j===i) continua; ,

significará que a contagem é paralela e se tivermos cerca de 5 candelabros, a comparação continuará:

1 com 1 - descarte.

1 com 2, 1 com 3, 1 com 4, 1 com 5.

Então, um ciclo começará onde estará:

2 com 1, 2 com 3, 2 com 4, 2 com 5.

e assim por diante.

Será assim que vai ser?

 
Andrey Koldorkin:

Artem, entendo correctamente, que se tivermos um laço:for(int i=0; i<copy_bars; i++) e houver um laço para(int j=0; j<copy_bars; j++) onde if(j===i) continue; ,

significará que a contagem é paralela e se tivermos cerca de 5 candelabros, a comparação continuará:

1 com 1 - descarte.

1 com 2, 1 com 3, 1 com 4, 1 com 5.

Então, um ciclo começará onde estará:

2 com 1, 2 com 3, 2 com 4, 2 com 5.

e assim por diante.

Será o mesmo?

Sim.
 
Artyom Trishkin:
Sim.

Outra questão: se não precisamos de comparar a vela actual, então não precisamos de começar a contagem a partir de 1 e não de zero?

Ou devemos entender que aqui 0 é vela 1, 1 é vela 2, etc.?

 
Andrey Koldorkin:

Outra questão: se não precisamos de comparar a vela actual, então não precisamos de começar a contagem a partir de 1 e não de zero?

ou devemos entender que aqui 0 é vela 1, 1 é vela 2, etc.?

Aqui o zero é o início da matriz. E na matriz escrevemos os castiçais desde o primeiro até ..., não "até", mas no número que precisamos:

int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);

1 é o número de castiçais a copiar, e copy_bars é o número de candelabros a copiar.

Portanto, array[] contém o castiçal necessário na célula com índice 0 - 1 ou 1+copy_bars-1. Dependendo da direcção de indexação do array[] (ArraySetAsSeries() define a direcção de indexação, que pode ser verificada usando ArrayGetAsSeries(), ArrayIsSeries())

 
Artyom Trishkin:

Aqui o zero é o início da matriz. E na matriz escrevemos castiçais de primeiro a ..., não "até", mas em número de castiçais de que precisamos:

1 é o número de castiçais a copiar, e copy_bars é o número de candelabros a copiar.

Portanto, array[] contém a vela necessária na célula com índice 0 - 1 ou 1+copy_bars-1. Dependendo da direcção de indexação do array[] (ArraySetAsSeries() define a direcção de indexação, que pode ser verificada com ArrayGetAsSeries(), ArrayIsSeries())

Esta programação. Mais para dentro da floresta....

Primeiro acabei de verificar o que mostra através de Alert. Parece ser vice-versa, ou seja, a vela mais próxima da actual tem o número máximo.

Depois verifiquei-o via:

série bool=ArrayIsSeries(dataCandle);

Alerta (série);

e o guião mostra "falso".

Pela minha lógica, se o falso está no lado errado, então o verdadeiro estará no lado certo.

Eu prescrevi:

ArraySetAsSeries (dataCandle, true); // mudar de direcção

bool series=ArrayIsSeries(dataCandle); //check again

Alerta (série); //escrever o resultado no ecrã.

Mas ainda fico "falso" depois disso.

Qual é o meu problema?

 
Andrey Koldorkin:

Oh, esta programação. Mais para dentro da floresta....

Verifiquei pela primeira vez apenas através de Alerta o que estava a dar. Acontece o contrário, ou seja, a vela mais próxima da vela actual tem o número máximo.

Depois verifiquei-o via:

série bool=ArrayIsSeries(dataCandle);

Alerta (série);

e o guião mostra "falso".

Pela minha lógica, se o falso está no lado errado, então o verdadeiro estará no lado certo.

Eu prescrevi:

ArraySetAsSeries (dataCandle, true); // mudar de direcção

bool series=ArrayIsSeries(dataCandle); //check again

Alerta (série); //escrever o resultado no ecrã.

Mas ainda fico "falso" depois disso.

Qual é o meu problema?

O DataCandles é uma estrutura. A matriz onde escrevemos as velas da história - matriz[]. E precisamos de a fazer como uma série cronológica para que a sua indexação coincida com a indexação de castiçais no gráfico. Ou seja, a célula zero da matriz[] corresponderá aos castiçais mais próximos da data actual.

Isto é, 1. copiar castiçais em array[], 2. fazer uma série cronológica, depois ler valores a partir dela para a estrutura.

Pode fazer sem array[] - basta escrever dados directamente do gráfico na estrutura, mas eu sugeri isto para compatibilidade com Cinco - permite copiar directamente apenas no indicador usando alto[i], baixo[i] e outros dados, mas no script ou Expert Advisor, temos primeiro de copiar o intervalo de história necessário para o array, o que eu fiz.