MQL에 왜 포인터가 필요한지 모르겠어요? 포인터로 무언가를 하고 싶다면 C++에서 하세요.
다른 데이터 타입과 다른 타입의 배열에 포인터를 전달하는 데 아무런 문제가 없습니다! 예를 들어, 다음은 정수의 배열에 대한 포인터를 전달하기 위한 선언입니다(다른 유형의 경우 무엇을 변경해야 할지 맞히셨나요?).
dll 함수 호출의 오버헤드는 사라지지 않았습니다(빌드 646). 예를 들어 빈 mql 함수가 빈 dll 함수보다 빠르게 작동하지만, 최소한 s[i]와 같이 배열에서 선택하는 연산을 추가하면 호출 횟수를 최소화해야 함에도 불구하고 c++가 이길 수 있습니다.
가장 큰 성능 누수는 전역 변수로 작업할 때 발생합니다. 매우 느립니다!!!! dll을 만들었다면 전역 변수를 거기에 저장하는 것이 훨씬 쉽습니다. 하나의 메타트레이더 내의 모든 전문가용 보조지표 및 인디케이터 사본에 대해 하나의 dll 사본이 연결되므로 모든 전역 변수는 메타트레이더의 모든 창에 대해 전역 변수가 됩니다(이 사실 때문에 한 창의 개인 데이터는 클래스의 인스턴스에 저장되거나 창 식별자로 액세스 할 수 있는 배열에 저장됩니다).
// Пример хранения/обмена данными через Ресурсы внутри Терминала#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166voidOnStart()
{
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)); // Убедились, что данных нет: 0const 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); // Вывели.// 이 항목은 사용자 정의 및 사용자 정의 프로그래밍을 위한 것입니다.conststring 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 - 매개 변수 오류입니다.
}
와우! 라이브러리를 작성하지 않고도 가져온 함수의 이름을 바꾸는 것만으로 문제를 해결할 수 있는 것 같습니다... 오늘은 너무 늦었지만 내일 시도해 보겠습니다...
그래요 제가 너무 일찍 왔네요. 이중이 아닌 배열에 대한 GetValue는 내가 원하는 것과는 상당히 다른 것을 반환합니다.... 아아, MSVC 없이는 할 수 없네요... 어, 체커를 손에 쥔 지 오래됐네요...
마스터스!
MQL에 왜 포인터가 필요한지 모르겠어요? 포인터로 무언가를 하고 싶다면 C++에서 하세요.
다른 데이터 타입과 다른 타입의 배열에 포인터를 전달하는 데 아무런 문제가 없습니다! 예를 들어, 다음은 정수의 배열에 대한 포인터를 전달하기 위한 선언입니다(다른 유형의 경우 무엇을 변경해야 할지 맞히셨나요?).
dll 함수 호출의 오버헤드는 사라지지 않았습니다(빌드 646). 예를 들어 빈 mql 함수가 빈 dll 함수보다 빠르게 작동하지만, 최소한 s[i]와 같이 배열에서 선택하는 연산을 추가하면 호출 횟수를 최소화해야 함에도 불구하고 c++가 이길 수 있습니다.
가장 큰 성능 누수는 전역 변수로 작업할 때 발생합니다. 매우 느립니다!!!! dll을 만들었다면 전역 변수를 거기에 저장하는 것이 훨씬 쉽습니다. 하나의 메타트레이더 내의 모든 전문가용 보조지표 및 인디케이터 사본에 대해 하나의 dll 사본이 연결되므로 모든 전역 변수는 메타트레이더의 모든 창에 대해 전역 변수가 됩니다(이 사실 때문에 한 창의 개인 데이터는 클래스의 인스턴스에 저장되거나 창 식별자로 액세스 할 수 있는 배열에 저장됩니다).
이 코드를 수정하여 이중뿐만 아니라 구조체 타입 요소를 가진 배열을 교환할 수 있도록 하려면 어떻게 해야 하나요?
배열, 구조체 및 문자열을 교환하려면 어떻게 해야 하나요?
거래 거래
fxsaber, 2018.09.20 16:23
도와주셔서 감사합니다.
- 이 코드를 이해하지 못하겠습니다. 구조체가 어디에 있나요?
- MQL4 솔루션이 필요합니다.