//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart () { //--- get minimum stop level double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL ); Print ( "Minimum Stop Level=" ,minstoplevel, " points" ); double price= Ask ; //--- calculated SL and TP prices must be normalized double stoploss= NormalizeDouble ( Bid -minstoplevel* Point , Digits ); double takeprofit= NormalizeDouble ( Bid +minstoplevel* Point , Digits ); //--- place market order to buy 1 lot int ticket= OrderSend ( Symbol (), OP_BUY , 1 ,price, 3 ,stoploss,takeprofit, "My order" , 16384 , 0 , clrGreen ); if (ticket< 0 ) { Print ( "OrderSend failed with error #" , GetLastError ()); } else Print ( "OrderSend placed successfully" ); //--- }
MQL4 문서는 대부분의 예제에서 NormalizeDouble() 함수를 사용하기 때문에 이것은 사람들에게 혼동을 줄 수 있습니다.
정규화되지 않은 가격을 적용할 수 없다는 경고도 있습니다.
메모
시장가 주문(OP_SELL 또는 OP_BUY) 개시 시 Bid(매도) 또는 Ask(매수)의 최신 가격만 Open Price로 사용할 수 있습니다. 현재와 다른 보안으로 작업을 수행하는 경우 이 보안에 대한 최신 시세를 얻으려면 MarketInfo() 함수를 MODE_BID 또는 MODE_ASK 매개변수와 함께 사용해야 합니다.
계산되거나 정규화되지 않은 가격은 적용할 수 없습니다. 가격 쓰레드에 요청된 시가가 없거나 소수점 이하 자릿수에 따라 정규화되지 않은 경우 129(ERR_INVALID_PRICE) 오류가 발생합니다. 요청한 시가가 완전히 오래된 경우 오류 138(ERR_REQUOTE)이 슬리피지 매개변수에 독립적으로 생성됩니다. 요청한 가격이 오래되었지만 스레드에 있는 경우 현재 가격이 price+-slippage 범위 내에 있는 경우에만 현재 가격으로 주문이 열립니다.
그리고 MQL에 대한 더 나은 책들에서도 꽤 많이 사용합니다.
애플리케이션에 따라 다를 수 있습니다. 디스플레이 문제는 주문 또는 수정 실패보다 덜 극적입니다.
{
double minlot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
maxlot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX),
lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lots = MathFloor(lots/lotstep)*lotstep;
lots = MathMax(lots,minlot);
lots = MathMin(lots,maxlot);
return(NormalizeDouble(lots,2));
}
감사합니다.
그 코드 작성을 시작하고 싶습니다 :)
당신은 내 시간을 더 절약했습니다.
큰 감사를 드린다!
' MarketInfo & LotSize ' 계산을 위한 좋은 포럼을 찾고 있습니다.
좋은 포럼 유형을 아는 사람은 저와 공유해 주십시오.
감사해요.
그래서 좋은 조언이 필요합니다.
02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
여전히 NormalizeDouble()이 필요하다고 생각합니다.
다음은 코드 조각을 사용하는 예입니다(MathFloor를 사용하는 예에도 동일하게 적용됨).
if (pair == "" ) pair = Symbol ();
double lotStep = MarketInfo (pair, MODE_LOTSTEP ),
minLot = MarketInfo (pair, MODE_MINLOT );
lots = MathRound (lots/lotStep) * lotStep;
if (lots < minLot) lots = 0 ; // or minLot
return (lots);
}
라고 불리는:
결과:
이제 코드가 조정되었습니다.
if (pair == "" ) pair = Symbol ();
double lotStep = MarketInfo (pair, MODE_LOTSTEP ),
minLot = MarketInfo (pair, MODE_MINLOT );
lots = MathRound (lots/lotStep) * lotStep;
if (lots < minLot) lots = 0 ; // or minLot
return ( NormalizeDouble (lots, 2 ) );
}
결과:
Result: 0.7000000000000001
"부동 소수점을 이해하지 못하고 일부 숫자를 정확하게 표현할 수 없습니다. (예: 1/10.) 배정밀도 부동 소수점 형식 - Wikipedia, 무료 백과사전 "의 어떤 부분이 명확하지 않습니까?
NormalizeDouble(0.7, 2)은 동일한 결과를 생성합니다(또는 0.699999999999999).
"부동 소수점을 이해하지 못하고 일부 숫자를 정확하게 표현할 수 없습니다. (예: 1/10.) 배정밀도 부동 소수점 형식 - Wikipedia, 무료 백과사전 "의 어떤 부분이 명확하지 않습니까?
NormalizeDouble(0.7, 2)은 동일한 결과를 생성합니다(또는 0.699999999999999).
유효한 OrderSend에 NormalizeDouble()이 필요하다는 말은 아닙니다. 이것이 내 첫 번째 코드 스니펫에서 제외된 이유입니다. 부동 소수점 숫자가 표시되는 방식에 대해서도 명확하지 않습니다.
OP 문제(기본적으로 디스플레이 문제, "lot normalizer" 코드에서 NormalizeDouble()를 사용하거나 값을 표시해야 함).
내가 OP를 잘못 이해했을 수도 있습니다.
02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
(불필요한 간결함을 제거하기 위해 편집됨)
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
{
//--- get minimum stop level
double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
Print ( "Minimum Stop Level=" ,minstoplevel, " points" );
double price= Ask ;
//--- calculated SL and TP prices must be normalized
double stoploss= NormalizeDouble ( Bid -minstoplevel* Point , Digits );
double takeprofit= NormalizeDouble ( Bid +minstoplevel* Point , Digits );
//--- place market order to buy 1 lot
int ticket= OrderSend ( Symbol (), OP_BUY , 1 ,price, 3 ,stoploss,takeprofit, "My order" , 16384 , 0 , clrGreen );
if (ticket< 0 )
{
Print ( "OrderSend failed with error #" , GetLastError ());
}
else
Print ( "OrderSend placed successfully" );
//---
}
MQL4 문서는 대부분의 예제에서 NormalizeDouble() 함수를 사용하기 때문에 이것은 사람들에게 혼동을 줄 수 있습니다.
정규화되지 않은 가격을 적용할 수 없다는 경고도 있습니다.
메모
시장가 주문(OP_SELL 또는 OP_BUY) 개시 시 Bid(매도) 또는 Ask(매수)의 최신 가격만 Open Price로 사용할 수 있습니다. 현재와 다른 보안으로 작업을 수행하는 경우 이 보안에 대한 최신 시세를 얻으려면 MarketInfo() 함수를 MODE_BID 또는 MODE_ASK 매개변수와 함께 사용해야 합니다.
계산되거나 정규화되지 않은 가격은 적용할 수 없습니다. 가격 쓰레드에 요청된 시가가 없거나 소수점 이하 자릿수에 따라 정규화되지 않은 경우 129(ERR_INVALID_PRICE) 오류가 발생합니다. 요청한 시가가 완전히 오래된 경우 오류 138(ERR_REQUOTE)이 슬리피지 매개변수에 독립적으로 생성됩니다. 요청한 가격이 오래되었지만 스레드에 있는 경우 현재 가격이 price+-slippage 범위 내에 있는 경우에만 현재 가격으로 주문이 열립니다.
그리고 MQL에 대한 더 나은 책들에서도 꽤 많이 사용합니다.
애플리케이션에 따라 다를 수 있습니다. 디스플레이 문제는 주문 또는 수정 실패보다 덜 극적입니다.
개인적으로 나는 항상 정수 값으로 상향 변환하므로 거의 다루지 않습니다.