Обсуждение статьи "Передача данных между индикаторами - простое решение наболевшей проблемы" - страница 3

 

Вау ! Похоже, задачу можно победить и без написания библиотеки - просто переименовав импортируемую функцию... Сегодня уже поздно, а завтра - попробуем-попробуем...

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

Мдя. Рано радовался. GetValue для массивов, отличных от double возвращает что-то совсем не то, что хотелось бы... Увы, без MSVC не обойтись... Эх, давно не брал я в руки шашки...

 

Мастера!

 

Не понимаю, зачем в MQL нужны указатели? Если вы хотите что-то делать с указателями - делайте это сразу в с++.

Проблем по передаче указателей на другой тип данных и на массивы другого типа - нет! К примеру вот объявление: void  setvar(int& var[]);  для передачи указателя на массив целых чисел (догадаетесь что надо поменять для других типов?)

Накладные расходы с вызовом dll функций не исчезли (билд 646), скажем пустая mql-функция работает быстрее чем пустая dll-функция, но если добавить туда хотя-бы операцию выборки из массива, типа s[i], то уже тут c++ будет в выигрыше, тем не менее количество вызовов надо сводить к минимуму.

Самая большая утечка быстродействия идет при работе с глобальными переменными - они ОЧЕНЬ МЕДЛЕННЫЕ!!! Гораздо проще, если мы уж сделали dll, хранить глобальные переменные там. Для всех копий советников и индикаторов в рамках одного метатрейдера, линкуется одна копия dll, соответственно все ее глобальные переменные являются глобальными для всех окон метатрейдера (эта правда вынуждает персональны данные одного окна хранить либо в экземпляре класса, либо в массиве с доступом по идентификатору окна) 

 
Адрес понтера должен быть unsigned int, а не просто int
 
Имхо, проще сразу мигрировать в С++ или C# и не возвращаться до применения торгового функционала МТ.  А если нужны индикаторы, то для их рисования. И проблема исчезает.
 
Это просто замечательно! Я подправил код так, чтобы функции работали с чем-то более полезным, чем double (в моем случае) - структурой, а именно MqlRates.
Файлы:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
Как можно модифицировать этот код, чтобы он мог обмениваться массивами, имеющими элементы типа struct, а не только double?
 
JamesMQL:
Как можно модифицировать этот код, чтобы он мог обмениваться массивами, имеющими элементы типа struct, а не только double?

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

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

Спасибо за помощь, но

- Я не понимаю этот код. Где в нем структура?

- Мне нужно решение на MQL4