Experts: MQL5 Programming for Traders – 책의 소스 코드. 파트 7

 

MQL5 Programming for Traders – 책의 소스 코드. 파트 7:

책의 마지막 일곱 번째 부분에서는 MetaTrader 5용 프로그램을 개발할 때 유용한 MQL5 API의 고급 기능에 대해 설명합니다. 여기에는 맞춤형 종목 심볼, 내장된 경제 달력 이벤트에 대해서는 물론 네트워킹, 데이터베이스, 암호화와 같은 범용적인 기술이 포함됩니다.

MQL5 Programming for Traders – 책의 소스 코드. 파트 7

작성자: MetaQuotes

 
유용한 학습 리소스
 
학습
 
다음은 캘린더 캐시필터에 대한 작은 버그 수정 및 개선 사항입니다.
MQL5 Book: Advanced language tools / Economic calendar / Transferring calendar database to tester
MQL5 Book: Advanced language tools / Economic calendar / Transferring calendar database to tester
  • www.mql5.com
The calendar is available for MQL programs only online, and therefore testing news trading strategies poses some difficulties. One of the solutions...
파일:
 

이것이 오류인지 아니면 제가 이해하지 못한 것인지 알려주시겠습니까?

MarginProfitMeter.mqh 파일입니다.

// '현재' 금액을 '계정' 금액으로 변환합니다.
bool Convert(const string current, const string account,
             const bool ask, double &margin, const datetime moment = 0)
  {
   string rate;
   int dir = FindExchangeRate(current, account, rate);
   if(dir == +1)
     {
      margin *= moment == 0 ?
                SymbolInfoDouble(rate, ask ? SYMBOL_BID : SYMBOL_ASK) :
                GetHistoricPrice(rate, moment, ask);
     }
   else
      if(dir == -1)
        {
         margin /= moment == 0 ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask);
        }
      else
        {
         static bool once = false;
         if(!once)
           {
            Print("Can't convert ", current, " -> ", account);
            once = true;
           }
        }
   return true;
  }

0으로 나누는 것은 불가능하지 않나요?


또한 이 메서드는 마진을 반환해야 하지만 가격을 반환합니다. 이 가격에 계약 규모를 곱해야한다는 것을 알고 있지만 어디에서 올바르게 수행해야하는지 이해하지 못합니다.

이 함수에 추가해야 하나요, 아니면 어디에서 이 함수를 호출해야 하나요?

 
Aleksandr Slavskii #:

실수인지 아니면 제가 놓친 것이 있는지 알려주실 수 있나요?

파일 MarginProfitMeter.mqh

0으로 나누는 것은 불가능하지 않나요?

실제로 불가능합니다.

margin /= moment == 0 ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask);

나누기 기호 뒤에 할당 "/="가 있는 삼항 연산자가 있습니다. 따라서 momet==0이면

margin /= SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID)

그렇지 않으면

margin /= GetHistoricPrice(rate, moment, ask)

하지만 두 함수.... 모두에서 0에 대한 검사를 추가합니다.


또한 이 메서드는 마진을 반환해야 하지만 가격을 반환합니다. 어딘가에이 가격에 계약 규모를 곱해야한다는 것을 이해하지만 더 정확하게 수행하는 위치를 이해하지 못합니다....

설명으로 판단하면

// '현재' 금액을 '계정' 금액으로 변환합니다.

이 방법은 현재 돈 (통화)을 예금의 돈 (통화)으로 변환합니다. 그리고 코드로 판단하면 이 메서드는 마진을 입금 통화로 변환합니다.

성공하면 메서드는 참을 반환합니다. 또한 새로운, 수정된 증거금 금액을 계산하여 증거금 변수에 저장합니다. 이는 링크의 매개변수입니다:

double &margin

따라서 계산의 결과로 얻을 수 있습니다.

 
Denis Kirichenko #:

정말 불가능합니다.

나누기 기호 뒤에 할당 "/="가 있는 삼항 연산자가 있습니다. 따라서 momet==0이면

네, 맞아요, 삼항 연산자입니다. 오늘 아침 피곤해서 머리가 멍해지네요.


데니스 키리첸코 #:

설명으로 판단

이 메서드는 현재 돈(통화)을 예금 돈(통화)으로 변환합니다. 그리고 코드를 보면 마진을 입금 통화로 변환하는 메서드입니다.

아니요, 이제 그것도 맞습니다.


코드에 약간의 실수가 있었습니다.


결국 거래량이 3보다 많으면 여전히 마진이 잘못 계산되기 때문에 어쨌든 거의 쓸모가 없습니다.

EURUSD; margin = 24668.8  //  OrderCalcMargin()
EURUSD; margin = 10889.599999999999 // MarginProfitMeter.mqh 

10개의 계약에 대한 마진 계산.

 
Denis Kirichenko #:
margin /= moment == 0? SymbolInfoDouble(rate, ask ? SYMBOL_ASK: SYMBOL_BID): GetHistoricPrice(rate, moment, ask);

조금 잘못되었습니다.(마진 /= 모멘트)==0 조건과 삼항 연산자...

 
Alexey Viktorov #:

조금 잘못되었습니다. (마진 /= 모멘트)==0 조건과 삼항 연산자...

왠지 동의하지 않습니다. 이 조건을 먼저 충족시켜 보세요:

double margin = 1.5;
datetime moment = 0;
margin /= moment;

그러면 고슴도치를 고슴도치로 나누는 것인데, 그 자체로 의문입니다.

그리고 할당 연산은 우선 순위가 매우 낮고 zpt만 우선 순위가 낮습니다.

컴파일러도 화가 납니다:

possible loss of data due to type conversion from 'datetime' to 'double'

그리고 함수의 논리는 마진 변환입니다. 제가 알기로는 모멘트 = 0은 지금입니다. 그럼:

margin /= moment == 0 ?
                SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                GetHistoricPrice(rate, moment, ask);

지금이면 현재 가격을 요청한다는 뜻입니다. 그리고 과거 가격이라면 과거 가격을 참조합니다. 그리고 원하는 가격을 얻은 후 맨 마지막에 마진 값을이 가격으로 할당....으로 나눕니다. 그리고 귀하의 논리를 사용하면 순간 = 0에서 마진 전환이 아니라 시장 가격 또는 과거의 가격 만 얻을 수 있습니다.....


일반적으로 교과서에서는 괄호 안에 쓰는 것이 좋습니다:

margin /= (moment == 0) ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask);
 
Denis Kirichenko #:

왠지 동의할 수 없습니다. 그 조건을 먼저 충족해 보세요:

그러면 고슴도치가 고슴도치로 나뉘는데, 그 자체로 이미 의문입니다.

그리고 할당 작업은 우선 순위가 매우 낮고 zpt만 우선 순위가 낮습니다.

그리고 컴파일러도 화가 납니다:

그리고 함수의 논리는 마진 변환입니다. 제가 알기로는 모멘트 = 0은 지금입니다. 그럼...:

지금이면 현재 가격을 요청한다는 뜻입니다. 그리고 그것이 과거에 있다면 과거 가격을 참조합니다. 그리고 원하는 가격을 얻은 후 맨 마지막에 마진 값을이 가격으로 할당....으로 나눕니다. 그리고 당신의 논리에 따르면 순간 = 0이면 마진 전환이 아니라 시장 가격이나 과거의 가격 만 얻을 수 있습니다...


일반적으로 교과서에서는 괄호 안에 쓰는 것이 좋습니다:

설득력이 있습니다. 동의합니다, 저는 부주의했습니다. 그러나 교과서를 위해 글을 쓰고 나에게도 이해할 수 있도록 다음과 같이 작성하면 더 좋을 것입니다.

margin /= ( moment == 0 ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask));