Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 577

 
Artyom Trishkin:
Nun, ich würde das alles in eine Funktion packen und sie aufrufen, wenn ich sie brauche - sogar bei jedem Tick (wenn es sinnvoll und notwendig ist), oder bei der Eröffnung einer neuen Kerze - zum Beispiel einmal pro Stunde, wenn wir auf H1 arbeiten.

Mit der Funktion ist es natürlich praktisch. Ich habe den Code herausgefunden. Jetzt ist es klar. Ich werde darüber nachdenken, wie ich es zu den von mir gewünschten Zwecken einsetzen kann, und ich werde verstehen, wann und in welchem Stadium ich die erforderlichen Daten erheben muss.

 
Koldun Zloy:

Wäre es "der Gipfel der Unvernunft", würde es verboten werden.

WinAPI erweitert die Möglichkeiten von MQL erheblich. Und man kann auch ohne dll etwas Dummes tun.

Und hier ist ein Beispiel für die Übergabe einer Zeichenkette an die Zwischenablage:

Gut gemacht, und auch mit Kommentaren.

Ich danke Ihnen.

Hier eine weitere Frage.

Wäre es möglich, einen Mausklick an bestimmten Koordinaten zu emulieren?

 
mila.com:

Großartig, und auch noch mit Kommentar.

Ich danke Ihnen.

Eine weitere Frage.

Ist es möglich, eine Emulation eines Mausklicks an den angegebenen Koordinaten zu erstellen?

Wenn Sie es nicht mit MQL machen müssen, schauen Sie sich AutoIT an, dort können Sie alles machen. Das Produkt ist kostenlos, Sie benötigen nur eine DLL, um mit MQL zu interagieren.
 
mila.com:

Großartig, und auch noch mit einem Kommentar.

Ich danke Ihnen.

Eine weitere Frage.

Ist es möglich, eine Emulation eines Mausklicks an den angegebenen Koordinaten zu erstellen?

Ja, das können wir.

#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:
Nun, ich würde das alles in eine Funktion packen und sie bei Bedarf aufrufen - bei jedem Tick (wenn nötig und sinnvoll) oder bei Eröffnung einer neuen Kerze - zum Beispiel einmal pro Stunde, wenn wir mit H1 arbeiten.

Artem, wenn ich es richtig verstehe, haben wir eine Schleife:for(int i=0; i<copy_bars; i++) und es gibt eine Schleife for(int j=0; j<copy_bars; j++), wo if(j==i) continue; ,

bedeutet dies, dass die Zählung parallel ist, und wenn wir ungefähr 5 Kerzen haben, wird der Vergleich fortgesetzt:

1 mit 1 - verwerfen.

1 mit 2, 1 mit 3, 1 mit 4, 1 mit 5.

Dann wird ein Zyklus beginnen, wo es sein wird:

2 mit 1, 2 mit 3, 2 mit 4, 2 mit 5.

und so weiter.

Wird es dasselbe sein?

 
Andrey Koldorkin:

Artem, wenn ich es richtig verstehe, haben wir eine Schleife:for(int i=0; i<copy_bars; i++) und es gibt eine Schleife for(int j=0; j<copy_bars; j++), wo if(j==i) continue; ,

bedeutet dies, dass die Zählung parallel ist, und wenn wir ungefähr 5 Kerzen haben, wird der Vergleich fortgesetzt:

1 mit 1 - verwerfen.

1 mit 2, 1 mit 3, 1 mit 4, 1 mit 5.

Dann wird ein Zyklus beginnen, wo es sein wird:

2 mit 1, 2 mit 3, 2 mit 4, 2 mit 5.

und so weiter.

Wird es dasselbe sein?

Ja.
 
Artyom Trishkin:
Ja.

Eine weitere Frage: Wenn wir die aktuelle Kerze nicht vergleichen müssen, müssen wir dann nicht mit der Zählung bei 1 und nicht bei Null beginnen?

Oder sollten wir davon ausgehen, dass 0 die Kerze 1 ist, 1 die Kerze 2 usw.?

 
Andrey Koldorkin:

Eine weitere Frage: Wenn wir die aktuelle Kerze nicht vergleichen müssen, müssen wir dann nicht mit der Zählung bei 1 und nicht bei Null beginnen?

