Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1243

 

Ich habe nicht die geringste Lust zu googeln oder zu lesen, also habe ich die Datei D:\1.txt geöffnet

/*
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew
HINSTANCE ShellExecuteW(
  HWND    hwnd,
  LPCWSTR lpOperation,
  LPCWSTR lpFile,
  LPCWSTR lpParameters,
  LPCWSTR lpDirectory,
  INT     nShowCmd
);
*/
#import "shell32.dll"
int ShellExecuteW(int hWnd, string lpVerb, string lpFile, string lpParameters, string lpDirectory, int nCmdShow);
#import
#define  SW_SHOW 5
#define  SW_SHOWNORMAL 1
//+------------------------------------------------------------------+
void OnStart()
{
   ShellExecuteW(NULL,"Open","notepad.exe","D:\\1.txt",NULL,SW_SHOW); 
}
//+------------------------------------------------------------------+
 

Was ist der beste Weg, um im Indikator einen 1s-Timer zu starten oder Zeiten (Sekunden) in OnCalculate zu vergleichen?

<1sec, Ausgang

oder gibt es andere Arbeitsmöglichkeiten?

HistorySelect muss für den Monat aktualisiert werden + Arbeit mit Objekten

 
Fast235:

oder in OnCalculate Vergleichszeit (Sekunden)

<1sec, Ausgang

Sekunden sind nicht genug, denn das Problem liegt bei datetime - es kann nicht weniger als eine Sekunde sein.

mindestens Millisekunden vergleichen

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const LastOnCalculate = GetTickCount(); &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   static uint LastOnCalculate = GetTickCount();
   if(GetTickCount() - LastOnCalculate < 1000) return(rates_total);
   LastOnCalculate = GetTickCount();
   .........
   return(rates_total);
}
Fast235:

was ist besser, in der Anzeige zu tun, um einen Timer 1s oder in OnCalculate zu starten, um die Zeit (Sekunden) zu vergleichen


Es ist nicht wichtig, wo dies geschehen soll, wichtig ist nur, dass OnCalculate mit Ticks zusammenhängt - es gibt keinen Tick und daher auch keinen OnCalculate-Aufruf

Fast235:

Sie müssen HistorySelect einen Monat lang aktualisieren und mit Objekten arbeiten

HistorySelect ist schnell, aber wenn Sie Objekte verschieben oder erstellen wollen, kann es zu Verzögerungen kommen, wenn Objekte über 1000 +

und Sie werden diese Objekte jede Sekunde ändern


(geben Sie Ihren Code ein und die Fallstricke werden angezeigt ))))

 

eine Sekunde reicht mir und weniger oft, bis die Zecke kommt

für mich die Anzeige von Geschäften auf dem Diagramm + Ergebnis des Handels über Balken und einige semistatische Informationen wie der globale Trend

kann der Preis den Wechsel von

int OnCalculate (const int rates_total,      // размер массива price[] 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
                 const int begin,            // откуда начинаются значимые данные 
                 const double& price[]       // массив для расчета 
   );

oder die Zeit der zweiten Option

 

Bitte sagen Sie es mir!

Wie kann ich das aktuelle Diagrammsymbol mit dem benötigten Symbol vergleichen?

      case 1 : // кейс для открытия Buy по AUD/USD
               if(Symbol() == (как обозначить нужный символ для сравнения?))                                    // если символ текущего графика AUD/USD открываем сделку
               {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_BUY,Lot(),Ask,0,0,0); // Открытие ордера
//----------------------------------------------------------------------------------------------------
В тоже время советник запущен на другом графике и пытается произвести открытие ордера, цены не совпадают и соответственно вылетает ошибка - неверные цены

      case 2 : // кейс для открытия Bay по GBP/USD 
               if(Symbol() == (как обозначить нужный символ для сравнения?)) 
// если символ текущего графика не AUDUSD то выходим
               {
                  RefreshRates();
                  Open_Order = OrderSend("GBPUSD",OP_SELL,Lot(),Bid,0,0,0); // Открытие ордера

Т.е. надо ему дать понять, что тот или иной кейс принадлежит тому или другому графику, но чтот я пока не придумал как

Ich brauche das Programm, um eine Order auf AUD/USD zu öffnen, also öffnet es die Order (es funktioniert einwandfrei). Allerdings versucht das Programm, die Order auf anderen offenen Charts zu öffnen (der Roboter läuft auf mehreren Währungspaaren) und gibt einen Preisfehler für die anderen Währungspaare zurück, auf denen der Expert Advisor läuft. Ich muss einen Vergleich durchführen, und wenn Symbol() == gleich dem Symbol ist, für das der Auftrag eröffnet werden soll, dann eröffnen wir ihn, und wenn nicht, verlassen wir ihn. Ich habe nirgends gefunden, wie man den Symbolnamen vom Terminal aus einstellen und den Vergleich durchführen kann.

 
Denis Diakonov:

Bitte sagen Sie es mir!

Wie kann ich das aktuelle Diagrammsymbol mit dem benötigten Symbol vergleichen?

Ich brauche das Programm, um eine Order auf AUD/USD zu öffnen, also öffnet es die Order (es funktioniert einwandfrei). Allerdings versucht das Programm, die Order auf anderen offenen Charts zu öffnen (der Roboter läuft auf mehreren Währungspaaren) und gibt einen Preisfehler für die anderen Währungspaare zurück, auf denen der Expert Advisor läuft. Ich muss einen Vergleich durchführen, und wenn Symbol() == gleich dem Symbol ist, für das der Auftrag eröffnet werden soll, dann eröffnen wir ihn, und wenn nicht, verlassen wir ihn. Ich habe nirgends gefunden, wie man den Symbolnamen vom Terminal aus einstellen und einen Vergleich durchführen kann.

Am Ende gibt es ein Beispiel für die richtigen Preise.

SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
  • docs.mql4.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. Если функция используется для получения информации о последнем тике, то лучше использовать SymbolInfoTick(). Вполне возможно, что по данному символу с...
 
Denis Diakonov:

Danke, aber ich brauche nicht die richtigen Preise. Die Preise sind in Ordnung. Ich möchte, dass der EA keine Order eröffnet, wenn das Währungspaar, bei dem die Order eröffnet wird, nicht mit dem aktuell geöffneten Chart übereinstimmt, mit dem der Roboter verbunden ist. Vielleicht können wir dies implementieren, indem wir ein neues Diagramm mit einem Zeitrahmen öffnen, einen gewünschten Auftrag darin eröffnen und dann das Diagramm schließen.

string  symbol;
....
int OnInit()
{...
 symbol=Symbol();
....
}
void OnTick()
...
 if(symbol == Symbol())
{
...//открываем ордер
}
....
 
Valeriy Yastremskiy:
Valeriy Yastremskiy:

Nein, so funktioniert das nicht.

Mein Programm greift auf den aktuellen Chart zu, weist ihm den Namen des aktuellen Instruments zu und versiegelt ihn in einer Variablen, dann vergleicht es den Wert dieser Variablen mit dem aktuellen Symbol im Chart. Es vergleicht es mit sich selbst)))) Ich muss Sympol() irgendwie in einen Wert umwandeln, mit dem eine andere Variable verglichen werden kann. Zum Beispiel:

AUDUSD;

(Symbol() == AUDUSD)

Irgendwie habe ich es geschafft - während ich mich freute und alles richtig änderte - geht nichts mehr))

 
Denis Diakonov:

Nein, so funktioniert das nicht.

Mein Programm greift auf den aktuellen Chart zu, weist ihm den Namen des aktuellen Instruments zu und versiegelt ihn in einer Variablen, dann vergleicht es den Wert dieser Variablen mit dem aktuellen Symbol im Chart. Es vergleicht es mit sich selbst)))) Ich muss Sympol() irgendwie in einen Wert umwandeln, mit dem eine andere Variable verglichen werden kann. Zum Beispiel:

AUDUSD;

(Symbol() == AUDUSD)

Ich habe es irgendwie hinbekommen, bis ich zufrieden war und alles richtig geändert habe - nichts funktioniert))

string AUDUSD = "AUDUSD";

Zumindest auf diese Weise.

 
Denis Diakonov:

Nein, so funktioniert das nicht.

Mein Programm greift auf den aktuellen Chart zu, weist ihm den Namen des aktuellen Instruments zu und versiegelt ihn in einer Variablen, dann vergleicht es den Wert dieser Variablen mit dem aktuellen Symbol im Chart. Es vergleicht es mit sich selbst)))) Ich muss Sympol() irgendwie in einen Wert umwandeln, mit dem eine andere Variable verglichen werden kann. Zum Beispiel:

AUDUSD;

(Symbol() == AUDUSD)

Ich habe es irgendwie geschafft, und während ich mich freute und alles änderte, funktionierte nichts mehr))

Der Expert Advisor, das Skript und der Indikator werden nicht angewendet, sondern arbeiten im aktuellen Fenster. Und die globalen Variablen verschiedener Fenster / Diagramme überschneiden sich nicht. Daher sollte es funktionieren)

string AUDUSD; // Dies ist eine Textvariable, die zunächst leer ist, d. h. gleich "".

(Symbol() == AUDUSD) // dieser String hat nichts mit der Variablen AUDUSD zu tun.

Symbol
Возвращает имя символа текущего графика.
string  Symbol();
Возвращаемое значение
Значение системной переменной _Symbol, в которой хранится имя символа текущего графика.

Die Kriterien für die Auftragseröffnung sollten jedoch nicht für verschiedene Instrumente/Fenster gleich sein. Wenn sie identisch sind, werden sie tatsächlich in allen Fenstern geöffnet.