Вау ! Похоже, задачу можно победить и без написания библиотеки - просто переименовав импортируемую функцию... Сегодня уже поздно, а завтра - попробуем-попробуем...
Мдя. Рано радовался. GetValue для массивов, отличных от double возвращает что-то совсем не то, что хотелось бы... Увы, без MSVC не обойтись... Эх, давно не брал я в руки шашки...
Не понимаю, зачем в MQL нужны указатели? Если вы хотите что-то делать с указателями - делайте это сразу в с++.
Проблем по передаче указателей на другой тип данных и на массивы другого типа - нет! К примеру вот объявление: void setvar(int& var[]); для передачи указателя на массив целых чисел (догадаетесь что надо поменять для других типов?)
Накладные расходы с вызовом dll функций не исчезли (билд 646), скажем пустая mql-функция работает быстрее чем пустая dll-функция, но если добавить туда хотя-бы операцию выборки из массива, типа s[i], то уже тут c++ будет в выигрыше, тем не менее количество вызовов надо сводить к минимуму.
Самая большая утечка быстродействия идет при работе с глобальными переменными - они ОЧЕНЬ МЕДЛЕННЫЕ!!! Гораздо проще, если мы уж сделали dll, хранить глобальные переменные там. Для всех копий советников и индикаторов в рамках одного метатрейдера, линкуется одна копия dll, соответственно все ее глобальные переменные являются глобальными для всех окон метатрейдера (эта правда вынуждает персональны данные одного окна хранить либо в экземпляре класса, либо в массиве с доступом по идентификатору окна)
Имхо, проще сразу мигрировать в С++ или C# и не возвращаться до применения торгового функционала МТ. А если нужны индикаторы, то для их рисования. И проблема исчезает.
Это просто замечательно! Я подправил код так, чтобы функции работали с чем-то более полезным, чем double (в моем случае) - структурой, а именно MqlRates.
// Пример хранения/обмена данными через Ресурсы внутри Терминала#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166voidOnStart()
{
const RESOURCEDATA<int> ResourceINT("::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); // Ресурс для доступа к данным (только для чтения) из другой программыMqlTick TicksOut[];
Resource.Get(TicksOut); // Считали данные из ресурса.ArrayPrint(TicksOut); // Вывели.
Resource.Free(); // Не получится повлиять на данные только для чтения-ресурса.Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
Вау ! Похоже, задачу можно победить и без написания библиотеки - просто переименовав импортируемую функцию... Сегодня уже поздно, а завтра - попробуем-попробуем...
Мдя. Рано радовался. GetValue для массивов, отличных от double возвращает что-то совсем не то, что хотелось бы... Увы, без MSVC не обойтись... Эх, давно не брал я в руки шашки...
Мастера!
Не понимаю, зачем в MQL нужны указатели? Если вы хотите что-то делать с указателями - делайте это сразу в с++.
Проблем по передаче указателей на другой тип данных и на массивы другого типа - нет! К примеру вот объявление: void setvar(int& var[]); для передачи указателя на массив целых чисел (догадаетесь что надо поменять для других типов?)
Накладные расходы с вызовом dll функций не исчезли (билд 646), скажем пустая mql-функция работает быстрее чем пустая dll-функция, но если добавить туда хотя-бы операцию выборки из массива, типа s[i], то уже тут c++ будет в выигрыше, тем не менее количество вызовов надо сводить к минимуму.
Самая большая утечка быстродействия идет при работе с глобальными переменными - они ОЧЕНЬ МЕДЛЕННЫЕ!!! Гораздо проще, если мы уж сделали dll, хранить глобальные переменные там. Для всех копий советников и индикаторов в рамках одного метатрейдера, линкуется одна копия dll, соответственно все ее глобальные переменные являются глобальными для всех окон метатрейдера (эта правда вынуждает персональны данные одного окна хранить либо в экземпляре класса, либо в массиве с доступом по идентификатору окна)
Как можно модифицировать этот код, чтобы он мог обмениваться массивами, имеющими элементы типа struct, а не только double?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: TradeTransactions
fxsaber, 2018.09.20 16:23
Спасибо за помощь, но
- Я не понимаю этот код. Где в нем структура?
- Мне нужно решение на MQL4