oder ist hier 0 gleich Kerze 1, 1 gleich Kerze 2 usw. zu verstehen?

Hier ist Null der Anfang des Arrays. Und in das Array schreiben wir die Kerzenständer von der ersten bis ..., nicht "bis", sondern in der Anzahl, die wir brauchen:

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

1 ist die Anzahl der zu kopierenden Candlesticks, und copy_bars ist die Anzahl der zu kopierenden Candlesticks.

Daher enthält array[] den benötigten Candlestick in der Zelle mit dem Index 0 - entweder 1 oder 1+copy_bars-1. Abhängig von der Indizierungsrichtung von array[] (ArraySetAsSeries() setzt die Indizierungsrichtung, die mit ArrayGetAsSeries(), ArrayIsSeries() überprüft werden kann)

 
Artyom Trishkin:

Hier ist Null der Anfang des Arrays. Und in das Array schreiben wir Kerzenständer von zuerst bis ..., nicht "bis", sondern in der Anzahl der benötigten Kerzenständer:

1 ist die Anzahl der zu kopierenden Candlesticks, und copy_bars ist die Anzahl der zu kopierenden Candlesticks.

Daher enthält array[] die gewünschte Kerze in der Zelle mit dem Index 0 - entweder 1 oder 1+copy_bars-1. Abhängig von der Indizierungsrichtung von array[] (ArraySetAsSeries() setzt die Indizierungsrichtung, die mit ArrayGetAsSeries(), ArrayIsSeries() überprüft werden kann)

Diese Programmierung. Je weiter man in den Wald....

Ich habe zunächst nur überprüft, was über Alert angezeigt wird. Es scheint umgekehrt zu sein, d.h. die Kerze, die der aktuellen am nächsten ist, hat die maximale Anzahl.

Dann habe ich es über geprüft:

bool series=ArrayIsSeries(dataCandle);

Alert (Serie);

und das Skript zeigt "falsch" an.

Nach meiner Logik ist false am falschen Ende, während true am richtigen Ende steht.

Ich verschrieb:

ArraySetAsSeries (dataCandle, true); //Richtung ändern

bool series=ArrayIsSeries(dataCandle); //erneut prüfen

Alert (series); //Schreiben Sie das Ergebnis auf den Bildschirm.

Aber danach bekomme ich immer noch "falsch".

Was ist mein Problem?

 
Andrey Koldorkin:

Oh, diese Programmierung. Je weiter man in den Wald....

Ich habe zuerst nur durch Alert geprüft, was es ausgibt. Es stellt sich heraus, dass das Gegenteil der Fall ist, d.h. die Kerze, die der aktuellen Kerze am nächsten ist, hat die höchste Anzahl.

Dann habe ich es über geprüft:

bool series=ArrayIsSeries(dataCandle);

Alert (Serie);

und das Skript zeigt "falsch" an.

Nach meiner Logik ist false am falschen Ende, während true am richtigen Ende steht.

Ich verschrieb:

ArraySetAsSeries (dataCandle, true); //Richtung ändern

bool series=ArrayIsSeries(dataCandle); //erneut prüfen

Alert (series); //Schreiben Sie das Ergebnis auf den Bildschirm.

Aber danach bekomme ich immer noch "falsch".

Was ist mein Problem?

Die dataCandles sind eine Struktur. Das Array, in das wir die Kerzen aus dem Verlauf schreiben - array[]. Und wir müssen sie als Zeitreihe erstellen, damit ihre Indizierung mit der Indizierung der Candlesticks im Diagramm übereinstimmt. D.h. die Nullzelle von array[] entspricht den Candlesticks, die dem aktuellen Datum am nächsten sind.

D.h. 1. kopieren Sie Candlesticks in das Array array[], 2. machen Sie daraus eine Zeitreihe und lesen Sie dann Werte daraus in die Struktur.

Sie können ohne array[] tun - schreiben Sie einfach Daten direkt aus dem Chart in die Struktur, aber ich schlug vor, dies für die Kompatibilität mit Five - es erlaubt, direkt nur in den Indikator mit high[i], low[i] und andere Daten zu kopieren, aber in das Skript oder Expert Advisor, müssen wir zuerst die notwendigen Geschichte Intervall in das Array zu kopieren, die ich tat.

Grund der Beschwerde: