mql4 언어의 기능, 미묘함 및 작업 방법 - 페이지 10

 
Alexey Viktorov :

놀라움이 무엇인지 알 수 없습니다. 문서 오른쪽에 있는 네 가지 항목에는 주문 유형의 int 값이 있습니다.

OP_BUY

0

구입

OP_SELL

하나

판매

OP_BUYLIMIT

2

BUY LIMIT 대기 중인 주문

OP_SELLLIMIT

보류 중인 주문 SELL LIMIT

OP_BUYSTOP

4

보류 중인 주문 BUY STOP

OP_SELLSTOP

5

보류 중인 주문 SELL STOP


#define OP_BALANCE 6
#define OP_CREDIT 7

따라서 6개의 셀로 구성된 배열을 사용하면 때때로 범위를 벗어날 수 있습니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

EA 댓글을 왼쪽에서 오른쪽으로 옮기고 싶습니까?

fxsaber , 2018.07.10 15:13

 // Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0 , const uint Y = 0 )
{
   string Shift = NULL ;
  
   StringInit (Shift, X >> 2 , ' ' );
  
   if ( StringLen (Shift))
  {
     StringReplace (Str, "\n" , "\n" + Shift);
    
    Str = Shift + Str;
  }
  
   if (Y)
  {
     StringInit (Shift, Y / 14 , '\n' );
    
    Str = Shift + Str;
  }
  
   Comment (Str);  
}


애플리케이션

 void OnStart ()
{
   const uint Height = 200 ;
   const uint Width = 200 ;
  
   while (! IsStopped ())
  {
    CommentXY( "Hello World!\nCommentXY" , MathRand () * Width / SHORT_MAX , MathRand () * Height / SHORT_MAX ); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
     Sleep ( 200 );
  }
}
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

역사상 마지막 주문을 선택하는 방법은 무엇입니까?

fxsaber , 2018.07.17 03:27

MT4 거래 내역은 마감 시간으로 정렬되며 이 규칙은 변경되지 않습니다.

 
fxsaber :

개발자의 공식 답변이 있습니까? 지금까지 나는 당신 자신이 찾고 생각하고 결정한 것을 보았습니다.

 
Artyom Trishkin :

개발자의 공식 답변이 있습니까? 지금까지 나는 당신 자신이 찾고 생각하고 결정한 것을 보았습니다.

"독립" 수준에 대한 나의 결론은 이 스레드의 시작 부분에 있는 결론보다 결코 우월하지 않습니다.

주문 유형 과 이 유형에 해당하는 가격을 정의할 필요가 없습니다. OrderClosePrice() 가격으로 닫기를 작성하는 것으로 충분합니다.


편집증/넌센스가 되지 마십시오.

 
fxsaber :

"독립" 수준에 대한 나의 결론은 이 스레드의 시작 부분에 있는 결론보다 결코 우월하지 않습니다.


편집증/넌센스가 되지 마십시오.

고문이 하룻밤 사이에 무너지면서 "편집증"으로 고통받지 않은 대부분의 사람들이 긴급하게 코드를 다시 작성하는 시간을 갖지 못했을 것입니다. 정렬 종속성 때문입니다. 오랜 시간이 흘렀지만 사람들은 여전히 기억을 가지고 있습니다. 그들과 마주친 사람들은 정렬과 무관한 코드를 작성하기 시작했습니다. 나는 실행하지 않았습니다. 포럼에서 읽고 메모했습니다.

 
Artyom Trishkin :

고문이 하룻밤 사이에 무너지면서 "편집증"으로 고통받지 않은 대부분의 사람들이 긴급하게 코드를 다시 작성하는 시간을 갖지 못했을 것입니다. 정렬 종속성 때문입니다. 오랜 시간이 흘렀지만 사람들은 여전히 기억을 가지고 있습니다. 그들과 마주친 사람들은 정렬과 무관한 코드를 작성하기 시작했습니다. 나는 실행하지 않았습니다. 포럼에서 읽고 메모했습니다.

불행히도, 이 신화는 포럼의 역사에서 어떤 증거도 찾지 못합니다. 또한 개발자들은 이러한 변경이 근본적으로 불가능하다는 입장을 지속적으로 분명히 밝히고 있습니다.


예를 들어 다음과 같이 안전하게 작성할 수 있습니다.

 if ( OrderType () <= OP_SELL )
  ReverseType = 1 - OrderType ();


대신에

 if (( OrderType () == OP_BUY ) || ( OrderType () == OP_SELL ))
  ReverseType = ( OrderType () == OP_BUY ) ? OP_SELL : OP_BUY ;


마음껏 쓰세요

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql4 언어의 기능, 미묘함 및 작업 방법

fxsaber , 2018.04.03 16:15

 double Lots[] = { 0 , 0 , 0 , 0 , 0 , 0, 0, 0 };

for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS ))
    Lots[ OrderType ()] += OrderLots ();

등.

 
fxsaber :

불행히도, 이 신화는 포럼의 역사에서 어떤 확증도 찾지 못합니다. 또한 개발자들은 이러한 변경이 근본적으로 불가능하다는 입장을 지속적으로 분명히 밝혔습니다.

예를 들어 다음과 같이 안전하게 작성할 수 있습니다.


왜 이러한 모든 유사 최적화, 뉘앙스를 지속적으로 기억해야 합니까? 이와 같은 가정에 의존하지 않는 코드를 작성하는 것이 정말로 그렇게 어려운 가요? 컴파일러의 뉘앙스에 대한 약간의 지식을 보여주지만 전혀 인식하기 쉬운 것이 아니라는 사실 외에 그러한 구성의 요점은 무엇입니까?

 
Ihor Herasko :

왜 이러한 모든 유사 최적화, 뉘앙스를 지속적으로 기억해야 합니까? 이와 같은 가정에 의존하지 않는 코드를 작성하는 것이 정말로 그렇게 어려운 가요? 컴파일러의 뉘앙스에 대한 약간의 지식을 보여주지만 전혀 인식하기 쉬운 것이 아니라는 사실 외에 그러한 구성의 요점은 무엇입니까?

이상하게도 그러한 코드를 읽는 데 문제가 없습니다. 또한 읽기 및 이해가 "표준"보다 빠릅니다.

음, 위의 Lottes[] 예제는 코드가 매우 간결하고 절대적으로 이해할 수 있는 방법을 보여주는 진정한 보물입니다. 그리고 이것은 "표준" 스타일이 결코 아닙니다.

아마도 많은 Market / Freelance 작품의 소스를 보면 "정식" 코드의 족쇄뿐만 아니라 끔찍한 성능 비효율과 똑같이 중요한 요소인 읽을 때 코드 이해를 보게 될 것입니다.


계속에 대한 지울 수 없는 사랑은 언어의 가능성에 대한 완전한 무시입니다. 100줄의 코드는 동일한 작업을 수행하는 200줄의 코드보다 훨씬 더 읽기 쉽습니다. 이러한 이유로 처음에는 사람들이 MQL5에 대해 불평했습니다. MT5에 대한 KB의 MT4 코드 수정 사항을 보십시오. TS의 논리를 이해하는 것은 매우 어렵습니다(코드가 몇 배 더 큼). 원래 MT4로 가서 코드를 보는 것이 더 쉽습니다.

 
fxsaber :

이상하게도 그런 코드를 읽는 데 문제가 없습니다. 또한 읽기 및 이해가 "표준"보다 빠릅니다.

많은 소프트웨어 회사에서는 그러한 코드에 대해 모든 손가락을 때릴 것입니다. 항상 어디서나 필요한 첫 번째 것은 "추가 읽기"가 없다는 것입니다. 예를 들어, 함수를 입력할 때 조건이 사용되는 경우:

 if (<условие>)
{
}

다음과 같이 작성하는 것이 좋습니다.

 if (!<условие>)
   return ;

이 접근 방식은 중첩 조건에 많은 도움이 됩니다.

음, 위의 Lottes[] 예제는 코드가 매우 간결하고 절대적으로 이해할 수 있는 방법을 보여주는 진정한 보물입니다. 그리고 이것은 "표준" 스타일이 결코 아닙니다.

다시 한 번 - 손가락을 치십시오. 결국 아무도 OrderType() 함수가 반환한 내용을 확인하지 않았습니다. 아니면 그녀가 -1 또는 6을 반환했습니까? 이것은 컴파일러 속성에 대한 바인딩의 예이며 항상 멀리해야 합니다. 당신은 크로스 플랫폼 코드의 많은 예를 제공합니다. 그렇다면 왜 이 사건에 그를 놔두는 겁니까? MQ의 새 컴파일러가 릴리스되고 이 코드는 더 이상 올바르게 작동하지 않습니다.

계속에 대한 같은 지울 수 없는 사랑 - 언어의 가능성에 대한 완전한 무시. 100줄의 코드는 동일한 작업을 수행하는 200줄의 코드보다 훨씬 더 읽기 쉽습니다. 이러한 이유로 처음에는 사람들이 MQL5에 대해 불평했습니다. MT5에 대한 KB의 MT4 코드 수정 사항을 보십시오. TS의 논리를 이해하는 것은 매우 어렵습니다(코드가 몇 배 더 큼). 원래 MT4로 가서 코드를 보는 것이 더 쉽습니다.

계속해서 같은 상황입니다. 유형 코드:

 if ( OrderSelect (i, SELECT_BY_POS ) && OrderSymbol () == Symbol () && OrderMagicNumber () == m_nMagicNumber)
{
}

다음보다 읽기가 더 어렵습니다.

 if (! OrderSelect (i, SELECT_BY_POS ))
   continue ;

if ( OrderSymbol () != Symbol ())
   continue ;

if ( OrderMagicNumber () != m_nMagicNumber)
   continue ;
그러나 두 경우 모두 실행 효율성은 동일합니다.
사유: