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

 
Anatoliy Ryzhakov:
Hallo. Können Sie mir sagen, wie ich den Typwert der vorletzten Bestellung in der Historie zurückgeben kann?

Sie müssen die Zeit des letzten abgeschlossenen Auftrags ermitteln und dann nach Aufträgen mit einer maximalen Abschlusszeit suchen, die jedoch unter der letzten gespeicherten Zeit liegt:

https://www.mql5.com/ru/forum/247136#comment_7555643

in meinem Beispiel wurde nach dem Ticket gesucht, Sie müssten den Auftragstyp anstelle des Tickets zurückgeben, oder wenn Sie das Ticket des Auftrags kennen, können Sie seinen Typ herausfinden...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

Ist es möglich, eine Vorlage auf eine exportierbare Funktion anzuwenden, die von C++ nach Mql4 exportiert werden soll?

Ich habe eine Datei des regulären Typs mit der Erweiterung "srp" erstellt und dort eine primitive Funktion geschrieben.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

Dann habe ich eine Datei mit der Erweiterung "def" erstellt und den Namen der Funktion angegeben, die exportiert werden soll

LIBRARY "dllmt42"
EXPORTS
add

Dann durchlief es Build - Build Solution.
Ich möchte eine Vorlage auf meine Funktion anwenden, weil wir Funktionen entwickeln werden, die mit Arrays arbeiten und ohne Vorlage nicht auskommen.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

T ist hervorgehoben, aber schreibt, dass es einen Fehler gibt Hilfe Rat und ist es möglich, versucht, neu zu ordnen? Und wie wird eine solche Funktion, wenn möglich, von der mql4-Seite aus aufgerufen?




 
Roman Shiredchenko:

Schauen Sie in der Codebasis nach - auf MT4 waren sie definitiv...

Direkt auf der ersten Seite, in diesem Thema.

 

Guten Abend. In den Prozess des Studiums und Lernens MT5 versucht, eine allgemein nicht schwierige Aufgabe zu implementieren, aber wenig Erfahrung und Lücken in knowledge....... im Allgemeinen nicht funktioniert, bitte Hilfe und Unterstützung.

Ich habe einen Indikator und einen Expert Advisor, beide mit Open-Source-Code, beide vom selben Autor (Artem Trishkin, Respekt und Anerkennung). Ich versuche, den Indikator aufzufordern, die tatsächliche Richtung zum Zeitpunkt der Anfrage zu ermitteln. Der Indikator zeigt diese Richtung mit Auf- oder Abwärtspfeilen an. Die ermittelte Richtung wird vom Expert Advisor entweder als Signal oder als Filter verwendet, aber sie ist noch weit entfernt.

Ich habe den Indikator Griff, aber die Datenwerte der Pfeile aus dem Indikator sind ein Chaos und ich kann nicht herausfinden, sie.

Ich habe den Indikator nicht geändert und OnInit in meinem Expert Advisor hinzugefügt:

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

Ich habe OnTick hinzugefügt:

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

Natürlich habe ich die entsprechenden Overpens, Arrays, definiert als Timeseries und td...... beschrieben und initiiert.

Verwenden Sie Kommentar und Drucken zur Überprüfung. Nicht sofort, aber keine Fehler, nur ein paar Warnungen, die ich nicht verstehe. Aber die Hauptsache - die Parameter sind falsch definiert. Trotz der nachstehenden Bedingung wird die maximale Zahl für den Doppelpfeil nach oben und eine negative Zahl für den Abwärtspfeil ausgegeben.

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
Hier sind die Dateien
Dateien:
 
Sergey Voytsekhovsky:
Hier sind die Dateien

Sie sollten zunächst testen, ob Sie die Daten des Indikators mit einem einfachen Test-EA abrufen können, anstatt sie aus einem Artikel mit vielen unnötigen Funktionen für den Test zu übernehmen.

Erstellen Sie einfach einen einfachen Expert Advisor im MQL Wizard und verwenden Sie ihn zum Üben der Verwendung von iCustom()

 
Sergey Voytsekhovsky:

Guten Abend. In den Prozess des Studiums und Lernens MT5 versucht, eine allgemein nicht schwierige Aufgabe zu implementieren, aber wenig Erfahrung und Lücken in knowledge....... im Allgemeinen nicht funktioniert, bitte Hilfe und Unterstützung.

Ich habe einen Indikator und einen Expert Advisor, beide mit Open-Source-Code, beide vom selben Autor (Artem Trishkin, Respekt und Anerkennung). Ich versuche, den EA zu verwenden, um den Indikator zu bitten, die aktuelle Richtung zum Zeitpunkt der Anfrage zu erhalten. Der Indikator zeigt diese Richtung mit Auf- oder Abwärtspfeilen an. Die ermittelte Richtung wird vom Expert Advisor entweder als Signal oder als Filter verwendet, aber sie ist noch weit entfernt.

Ich habe den Indikator Griff, aber die Datenwerte der Pfeile aus dem Indikator sind ein Chaos und ich kann nicht herausfinden, sie.

Ich habe den Indikator nicht geändert und OnInit in meinem Expert Advisor hinzugefügt:

Ich habe OnTick hinzugefügt:

Natürlich habe ich die entsprechenden Overpens, Arrays, definiert als Timeseries und td...... beschrieben und initiiert.

Verwenden Sie Kommentar und Drucken zur Überprüfung. Nicht sofort, aber keine Fehler, nur ein paar Warnungen, die ich nicht verstehe. Aber die Hauptsache - die Parameter sind falsch definiert. Trotz der unten genannten Bedingung wird die maximale Zahl für den Doppelpfeil nach oben und eine negative Zahl für den Abwärtspfeil gedruckt.

Artyom hat es richtig gesagt, und ich werde nur die Unnötigkeit eines Vergleichs anmerken

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

Wenn CopyBuffer die Anzahl der in das Array kopierten Elemente zurückgibt, entspricht die Größe des Arrays genau dieser Zahl. Dementsprechend dupliziert der hervorgehobene Teil der Bedingung einfach die erste Bedingung.

Und ein Gedanke aus laut: Ich habe nicht auf den Code des Indikators und der EA angesehen, so könnte ich falsch sein. Sind Sie sicher, dass ein Signal im Periodenfindungsbereich vorhanden sein muss?

 
Alexey Viktorov:

Artyom hat richtig gesagt, und ich möchte nur auf die Unnötigkeit eines Vergleichs hinweisen

Wenn CopyBuffer die Anzahl der in das Array kopierten Elemente zurückgibt, entspricht die Größe des Arrays genau dieser Zahl. Dementsprechend dupliziert der ausgewählte Teil der Bedingung einfach den ersten Teil.

Ich denke nur laut: Ich habe den Code des Indikators und des Expert Advisors nicht überprüft, ich kann mich also irren. Sind Sie sicher, dass ein Signal im Periodenfindungsbereich vorhanden sein muss?

Ja - es ist wie ein Filter - die Frequenz der Signale hängt davon ab.

 
Artyom Trishkin:

Beginnen Sie mit einem Test, bei dem Sie Daten aus dem Indikator mit einem einfachen Test-EA abrufen, anstatt sie aus einem Artikel mit vielen unnötigen Funktionen für den Test zu übernehmen.

Die Funktion iCustom() wird für Sie bequemer sein.

Danke, das ist ein guter Ratschlag, ich werde es tun, zumindest ist es dann bequemer.

Ich werde heute damit beginnen.
 

Können Sie mir sagen, was an der Rationierung des Loses falsch ist?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }
Grund der Beschwerde: