Discussion de l'article "Échange de Données entre les Indicateurs : C'est facile" - page 3

 

Wow ! Il semble que le problème puisse être résolu sans écrire de bibliothèque - juste en renommant la fonction importée... Il est trop tard aujourd'hui, mais demain - essayons et essayons...

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

Oui, c'est vrai. J'étais trop tôt. GetValue pour les tableaux autres que double renvoie quelque chose d'assez différent de ce que je voudrais... Hélas, je ne peux pas me passer de MSVC... Eh, ça fait longtemps que je n'ai pas pris de jeu de dames dans mes mains...

 

Maîtres !

 

Je ne comprends pas pourquoi MQL a besoin de pointeurs ? Si vous voulez faire quelque chose avec des pointeurs, faites-le en C++.

Il n'y a aucun problème pour passer des pointeurs à un autre type de données et à des tableaux d'un autre type ! Par exemple, voici une déclaration : void setvar(int& var[]) ; pour passer un pointeur à un tableau d'entiers (devinez ce qu'il faut changer pour les autres types ?)

Les frais généraux liés à l'appel des fonctions dll n'ont pas disparu (build 646), disons qu'une fonction mql vide fonctionne plus rapidement qu'une fonction dll vide, mais si vous y ajoutez au moins une opération de sélection dans un tableau, comme s[i], alors c++ gagnera ici, même si le nombre d'appels doit être réduit au minimum.

La plus grande perte de performance se produit lorsque l'on travaille avec des variables globales - elles sont TRÈS LENTES !!!! Il est beaucoup plus facile, si nous avons créé une dll, d'y stocker des variables globales. Pour toutes les copies d'Expert Advisors et d'indicateurs au sein d'un metatrader, une copie de la dll est liée, de sorte que toutes ses variables globales sont globales pour toutes les fenêtres du metatrader (cette vérité oblige les données personnelles d'une fenêtre à être stockées soit dans une instance de la classe, soit dans un tableau avec un accès par identifiant de fenêtre).

 
l'adresse du ponter devrait être unsigned int, et pas seulement int
 
Je pense qu'il est plus facile de migrer vers C++ ou C# en une seule fois et de ne pas revenir à l'utilisation de la fonctionnalité de trading de MT. Et si vous avez besoin d'indicateurs, vous devez les dessiner. Et le problème disparaît.
 
C'est excellent ! J'ai ajusté le code pour que les fonctions fonctionnent avec quelque chose d'un peu plus utile qu'un double (dans mon cas) - une structure - spécifiquement MqlRates.
Dossiers :
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
Comment modifier ce code pour qu'il puisse échanger des tableaux dont les éléments sont de type struct et non seulement double ?
 
JamesMQL:
Comment modifier ce code pour qu'il soit capable d'échanger un tableau dont les éléments sont de type struct et pas seulement 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"); // Ресурс для обмена 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); // Ресурс для доступа к данным (en lecture seule) из другой програмы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:

Merci pour votre aide, mais

- Je ne comprends pas ce code. Où se trouve la structure dans ce code ?

- J'ai besoin d'une solution MQL4