MQL4 문서에 대한 토론 - 페이지 18

 
그래서 ... 정답을 보니:

무효 SendMail( 문자열 제목, 문자열 some_text)
"메일" 탭의 설정 창에 지정된 주소로 이메일을 보냅니다.
테스트 모드에서는 기능이 작동하지 않습니다. 이 함수는 사용자 지정 표시기에서도 호출할 수 없습니다.
설정에서 전송이 금지될 수 있으며, 이메일 주소도 지정되지 않을 수 있습니다. 오류에 대한 정보를 얻으려면 GetLastError() 함수를 호출해야 합니다.
[...]

인디케이터에서는 확인을 하지 않았다고 고백합니다... :)

Z.Y. 나는 주제의 제목에 대해 항의하고 예를 들어 다음과 같이 이름을 바꿀 것을 제안합니다. "내장 MQL4 문서 개선: 부정확성과 단점 제거". 그런 것.
 
OrderSelect () 함수의 예에서 다음 표현식을 만났습니다.
if(OrderSelect(12470, SELECT_BY_TICKET)==true) ...
그런 다음 나는 문서의 다른 곳에서 같은 것을 만났습니다.

설명해주세요, 이것은 단지 프로그래밍 스타일인가요?
그렇지 않은 경우 부울 변수에 대해 비교 연산을 사용해야 하는 이유는 무엇입니까?
더 간단한 표현이 사용되지 않는 이유:
if(OrderSelect(12470, SELECT_BY_TICKET)) ...
 
Yurixx :
더 간단한 표현이 사용되지 않는 이유:

첫 번째 표현은 더 직관적이며 초보자에게 특히 혼동을 주지 않지만 두 번째 표현이 더 널리 사용됩니다.
 
형식 매개변수 는 무엇이며 참조로 전달된 매개변수와 어떤 관련이 있습니까?
 
종종 값을 계산하는 함수에는 일부 매개변수가 입력으로 필요합니다. 예를 들어 OrderSend() 함수를 보면 다음과 같은 매개변수가 전달됩니다.
  • 상징
  • 주문 유형
  • 로트의 위치 볼륨
  • 개점가
  • 점에서 미끄러짐
등. 함수에 전달되는 매개변수는 호출된 함수의 작동 중에 어떤 식으로든 변경되지 않는 매개변수와 처리할 수 있는 매개변수의 두 가지 유형이 있습니다.
예를 들어 다음 기능을 고려하십시오.

 //+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString ( string & ArrayRes [] , string InputString , string splitter )
  {
   string temp , tempArray [ 100 ] ;
   int pos , splitLength = StringLen ( splitter ) , InputStrLength = StringLen ( InputString ) , counter ;
 
   pos = StringFind ( InputString , splitter ) ;
   if ( pos !=- 1 )
      {
      if ( pos == 0 ) InputString = StringSubstr ( InputString , splitLength , InputStrLength - splitLength ) ;
      while ( StringFind ( InputString , splitter ) !=- 1 )
         {
         pos = StringFind ( InputString , splitter ) ;
         InputStrLength = StringLen ( InputString ) ;
         tempArray [ counter ] = StringSubstr ( InputString , 0 , pos ) ;
         InputString = StringSubstr ( InputString , pos + splitLength , InputStrLength - splitLength - pos ) ;
         counter ++;
         }
      if ( StringLen ( InputString ) != 0 )
         {
         tempArray [ counter ] = InputString ;
         counter ++;
         }   
      }
   ArrayResize ( ArrayRes , counter ) ;
   for ( int i = 0 ; i < counter ; i ++ )  
      {
      ArrayRes [ i ] = tempArray [ i ] ;
      Print ( " i= " , i , "   string= " , ArrayRes [ i ]) ;
      }
   return ;   
  }
