Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 577

 
Artyom Trishkin:
Bene, formerei tutto in una funzione, e la chiamerei quando ne ho bisogno - anche ad ogni tick (se è ragionevole e necessario), o all'apertura di una nuova candela - per esempio, una volta all'ora, se lavoriamo in H1.

Con la funzione, naturalmente, è comodo. Ho capito il codice. Ora è chiaro. Penserò, come portarlo a quegli scopi che voglio e capire, quando e in quale fase prendere i dati necessari.

 
Koldun Zloy:

Se fosse proprio "il massimo dell'imprudenza", sarebbe vietato.

WinAPI estende notevolmente le capacità di MQL. E si può fare qualcosa di stupido anche senza dll.

Ed ecco un esempio di passaggio di stringhe negli appunti:

Ben fatto, e anche con i commenti.

Grazie.

Ecco un'altra domanda.

Sarebbe possibile emulare un clic del mouse su determinate coordinate?

 
mila.com:

Grande, e anche con il commento.

Grazie.

Un'altra domanda.

È possibile fare un'emulazione di un clic del mouse alle coordinate date?

Se non dovete farlo da MQL, guardate AutoIT, potete fare qualsiasi cosa lì. Il prodotto è gratuito, avete solo bisogno di una DLL per interagire con MQL.
 
mila.com:

Grande, e anche con un commento.

Grazie.

Un'altra domanda.

È possibile fare un'emulazione di un clic del mouse alle coordinate date?

Sì, possiamo.

#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:
Bene, formerei tutto in una funzione e la chiamerei quando ho bisogno - ad ogni tick (se necessario e ragionevole) o all'apertura di una nuova candela - per esempio, una volta all'ora, se lavoriamo con H1.

Artem, ho capito bene, se abbiamo un ciclo:for(int i=0; i<copy_bars; i++) e c'è un ciclo for(int j=0; j<copy_bars; j++) dove if(j==i) continua; ,

vorrà dire che il conteggio è parallelo e se abbiamo circa 5 candele, il confronto continuerà:

1 con 1 - scartare.

1 con 2, 1 con 3, 1 con 4, 1 con 5.

Poi inizierà un ciclo dove sarà:

2 con 1, 2 con 3, 2 con 4, 2 con 5.

e così via.

È così che sarà?

 
Andrey Koldorkin:

Artem, ho capito bene che se abbiamo un ciclo:for(int i=0; i<copy_bars; i++) e c'è un ciclo for(int j=0; j<copy_bars; j++) dove if(j==i) continua; ,

vorrà dire che il conteggio è parallelo e se abbiamo circa 5 candele, il confronto continuerà:

1 con 1 - scartare.

1 con 2, 1 con 3, 1 con 4, 1 con 5.

Poi inizierà un ciclo dove sarà:

2 con 1, 2 con 3, 2 con 4, 2 con 5.

e così via.

Sarà lo stesso?

Sì.
 
Artyom Trishkin:
Sì.

Un'altra domanda: se non abbiamo bisogno di confrontare la candela corrente, allora non dobbiamo iniziare il conteggio da 1 e non da zero?

O dovremmo capire che qui 0 è la candela 1, 1 è la candela 2, ecc.

 
Andrey Koldorkin:

Un'altra domanda: se non abbiamo bisogno di confrontare la candela corrente, allora non dobbiamo iniziare il conteggio da 1 e non da zero?

o dovremmo capire che qui 0 è la candela 1, 1 è la candela 2, ecc.

Qui lo zero è l'inizio dell'array. E nell'array scriviamo le candele dalla prima a ..., non "a", ma nel numero che ci serve:

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

1 è il numero di candele da copiare e copy_bars è il numero di candele da copiare.

Pertanto, array[] contiene la candela necessaria nella cella con indice 0 - o 1 o 1+copy_bars-1. A seconda della direzione di indicizzazione di array[] (ArraySetAsSeries() imposta la direzione di indicizzazione, che può essere controllata usando ArrayGetAsSeries(), ArrayIsSeries())

 
Artyom Trishkin:

Qui lo zero è l'inizio dell'array. E nell'array scriviamo candele dalla prima alla ..., non "alla", ma in numero di candele di cui abbiamo bisogno:

1 è il numero di candele da copiare e copy_bars è il numero di candele da copiare.

Pertanto, array[] contiene la candela richiesta nella cella con indice 0 - o 1 o 1+copy_bars-1. A seconda della direzione di indicizzazione di array[] (ArraySetAsSeries() imposta la direzione di indicizzazione, che può essere controllata con ArrayGetAsSeries(), ArrayIsSeries())

Oh, questa programmazione. Più avanti nel bosco....

Per prima cosa ho controllato quello che mostra tramite Alert. Sembra essere viceversa, cioè la candela più vicina a quella attuale ha il numero massimo.

Poi l'ho controllato via:

bool series=ArrayIsSeries(dataCandle);

Allarme (serie);

e lo script mostra "falso".

Secondo la mia logica, se falso è all'estremità sbagliata, allora vero sarà all'estremità giusta.

Ho prescritto:

ArraySetAsSeries (dataCandle, true); //cambia direzione

bool series=ArrayIsSeries(dataCandle); //controlla di nuovo

Alert (series); //scrivere il risultato sullo schermo.

Ma ottengo ancora "falso" dopo questo.

Qual è il mio problema?

 
Andrey Koldorkin:

Oh, questa programmazione. Più avanti nel bosco....

Ho controllato prima solo attraverso Alert cosa dava. Risulta essere il contrario, cioè la candela più vicina alla candela attuale ha il numero massimo.

Poi l'ho controllato via:

bool series=ArrayIsSeries(dataCandle);

Allarme (serie);

e lo script mostra "falso".

Secondo la mia logica, se falso è all'estremità sbagliata, allora vero sarà all'estremità giusta.

Ho prescritto:

ArraySetAsSeries (dataCandle, true); //cambia direzione

bool series=ArrayIsSeries(dataCandle); //controlla di nuovo

Alert (series); //scrivere il risultato sullo schermo.

Ma ottengo ancora "falso" dopo questo.

Qual è il mio problema?

Il dataCandles è una struttura. L'array dove scriviamo le candele della storia - array[]. E dobbiamo renderla una serie temporale in modo che la sua indicizzazione coincida con l'indicizzazione delle candele sul grafico. Cioè la cella zero dell'array[] corrisponderà alle candele più vicine alla data corrente.

Cioè: 1. copiare le candele nell'array array[], 2. renderlo una serie temporale, poi leggere i valori da esso nella struttura.

Si può fare a meno di array[] - basta scrivere i dati direttamente dal grafico nella struttura, ma ho suggerito questo per compatibilità con Five - permette di copiare direttamente solo nell'indicatore usando high[i], low[i] e altri dati, ma nello script o Expert Advisor, dobbiamo prima copiare l'intervallo storico necessario nell'array, cosa che ho fatto.

Motivazione: