MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 845

 
Anatoliy Ryzhakov :
안녕하세요. 기록에서 두 번째 순서 의 유형 값을 반환하는 방법을 알려주세요.

마지막으로 마감된 주문의 시간을 찾은 다음 마감 시간이 최대이지만 마지막으로 기억된 시간보다 적은 주문을 찾아야 하므로 다음과 같이 했습니다.

https://www.mql5.com/ru/forum/247136#comment_7555643

내 예에서 티켓이 검색된 경우 티켓 대신 주문 유형을 반환해야 하거나 주문 티켓을 알고 있으면 유형을 찾을 수 있습니다...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

C++에서 mql4로 내보낼 내보낸 함수 에 템플릿을 적용할 수 있습니까?

나는 확장자가 "cpp"인 일반적인 형식의 파일을 만들고 거기에 원시 함수를 기록했습니다.

 #define MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC   int __stdcall  add( int a= 0 , int b= 0 ) //stdcall //cdecl
{ return ( 18 );}

다음으로 확장자가 "def"인 파일을 만들고 내보낸 함수의 이름을 지정했습니다.

LIBRARY "dllmt42"
EXPORTS
add

그런 다음 Build - Build Solution을 통해 이 케이스를 시작했습니다.
내 기능에 템플릿을 적용하고 싶습니다. 왜냐하면 배열로 작동하는 기능이 개발될 것이며 여기에서 템플릿 없이는 할 수 없습니다

 #define MT4_EXPFUNC extern "C++" __declspec(dllexport)
template < typename T>MT4_EXPFUNC   int __stdcall  add(T a= 0 , T b= 0 ){ return ( 18 );}

T가 강조 표시되지만 오류가 있다고 씁니다. 조언을 도와주고 가능합니까? 재정렬을 시도 했습니까? 또한 가능한 경우 이러한 함수가 mql4 측에서 어떻게 호출됩니까?




 
Roman Shiredchenko :

코드베이스를 살펴보십시오 - 그들은 확실히 MT4에있었습니다 ...

이 스레드의 첫 페이지에 있습니다.

 

좋은 저녁이에요. MT5를 공부하고 배우는 과정에서 어렵지는 않지만 경험과 지식의 격차가 거의 없는 과제를 구현하려고 합니다........일반적으로 잘 되지 않아 도움과 도움을 요청합니다.

아이디어는 이것입니다. 동일한 저자(Artyom Trishkin, 존경과 존경 !!!)의 지표와 고문 모두 오픈 소스입니다. 요청 당시의 현재 방향을 얻기 위해 EA에서 표시기에 액세스하려고 합니다. 표시기는 위쪽 또는 아래쪽 화살표로 이 방향을 표시합니다. 수신된 방향은 어드바이저가 신호 또는 필터로 사용하지만 아직 멀었습니다.

인디케이터 핸들을 받았는데 인디케이터의 화살표 데이터 값이 완전 엉망이라 도무지 알 수가 없네요.

표시기를 변경하지 않고 EA의 OnInit에 추가했습니다.

   CrossAD = iCustom (asymbol.Name(), _Period , "iCrossAD" );
   if (CrossAD == INVALID_HANDLE )
   {
       Print ( "Не удалось создать описатель индикатора iCrossAD!" );
       return ( INIT_FAILED );
   }
       else Print ( "Хендл iCrossAD = " ,CrossAD);

OnTick에서 추가:

   int n= 0 ;
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find || ArraySize (Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
      }
       else 
         for (n= 0 ; n<period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE ) break ;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index);
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find || ArraySize (Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
      }
       else 
         for (n= 0 ; n<period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE ) break ;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index);

물론 해당 폼, 어레이를 설명하고 시작했으며 시계열 등으로 정의했습니다....

사용된 주석 및 인쇄를 확인합니다. 즉시는 아니지만 오류는 없는 것 같고 이해가 안 가는 경고가 몇 개뿐입니다. 그러나 가장 중요한 것은 매개 변수가 잘못 결정된다는 것입니다. 아래 조건에도 불구하고 위쪽 화살표의 경우 double에 대해 가능한 가장 큰 숫자가 표시되고 아래쪽 화살표의 경우 다른 음수가 표시됩니다.

 if (Buf_Arrow_Buy[n]!= EMPTY_VALUE ) break ;
и
if (Buf_Arrow_Sell[n]!= EMPTY_VALUE ) break ;
 
