기고글 토론 "인디케이터 데이터 교환: 쉬워요!" - 페이지 3

 

와우! 라이브러리를 작성하지 않고도 가져온 함수의 이름을 바꾸는 것만으로 문제를 해결할 수 있는 것 같습니다... 오늘은 너무 늦었지만 내일 시도해 보겠습니다...

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

그래요 제가 너무 일찍 왔네요. 이중이 아닌 배열에 대한 GetValue는 내가 원하는 것과는 상당히 다른 것을 반환합니다.... 아아, MSVC 없이는 할 수 없네요... 어, 체커를 손에 쥔 지 오래됐네요...

 

마스터스!

 

MQL에 왜 포인터가 필요한지 모르겠어요? 포인터로 무언가를 하고 싶다면 C++에서 하세요.

다른 데이터 타입과 다른 타입의 배열에 포인터를 전달하는 데 아무런 문제가 없습니다! 예를 들어, 다음은 정수의 배열에 대한 포인터를 전달하기 위한 선언입니다(다른 유형의 경우 무엇을 변경해야 할지 맞히셨나요?).

dll 함수 호출의 오버헤드는 사라지지 않았습니다(빌드 646). 예를 들어 빈 mql 함수가 빈 dll 함수보다 빠르게 작동하지만, 최소한 s[i]와 같이 배열에서 선택하는 연산을 추가하면 호출 횟수를 최소화해야 함에도 불구하고 c++가 이길 수 있습니다.

가장 큰 성능 누수는 전역 변수로 작업할 때 발생합니다. 매우 느립니다!!!! dll을 만들었다면 전역 변수를 거기에 저장하는 것이 훨씬 쉽습니다. 하나의 메타트레이더 내의 모든 전문가용 보조지표 및 인디케이터 사본에 대해 하나의 dll 사본이 연결되므로 모든 전역 변수는 메타트레이더의 모든 창에 대해 전역 변수가 됩니다(이 사실 때문에 한 창의 개인 데이터는 클래스의 인스턴스에 저장되거나 창 식별자로 액세스 할 수 있는 배열에 저장됩니다).

 
폰터 주소는 단순한 int가 아닌 부호 없는 int여야 합니다.
 
임호, 한 번에 C++ 또는 C#으로 마이그레이션하고 MT 거래 기능 사용으로 돌아가지 않는 것이 더 쉽습니다. 그리고 지표가 필요하면 지표를 그려야 합니다. 그리고 문제는 사라집니다.
 
이것은 가장 훌륭합니다! 함수가 이중(제 경우에는) 구조(특히 MqlRates)보다 조금 더 유용한 것으로 작동하도록 코드를 조정했습니다.
파일:
cpp.zip  44 kb
exchng.mqh  2 kb
exchng.mq4  12 kb
 
이 코드를 어떻게 수정하여 더블뿐만 아니라 구조체 타입 요소를 가진 배열을 교환할 수 있도록 할 수 있나요?
 
JamesMQL:
이 코드를 수정하여 이중뿐만 아니라 구조체 타입 요소를 가진 배열을 교환할 수 있도록 하려면 어떻게 해야 하나요?

배열, 구조체 및 문자열을 교환하려면 어떻게 해야 하나요?

거래 거래

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 솔루션이 필요합니다.