Diskussion zum Artikel "Sehr einfach: Der Datenaustausch zwischen Indikatoren" - Seite 3

 

Wow! Es scheint, dass das Problem gelöst werden kann, ohne eine Bibliothek zu schreiben - einfach durch Umbenennen der importierten Funktion... Heute ist es zu spät, aber morgen - versuchen wir es und versuchen wir es...

Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

Ja, ich war zu früh dran. Ich war zu früh. GetValue für andere Arrays als double gibt etwas ganz anderes zurück, als ich gerne hätte... Leider kann ich auf MSVC nicht verzichten... Eh, ich habe schon lange keine Schachfiguren mehr in die Hand genommen...

 

Meister!

 

Ich verstehe nicht, warum MQL Zeiger braucht? Wenn Sie etwas mit Zeigern machen wollen, tun Sie es in C++.

Es gibt keine Probleme bei der Übergabe von Zeigern auf einen anderen Datentyp und Arrays eines anderen Typs! Hier ist zum Beispiel eine Deklaration: void setvar(int& var[]); zur Übergabe eines Zeigers auf ein Array von Ganzzahlen (raten Sie mal, was Sie für andere Typen ändern müssen?).

Der Overhead durch den Aufruf von dll-Funktionen ist nicht verschwunden (Build 646), d.h. eine leere mql-Funktion arbeitet schneller als eine leere dll-Funktion, aber wenn man zumindest eine Operation zur Auswahl aus einem Array hinzufügt, wie z.B. s[i], dann wird C++ hier gewinnen, trotzdem sollte die Anzahl der Aufrufe minimiert werden.

Das größte Performance-Leck ist die Arbeit mit globalen Variablen - sie sind SEHR LANGSAM!!!! Wenn wir eine DLL erstellt haben, ist es viel einfacher, globale Variablen dort zu speichern. Für alle Kopien von Expert Advisors und Indikatoren innerhalb eines Metatraders wird eine Kopie der dll verlinkt, so dass alle ihre globalen Variablen für alle Fenster des Metatraders global sind (diese Wahrheit zwingt dazu, persönliche Daten eines Fensters entweder in einer Instanz der Klasse oder in einem Array mit Zugriff über die Fensterkennung zu speichern).

 
Ponter-Adresse sollte unsigned int sein, nicht einfach int
 
Imho ist es einfacher, sofort auf C++ oder C# umzusteigen und nicht zur Verwendung der MT-Handelsfunktionen zurückzukehren. Und wenn Sie Indikatoren brauchen, sollten Sie sie zeichnen. Und das Problem verschwindet.
 
Das ist ganz ausgezeichnet! Ive den Code angepasst, so dass die Funktionen mit etwas ein wenig mehr nützlich als ein Doppel (in meinem Fall) - eine Struktur - speziell MqlRates arbeiten.
Dateien:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
Wie kann dieser Code geändert werden, so dass es fähig sein kann, Array mit struct Typ Element nicht nur double austauschen?
 
JamesMQL:
Wie kann man diesen Code so abändern, dass er in der Lage ist, ein Array auszutauschen, das Elemente vom Typ struct und nicht nur double hat?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TradeTransactions

fxsaber, 2018.09.20 16:23

// Пример хранения/обмена данными через Ресурсы внутри Терминала
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

void OnStart()
{  
  const RESOURCEDATA<int> ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса
  
  int ArrayINT[] = {1, 2, 3};
  int Num = 5;
  
  ResourceINT = ArrayINT;  // Ресурс хранит массив.
  ResourceINT += Num;      // Добавили в ресурс еще значение.
  ResourceINT += ArrayINT; // Добавили массив.
  
  int ArrayINT2[];  
  ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
  ArrayPrint(ArrayINT2);      // Вывели: 1 2 3 5 1 2 3

  ResourceINT.Free();                // Удалили данные из ресурса
  Print(ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0

  const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    for (int i = 0; i < 3; i++)
      ResourceTicks += Tick; // Добавили в ресурс тики

  MqlTick Ticks[];
  ResourceTicks.Get(Ticks); // Считали данные из ресурса.
  ArrayPrint(Ticks);        // Вывели.
  
  // Это полное имя ресурса для обращения из другой программы
  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
  Print(NameOut); // Вывели полное имя ресурса.
  
  const RESOURCEDATA<MqlTick> Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:

Vielen Dank für Ihre Hilfe, aber

- ich verstehe diesen Code nicht. Wo die Struktur in ihm?

- Ich brauche MQL4 Lösung