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...
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...
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).
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.
// Пример хранения/обмена данными через Ресурсы внутри Терминала#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166voidOnStart()
{
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)); // Убедились, что данных нет: 0const 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); // Вывели.// Это полное имя ресурса для обращения из другой програмыconststring 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 - Ошибочный параметр при вызове системной функции.
}
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...
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).
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
Grazie per l'aiuto, ma
- Non capisco questo codice. Dove si trova la struct?
- Ho bisogno di una soluzione MQL4