다음은 파일입니다.
파일:
 
Sergey Voytsekhovsky :
다음은 파일입니다.

간단한 테스트 Expert Advisor를 사용하여 지표에서 데이터를 가져오는 테스트로 시작하고 테스트에 불필요한 기능이 많은 기사에서 가져오지 않습니다.

MQL 마법사에서 일반 EA를 생성하고 이를 사용하여 iCustom() 사용 연습

 
Sergey Voytsekhovsky :

좋은 저녁이에요. MT5를 공부하고 배우는 과정에서 어렵지는 않지만 경험과 지식의 격차가 거의 없는 과제를 구현하려고 합니다........일반적으로 잘 되지 않아 도움과 도움을 요청합니다.

아이디어는 이것입니다. 동일한 저자(Artyom Trishkin, 존경과 존경 !!!)의 지표와 고문 모두 오픈 소스입니다. 요청 당시의 현재 방향을 얻기 위해 EA에서 표시기에 액세스하려고 합니다. 표시기는 위쪽 또는 아래쪽 화살표로 이 방향을 표시합니다. 수신된 방향은 어드바이저가 신호 또는 필터로 사용하지만 아직 멀었습니다.

인디케이터 핸들을 받았는데 인디케이터의 화살표 데이터 값이 완전 엉망이라 도무지 알 수가 없네요.

표시기를 변경하지 않고 EA의 OnInit에 추가했습니다.

OnTick에서 추가:

물론 해당 폼, 어레이를 설명하고 시작했으며 시계열 등으로 정의했습니다....

사용된 주석 및 인쇄를 확인합니다. 즉시는 아니지만 오류는 없는 것 같고 이해가 안 가는 경고가 몇 개뿐입니다. 그러나 가장 중요한 것은 매개 변수가 잘못 결정된다는 것입니다. 아래 조건에도 불구하고 위쪽 화살표의 경우 double에 대해 가능한 가장 큰 숫자가 표시되고 아래쪽 화살표의 경우 다른 음수가 표시됩니다.

Artyom이 올바르게 말했지만 하나의 비교의 무의미함을 지적합니다.

 if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find || ArraySize (Buf_Arrow_Buy) != period_find )

CopyBuffer가 배열에 복사된 요소의 수를 반환하면 배열의 크기는 정확히 그 크기가 됩니다. 따라서 조건의 강조 표시된 부분은 첫 번째 부분을 단순히 복제합니다.

그리고 큰 소리로 생각하십시오. 지표와 어드바이저 코드를 보지 않았기 때문에 틀릴 수 있습니다. 신호가 period_find 범위에 있어야 한다고 확신합니까?

 
Alexey Viktorov :

Artyom이 올바르게 말했지만 하나의 비교의 무의미함을 지적합니다.

CopyBuffer가 배열에 복사된 요소의 수를 반환하면 배열의 크기는 정확히 그 크기가 됩니다. 따라서 조건의 강조 표시된 부분은 첫 번째 부분을 단순히 복제합니다.

그리고 큰 소리로 생각하십시오. 지표와 어드바이저 코드를 보지 않았기 때문에 틀릴 수 있습니다. 신호가 period_find 범위에 있어야 한다고 확신합니까?

예 - 이것은 일종의 필터입니다. 신호의 주파수는 이에 따라 다릅니다.

 
Artyom Trishkin :

간단한 테스트 Expert Advisor를 사용하여 지표에서 데이터를 가져오는 테스트로 시작하고 테스트에 불필요한 기능이 많은 기사에서 가져오지 않습니다.

MQL 마법사에서 일반 EA를 생성하고 이를 사용하여 iCustom() 사용 연습

감사합니다. 좋은 조언입니다. 그렇게 할게요. 최소한 더 편리할 것입니다.

오늘은 시작하겠습니다.
 

로트의 정상화에서 무엇이 잘못되었는지 말해주십시오.

 double lot_= 0.01 ;
double minlot= 0.10 ;
 double LotNormalize( double lot_)
  {
   if (minlot== 0.001 )
     {
       return ( NormalizeDouble (lot_, 3 ));
     }
   if (minlot== 0.01 )
     {
       return ( NormalizeDouble (lot_, 2 ));
     }
   if (minlot== 0.10 )
     {
       return ( NormalizeDouble (lot_, 1 ));
     }

   return ( NormalizeDouble (lot_, 0 ));
  }