- www.mql5.com
이것이 오류인지 아니면 제가 이해하지 못한 것인지 알려주시겠습니까?
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으로 나누는 것은 불가능하지 않나요?
또한 이 메서드는 마진을 반환해야 하지만 가격을 반환합니다. 이 가격에 계약 규모를 곱해야한다는 것을 알고 있지만 어디에서 올바르게 수행해야하는지 이해하지 못합니다.
이 함수에 추가해야 하나요, 아니면 어디에서 이 함수를 호출해야 하나요?
실수인지 아니면 제가 놓친 것이 있는지 알려주실 수 있나요?
파일 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 따라서 계산의 결과로 얻을 수 있습니다.
네, 맞아요, 삼항 연산자입니다. 오늘 아침 피곤해서 머리가 멍해지네요.
아니요, 이제 그것도 맞습니다.
코드에 약간의 실수가 있었습니다.
결국 거래량이 3보다 많으면 여전히 마진이 잘못 계산되기 때문에 어쨌든 거의 쓸모가 없습니다.
EURUSD; margin = 24668.8 // OrderCalcMargin() EURUSD; margin = 10889.599999999999 // MarginProfitMeter.mqh
10개의 계약에 대한 마진 계산.
왠지 동의하지 않습니다. 이 조건을 먼저 충족시켜 보세요:
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);
왠지 동의할 수 없습니다. 그 조건을 먼저 충족해 보세요:
그러면 고슴도치가 고슴도치로 나뉘는데, 그 자체로 이미 의문입니다.
그리고 할당 작업은 우선 순위가 매우 낮고 zpt만 우선 순위가 낮습니다.
그리고 컴파일러도 화가 납니다:
그리고 함수의 논리는 마진 변환입니다. 제가 알기로는 모멘트 = 0은 지금입니다. 그럼...:
는 지금이면 현재 가격을 요청한다는 뜻입니다. 그리고 그것이 과거에 있다면 과거 가격을 참조합니다. 그리고 원하는 가격을 얻은 후 맨 마지막에 마진 값을이 가격으로 할당....으로 나눕니다. 그리고 당신의 논리에 따르면 순간 = 0이면 마진 전환이 아니라 시장 가격이나 과거의 가격 만 얻을 수 있습니다...
일반적으로 교과서에서는 괄호 안에 쓰는 것이 좋습니다:
설득력이 있습니다. 동의합니다, 저는 부주의했습니다. 그러나 교과서를 위해 글을 쓰고 나에게도 이해할 수 있도록 다음과 같이 작성하면 더 좋을 것입니다.
margin /= ( moment == 0 ? SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) : GetHistoricPrice(rate, moment, ask));
MQL5 Programming for Traders – 책의 소스 코드. 파트 7:
책의 마지막 일곱 번째 부분에서는 MetaTrader 5용 프로그램을 개발할 때 유용한 MQL5 API의 고급 기능에 대해 설명합니다. 여기에는 맞춤형 종목 심볼, 내장된 경제 달력 이벤트에 대해서는 물론 네트워킹, 데이터베이스, 암호화와 같은 범용적인 기술이 포함됩니다.
작성자: MetaQuotes