Fehler, Irrtümer, Fragen - Seite 2575

 
Roman:

Der Speicher wird im mql-Code wie folgt zugewiesen

heraus und als Zeiger auf zugewiesenen Speicher übergeben, da string in mql wichar_t* in dll ist

Oh, wie verkorkst...

Ich kenne die String-Implementierung nicht, ich kann nur raten, aber nach dem Fehler zu urteilen, erstellt string out einen Zeiger auf dem Stapel, der auf 0x0000000000 initialisiert ist und Sie sicher einen Null-Zeiger in der DLL dereferenzieren.

 
Vladimir Simakov:

Oh, es ist so kompliziert...

Ich kenne die String-Implementierung nicht, ich kann nur raten, aber nach dem Fehler zu urteilen, erstellt string out einen Zeiger auf dem Stapel, der auf 0x0000000000 initialisiert ist und Sie sicher einen Null-Zeiger in der DLL dereferenzieren.

Entschuldigung, ich habe nicht bemerkt, dass StringInit (((.
 
Roman:

Der Speicher wird im mql-Code wie folgt zugewiesen

out und wird als Zeiger auf zugewiesenen Speicher übergeben, da string in mql wchar_t* in dll ist

Untersuchen Sie die Vertiefung selbst, dort ist höchstwahrscheinlich etwas zu finden. In letzter Zeit habe ich Daten aus mql in C++/C#-Anwendungen von Drittanbietern eingespeist, ohne dass es irgendwelche Probleme gab.

 
Vladimir Simakov:

Untersuchen Sie die Datei selbst, wahrscheinlich finden Sie dort etwas. In letzter Zeit habe ich Daten aus mql in C++/C#-Anwendungen von Drittanbietern eingespeist, ohne dass es irgendwelche Probleme gab.

Der Dll ist einfach, er wird nicht zur Verdeutlichung benötigt, die Idee selbst wird gezeigt.

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = getData();  //getData библиотечная функция возвращает const wchar_t*
   wcscpy(out, data);
}

Geben Sie die Ergebnisdaten auf der Konsole aus, alle Zeilen in der Konsole sind klar, ohne Lücken und ohne Störungen.
Ich übergebe das Ergebnis über wcscpy(out, data) an mql, aber jetzt bekomme ich Probleme.
Aber wenn ich eine von Hand geschriebene Zeichenfolge überprüfe.

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = L"{\"p\":\"2000\"}";  //проверочная строка
   wcscpy(out, data);
}

Aus irgendeinem Grund habe ich keine Probleme.

Hm, betrachtet Typ String in Mql Terminal null wchar_t *?

 

Vorschlag, die Möglichkeiten des OnTimer()-Ereignisses ein wenig zu erweitern

Das OnTimer()-Ereignis tritt in dem Moment ein, in dem die Periodizität des Aufrufs mit der Funktion EventSetTimer() festgelegt wurde.

Es stellt sich heraus, die folgenden Expert Advisor:

bool timer_set = false;
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
   if (!timer_set)
      {
         // -- имитация включения советника в какое-то
         // -- случайное время
         string time = TimeToString(TimeTradeServer(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
         if (TimeCurrent() >= D'2019.09.24 3:47:40')
            {
               EventSetTimer(600);
               timer_set = true;
            }
      }
}
//+------------------------------------------------------------------+
void OnTimer()
{
//---
   string time = TimeToString(TimeTradeServer(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
   printf("Current time: %s", time);
}
//+------------------------------------------------------------------+

Gibt ungefähr das Folgende aus:

QJ      0       07:53:10.369    test_timer (GBPUSD_i,D1)        2019.09.24 03:57:41   Current time: 2019.09.24 03:57:41
NF      0       07:53:11.246    test_timer (GBPUSD_i,D1)        2019.09.24 04:07:41   Current time: 2019.09.24 04:07:41

Oft reicht es jedoch aus, das Auftreten des Signals nach dem Erscheinen eines weiteren Balkens zu überprüfen.

Es stellt sich zum Beispiel heraus, dass für PERIOD_M15 der Balken um 00:15:00 erscheint, aber die Prüfung durch den Expert Advisor kann ihn nur um 00:29:59 prüfen.

Für mehr oder weniger stabile und gleiche Ergebnisse, unabhängig von der Startzeit des Expert Advisors,

müssen Sie einen Timer für ein kürzeres Zeitintervall einstellen oder zusätzlich OnTick() verwenden.

Wie Experimente gezeigt haben, verlangsamt sich dadurch die Geschwindigkeit der Tests im Strategietester drastisch.

Anregung:

Hinzufügen einer Funktion, die es ermöglicht, die Anfangszeit festzulegen, ab der das OnTimer-Ereignis gezählt wird.

Zum Beispiel eine Funktion EventSetTimerFrom(const datetime SinceDT), die es Ihnen ermöglichen würde, den Timeraufruf einige Sekunden nach einem neuen Takt zu setzen.

 
Roman:

Der Dll ist einfach, das überflüssige Zeug wurde aus Gründen der Übersichtlichkeit entfernt, die Idee wird dargestellt.

Ich füge das Ergebnis in die Konsole ein, alle Zeilen sind in Ordnung, keine Lücken, keine Pannen.
Ich übergebe das Ergebnis über wcscpy(out, data) an mql, aber jetzt bekomme ich Probleme.
Aber wenn ich eine von Hand geschriebene Zeichenfolge überprüfe.

Aus irgendeinem Grund habe ich keine Probleme.

Hm, betrachtet Typ String in Mql Terminal null wchar_t *?

Aber diese Funktion funktioniert.

wcsncpy(out, data, wcslen(data));

Aber es ist etwas unübersichtlich, es sieht so aus, als ob am Ende einer Zeile ein zusätzliches } steht, eine zusätzliche Klammer taucht immer wieder auf und verschwindet.
wcslen(Daten)+1
wcslen(Daten)+2
hat nicht geholfen,
und wird ohne Fehler geparst, ohne Lecks.

keine Ahnung, was die Länge oder Größe eines Zeichens in einer mql-ähnlichen Zeichenfolge ist
liegt sicherlich ein Fehler im String-Typ vor.

Und in einem lange zurückliegenden Artikel in Abschnitt 3.3 Übergabe und Modifizierung von Zeichenketten wurde in dem Beispiel höchstwahrscheinlich ein Fehler gemacht.

_DLLAPI void fnReplaceString(wchar_t *text, wchar_t *from, wchar_t *to)
  {
   wchar_t *cp;
    
   //проверка параметров
   if(text==NULL || from==NULL || to==NULL) return;
   if(wcslen(from)!=wcslen(to))             return;
   
   //поищем подстроку
   if((cp=wcsstr(text,from))==NULL)         return;
   
   //заменим
   memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)
  }

Vielleicht funktioniert die mql-Stringkonvertierung irgendwo im Terminalcode auf die gleiche Weise, ohne Zeiger.

 
Maksim Emeliashin:

die Anfangszeit festlegen, ab der das OnTimer-Ereignis heruntergezählt wird.

Sie können dies durch wiederholten Aufruf von EventSetTimer selbst tun. Beachten Sie, dass der Timer im Konto (nicht im Tester) schwebt und ständig angepasst werden muss.

 
fxsaber:

Sie können dies durch wiederholten Aufruf von EventSetTimer selbst tun. Beachten Sie, dass der Timer auf dem Konto (nicht im Tester) schwimmt und ständig angepasst werden muss.

Danke, nützliche Sache!

Es ist natürlich sehr merkwürdig, dass ein so einfacher Punkt im Terminal "out of the box" nicht beachtet wird.

 
Roman:

Aber diese Funktion funktioniert.

Aber es scheint ein wenig umständlich zu sein, eine zusätzliche Klammer } erscheint oder verschwindet am Ende der Zeichenkette.
wcslen(Daten)+1
wcslen(Daten)+2
hat nicht geholfen,
und wird ohne Fehler geparst, ohne Lecks.

keine Ahnung, was die Länge oder Größe eines Zeichens in einer mql-ähnlichen Zeichenfolge ist
liegt sicherlich ein Fehler im String-Typ vor.

Und in einem lange zurückliegenden Artikel in Abschnitt 3.3 Übergabe und Modifizierung von Zeichenketten wurde in dem Beispiel höchstwahrscheinlich ein Fehler gemacht.

Vielleicht funktioniert die mql-Stringkonvertierung irgendwo im Terminalcode auf die gleiche Weise, ohne den Zeiger.

getData() dig. Ich habe das Gefühl, dass es irgendwo ein Problem gibt.
[Gelöscht]  
Roman:

Der Dll ist einfach, er wurde aus Gründen der Übersichtlichkeit entfernt und die Idee wird dargestellt

Ihre Beispiele sind lustig, Sie haben alles entfernt, UB (Änderung von Stringliteralen) übrig gelassen, und jeder muss telepathieren. Wenn Sie einen klugen Ratschlag erwarten, geben Sie ein Minimum an funktionierendem Code (auf zwei Seiten), sonst ist es einfach nur Müll.