記事"インディケータ間のデータ交換:簡単です"についてのディスカッション - ページ 3

 

すごい!ライブラリーを書かなくても、インポートした関数の 名前を変えるだけで問題は解決しそうだ・・・。今日はもう遅いけど、明日試してみよう。

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

そうだね。早すぎた。double以外の配列のGetValueは、私が望むものとは全く違うものを返してしまう...。悲しいかな、MSVCなしではやっていけないんだ・・・。えー、チェッカーを手にするのは久しぶりなんだけど・・・。

 

マスターズ

 

なぜMQLにポインタが必要なのか理解できない。ポインターを使いたいなら、C++でやればいい。

別のデータ型へのポインタや別の型の配列を渡すことに問題はない!例えば、整数の配列へのポインターを渡すには、次のように宣言します: void setvar(int& var[]);(他の型の場合は何を変更する必要があると思いますか?)

例えば、空のmql関数は空のdll関数よりも高速に動作するが、少なくともs[i]のように配列から選択する操作を追加すれば、c++の勝ちとなる。

最大のパフォーマンス・リークは、グローバル変数を 扱うときだ!DLLを作成し、そこにグローバル変数を格納する方がはるかに簡単です。1つのメタトレーダー内のすべてのExpert Advisorとインジケーターのコピーに対して、1つのdllのコピーがリンクされ、そのすべてのグローバル変数がメタトレーダーのすべてのウィンドウに対してグローバルになります(この真理により、1つのウィンドウの個人データはクラスのインスタンスか、ウィンドウ識別子でアクセスできる配列に保存されます)。

 
ポンターのアドレスはintではなくunsigned intでなければならない。
 
C++やC#に一気に移行した方が、MTの取引機能の 使用に戻らなくて済む。そして、インジケータが必要なら、それを描けばいい。そうすれば問題はなくなる。
 
これはとても素晴らしい!私の場合は)doubleよりももう少し便利なもの、つまり構造体、具体的にはMqlRatesで 関数が動作するようにコードを調整しました。
ファイル:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
このコードを、doubleだけでなくstruct型の要素を持つ配列を交換できるようにするにはどうすればよいでしょうか?
 
JamesMQL:
double型だけでなくstruct型の要素を持つ配列を交換できるようにするには、このコードをどのように修正すればよいでしょうか?

このコードはどのように変更すればよいでしょうか?

Библиотеки: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"); // Ресурс для обмена 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();   // 読み取り専用。
  Print(_LastError); // ERR_INVALID_PARAMETER - この値を返します。
}
 
fxsaber:

助けてくれてありがとう。

- このコードが理解できません。構造体はどこにあるのでしょうか?

- MQL4のソリューションが必要です。