文章 "指标间的数据交换:易如反掌!" - 页 3

 

哇看来这个问题不用写库也能解决--只需重命名导入的函数...今天太晚了,明天再试吧

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

是啊 我来得太早了 Yeah.我来得太早了。除了 double 之外,数组的 GetValue 返回值与我想要的完全不同...唉,没有 MSVC 可不行啊...我已经很久没用过跳棋了...

 

高手!

 

我不明白为什么 MQL 需要指针?如果你想用指针做什么,用 C++ 就可以了。

将指针传递到另一种数据类型和另一种类型的数组是没有问题的!例如,这里有一个声明:void setvar(int& var[]); 用于传递指向整数数组的指针(猜猜对于其他类型需要修改什么?)

调用 dll 函数的开销并没有消失(第 646 版),例如,一个空的 mql 函数比一个空的 dll 函数运行得更快,但如果你至少添加了一个从数组中选择的操作,如 s[i],那么 c++ 将在这里获胜,尽管如此,调用的次数应尽量减少。

最大的性能缺陷是在处理全局变量 时--它们非常慢!!!!!如果我们制作了一个 dll,在其中存储全局变量会容易得多。对于一个 metatrader 中的所有 Expert Advisors 和指标副本,都链接了一个 dll 副本,因此其所有全局变量对于 metatrader 的所有窗口都是全局的(这一事实迫使一个窗口的个人数据要么存储在类的实例中,要么存储在数组中,通过窗口标识符进行访问)。

 
ponter 地址应该是无符号 int,而不仅仅是 int
 
在我看来,一次性迁移到 C++ 或 C# 会更容易,而且不会再使用 MT交易功能。如果您需要指标,您应该绘制它们。这样问题就不复存在了。
 
这真是太好了!我调整了代码,使函数可以使用比 double 更有用的东西(在我的例子中)--结构,特别是MqlRates
附加的文件:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
如何修改这段代码,使其能够交换具有结构类型元素的数组,而不仅仅是 double?
 
JamesMQL:
如何修改这段代码,使其能够交换具有结构类型元素的数组,而不仅仅是 double?

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

Библиотеки:贸易交易

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

感谢您的帮助,但

- 我不明白这段代码。结构体在哪里?

- 我需要 MQL4 解决方案