3개의 매개변수가 SplitString()에 전달됩니다. 참조에 의한 ArrayRes 배열(앞에 앰퍼샌드 &가 있음) 및 2개의 형식 매개변수 InputStrung(부분에 대해 구문 분석할 문자열) 및 스플리터 문자열(분석할 때 구분 기호) .
이 함수가 실행된 후 ArraRes 배열에는 여러 문자열이 포함됩니다. MQL4의 함수 자체에는 복잡한 유형(예: 배열)을 반환하는 기능이 없지만 참조로 매개변수를 전달하여 이 제한을 우회합니다.

전체 스크립트는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright " Copyright © 2007, MetaQuotes Software Corp. "
#property link      " https://www.metaquotes.net/ru/ "
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString ( string & ArrayRes [] , string InputString , string splitter )
  {
   string temp , tempArray [ 100 ] ;
   int pos , splitLength = StringLen ( splitter ) , InputStrLength = StringLen ( InputString ) , counter ;
 
   pos = StringFind ( InputString , splitter ) ;
   if ( pos !=- 1 )
      {
      if ( pos == 0 ) InputString = StringSubstr ( InputString , splitLength , InputStrLength - splitLength ) ;
      while ( StringFind ( InputString , splitter ) !=- 1 )
         {
         pos = StringFind ( InputString , splitter ) ;
         InputStrLength = StringLen ( InputString ) ;
         tempArray [ counter ] = StringSubstr ( InputString , 0 , pos ) ;
         InputString = StringSubstr ( InputString , pos + splitLength , InputStrLength - splitLength - pos ) ;
         counter ++;
         }
      if ( StringLen ( InputString ) != 0 )
         {
         tempArray [ counter ] = InputString ;
         counter ++;
         }   
      }
   ArrayResize ( ArrayRes , counter ) ;
   for ( int i = 0 ; i < counter ; i ++ )  
      {
      ArrayRes [ i ] = tempArray [ i ] ;
      Print ( " i= " , i , "   string= " , ArrayRes [ i ]) ;
      }
   return ;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ()
  {
//----
   string strInfo = " aae|aer3|dzse|faw323 " ;
   string strResult [] ;
   
   SplitString ( strResult , strInfo , " | " ) ;
   
   int N = ArraySize ( strResult ) ;
   if ( N > 0 )
      {
      for ( int i = 0 ; i < N ; i ++ ) Print ( " strResult[ " , i , " ]= " , strResult [ i ]) ;
      }
//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
직접 실행하고 작업 결과를 보십시오.
 
여기에 또 다른 불행한 문서가 있습니다.

더블 주문닫기가격( )
선택한 주문의 종가를 반환합니다.
OrderSelect() 함수를 사용하여 주문을 미리 선택해야 합니다.
예시:
 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     날짜 시간 ctm=주문열기 시간();
     if(ctm>0) Print("10주문 오픈시간", ctm);
     ctm=주문닫기시간();
     if(ctm>0) Print("10주문 마감시간", ctm);
    }
  또 다른
    Print("주문 선택 실패 오류 코드는",GetLastError());

OrderClosePrice 함수에 대한 설명 및 OrderClosePrice 함수에 대한 예입니다.
이것이 아마도 검토된 Expert Advisors의 99%가 주문 유형에 대해 완전히 불필요한 분석을 수행하는 이유일 것입니다.
 if ( OrderType () == OP_BUY ) OrderClose (OrderTicket(), OrderLots(), Bid, 0 );
그냥 쓸 수 있을 때
 OrderClose ( OrderT icket () , OrderLots () , OrderClosePrice () , 0 )
 
네, 지난 주에 그 순간을 포착했습니다. 나는 다음과 같이 생각한다.

 if ( OrderSelect ( 10 , SELECT_BY_POS , MODE_HISTORY ) == true )
    {
     datetime  ctm = OrderOpenTime () ; if ( ctm > 0 )
     Print ( " Open time for the order 10 " , TimeToStr ( ctm )) ; 
     double price = OrderClosePrice () ;
     if ( price > 0 ) Print ( " Close price for the order 10 " , DoubleToStr ( price , MarketInfo ( OrderSymbol () , MODE_DIGITS ))) ;
    }
  else
    Print ( " OrderSelect failed error code is " , GetLastError ()) ;
 
인용문
------
3개의 매개변수가 SplitString()에 전달됩니다. 참조에 의한 ArrayRes 배열(앞에 앰퍼샌드 &가 있음) 및 2개의 형식 매개변수 InputStrung(부분에 대해 구문 분석할 문자열) 및 스플리터 문자열(분석할 때 구분 기호) .
이 함수가 실행된 후 ArraRes 배열에는 여러 문자열이 포함됩니다. MQL4의 함수 자체에는 복잡한 유형(예: 배열)을 반환하는 기능이 없지만 참조로 매개변수를 전달하여 이 제한을 우회합니다.
------

이해 했어요. 왜 그들을 "공식"이라고 불렀는지 이해가 되지 않습니다. 순전히 형식적으로 전달되는 이러한 매개변수는 그대로입니까? C에는 그런 것이 없습니다.

매개변수 유형에 대한 설명이 "함수" 섹션이 아니라 "변수" 섹션에 설명되어 있는 이유는 무엇입니까?
 
cout :
이해 했어요. 왜 그들을 "공식"이라고 불렀는지 이해가 되지 않습니다. 순전히 형식적으로 전달되는 이러한 매개변수는 그대로입니까? C에는 그런 것이 없습니다.


함수에 전달된 변수는 변수가 아니라 값으로 공식적으로 전달되기 때문입니다. 변수를 사용하면 일종의 조작(값 변경)을 수행할 수 있지만 값을 사용하면 그러한 조작이 낭비됩니다.
다음은 이 예의 다른 버전입니다.

 //+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright " Copyright © 2007, MetaQuotes Software Corp. "
#property link      " https://www.metaquotes.net/ru/ "
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString ( string & ArrayRes [] , string InputString , string splitter )
  {
   string temp , tempArray [ 100 ] ;
   int pos , splitLength = StringLen ( splitter ) , InputStrLength = StringLen ( InputString ) , counter ;
 
   pos = StringFind ( InputString , splitter ) ;
   if ( pos !=- 1 )
      {
      if ( pos == 0 ) InputString = StringSubstr ( InputString , splitLength , InputStrLength - splitLength ) ;
      while ( StringFind ( InputString , splitter ) !=- 1 )
         {
         pos = StringFind ( InputString , splitter ) ;
         InputStrLength = StringLen ( InputString ) ;
         tempArray [ counter ] = StringSubstr ( InputString , 0 , pos ) ;
         InputString = StringSubstr ( InputString , pos + splitLength , InputStrLength - splitLength - pos ) ;
         counter ++;
         }
      if ( StringLen ( InputString ) != 0 )
         {
         tempArray [ counter ] = InputString ;
         counter ++;
         }   
      }
   ArrayResize ( ArrayRes , counter ) ;
   for ( int i = 0 ; i < counter ; i ++ )  
      {
      ArrayRes [ i ] = tempArray [ i ] ;
      Print ( " i= " , i , "   string= " , ArrayRes [ i ]) ;
      }
   InputString = " Входная строка " ;
   splitter = " разделитель " ;
   Print ( " InputString= " , InputString , "    splitter= " , splitter ) ;
   return ;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ()
  {
//----
   string strInfo = " aae|aer3|dzse|faw323 " ;
   string strResult [] ;
   string devider = " | " ;
   SplitString ( strResult , strInfo , devider ) ;
   
   int N = ArraySize ( strResult ) ;
   if ( N > 0 )
      {
      for ( int i = 0 ; i < N ; i ++ ) Print ( " strResult[ " , i , " ]= " , strResult [ i ]) ;
      }
   Print ( " strInfo= " , strInfo , "    devider= " , devider ) ;   
//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
 
글쎄, 그것들을 "값으로 매개변수 전달 "이라고 부르십시오.
형식적으로는 그 값에 의존하는 것이 없음을 의미합니다. 예를 들어 향후 사용을 위해 예약되어 있습니다. 그러나 결국 값으로 전달된 매개변수에 따라 달라지는 것이 있습니다. 그렇지 않으면 형식적 :)이라고 부를 수 있습니다.