Discussione sull’articolo "Scambio di Dati tra Indicatori: È Facile" - pagina 3

 

Wow! Sembra che il problema possa essere risolto senza scrivere una libreria, semplicemente rinominando la funzione importata... Oggi è troppo tardi, ma domani - proviamo e riproviamo...

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

Si'... Sono stato troppo precoce. GetValue per array diversi da double restituisce qualcosa di molto diverso da quello che vorrei... Ahimè, non posso fare a meno di MSVC... Non prendo in mano le pedine da molto tempo...

 

Maestri!

 

Non capisco perché MQL abbia bisogno di puntatori. Se volete fare qualcosa con i puntatori, fatelo in C++.

Non ci sono problemi nel passare puntatori a un altro tipo di dati e ad array di un altro tipo! Ad esempio, ecco una dichiarazione: void setvar(int& var[]); per passare un puntatore a un array di interi (indovinate cosa dovete cambiare per altri tipi?).

Gli overhead delle chiamate alle funzioni dll non sono scomparsi (build 646), ad esempio una funzione mql vuota funziona più velocemente di una funzione dll vuota, ma se si aggiunge almeno un'operazione di selezione da un array, come s[i], allora c++ vincerà in questo caso, tuttavia il numero di chiamate dovrebbe essere ridotto al minimo.

La più grande perdita di prestazioni è quando si lavora con le variabili globali: sono MOLTO LENTE!!!! È molto più semplice, se abbiamo creato una dll, memorizzare le variabili globali lì. Per tutte le copie di Expert Advisor e indicatori all'interno di una metatrader, viene collegata una copia della dll, in modo che tutte le sue variabili globali siano globali per tutte le finestre della metatrader (questa verità obbliga a memorizzare i dati personali di una finestra in un'istanza della classe o in un array con accesso in base all'identificatore della finestra).

 
L'indirizzo del ponter dovrebbe essere unsigned int, non solo int
 
Imho, è più facile migrare subito a C++ o C# e non tornare a utilizzare le funzionalità di trading della MT. E se avete bisogno di indicatori, dovreste disegnarli. E il problema scompare.
 
Questo è davvero eccellente! Ho modificato il codice in modo che le funzioni lavorino con qualcosa di più utile di un doppio (nel mio caso) - una struttura - in particolare MqlRates.
File:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
Come si può modificare questo codice in modo che sia in grado di scambiare array con elementi di tipo struct e non solo double?
 
JamesMQL:
Come si può modificare questo codice in modo che sia in grado di scambiare array con elementi di tipo struct e non solo double?

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

Библиотеки: Transazioni commerciali

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); // Ресурс для доступа к данным (solo lettura) из другой програмы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:

Grazie per l'aiuto, ma

- Non capisco questo codice. Dove si trova la struct?

- Ho bisogno di una soluzione MQL4