Discussão do artigo "Troca de dados entre indicadores: é fácil" - página 3

 

Uau! Parece que o problema pode ser resolvido sem escrever uma biblioteca - basta renomear a função importada... Hoje é tarde demais, mas amanhã vamos tentar e tentar...

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

Sim. Eu estava muito adiantado. GetValue para matrizes diferentes de double retorna algo bem diferente do que eu gostaria... Infelizmente, não posso ficar sem o MSVC... Há muito tempo que não pego em damas nas mãos...

 

Mestres!

 

Não entendo por que o MQL precisa de ponteiros? Se você quiser fazer algo com ponteiros, faça-o em C++.

Não há problemas em passar ponteiros para outro tipo de dados e matrizes de outro tipo! Por exemplo, aqui está uma declaração: void setvar(int& var[]); para passar um ponteiro para uma matriz de inteiros (adivinhe o que você precisa mudar para outros tipos?).

As despesas gerais da chamada de funções dll não desapareceram (build 646), por exemplo, uma função mql vazia funciona mais rápido do que uma função dll vazia, mas se você adicionar pelo menos uma operação de seleção de uma matriz, como s[i], o c++ vencerá, mas o número de chamadas deve ser minimizado.

O maior vazamento de desempenho é quando se trabalha com variáveis globais - elas são MUITO LENTAS!!!! É muito mais fácil, se tivermos criado uma dll, armazenar as variáveis globais nela. Para todas as cópias de Expert Advisors e indicadores em um metatrader, uma cópia da dll é vinculada, de modo que todas as suas variáveis globais são globais para todas as janelas do metatrader (essa verdade força os dados pessoais de uma janela a serem armazenados em uma instância da classe ou em uma matriz com acesso por identificador de janela).

 
O endereço do ponteiro deve ser um int sem sinal, não apenas um int
 
Na minha opinião, é mais fácil migrar para C++ ou C# de uma vez e não voltar a usar a funcionalidade de negociação do MT. E se você precisar de indicadores, deverá desenhá-los. E o problema desaparecerá.
 
Isso é excelente! Ajustei o código para que as funções funcionem com algo um pouco mais útil do que um double (no meu caso) - uma estrutura - especificamente MqlRates.
Arquivos anexados:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
Como posso modificar esse código para que ele seja capaz de trocar uma matriz com elementos do tipo struct e não apenas double?
 
JamesMQL:
Como posso modificar esse código para que ele seja capaz de trocar uma matriz com elementos do tipo struct e não apenas 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); // Ресурс для доступа к данным (somente leitura) из другой программы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:

Obrigado por sua ajuda, mas

- Não estou entendendo esse código. Onde está o struct nele?

- Preciso de uma solução MQL4