전문 고문 - 기타 질문 - 페이지 3

 
double LotCalculator(double lots)
  {
   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));
  }
 
honest_knave :
double LotCalculator( double lots){}

감사합니다.

그 코드 작성을 시작하고 싶습니다 :)

당신은 내 시간을 더 절약했습니다.

큰 감사를 드린다!

 
Lot Size에 대해 동일한 메시지를 받았습니다.
'OnChartEvent()'에서 'LotCalculator()'를 호출했는데 맞나요?
 

' MarketInfo & LotSize ' 계산을 위한 좋은 포럼을 찾고 있습니다.
좋은 포럼 유형을 아는 사람은 저와 공유해 주십시오.

감사해요.

 
내가 마지막 줄(NormalizeDouble)을 편집하기 전에 혹시 내 코드 조각을 사용했습니까? 내 게시물에서 당신의 게시물까지 단 3분이 남았고 거의 즉시 수정했습니다.
 
Max Enrik : 저는 제 EA에 NormalizeDouble 을 사용하고 있습니다. 하지만 ' NormalizeDouble ' 메시지가 걱정되지만 차트에는 다음과 같은 로트 크기 가 표시됩니다. 0.07

그래서 좋은 조언이 필요합니다.

02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble : 0.07000000000000001
02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
  1. NormalizeDouble은 double을 반환합니다. 부동 소수점은 소수점 이하 자릿수가 무한대이므로 부동 소수점을 이해하지 못하고 일부 숫자를 정확하게 표현할 수 없습니다. (예: 1/10.) 배정밀도 부동 소수점 형식 - Wikipedia, 무료 백과사전 == 피연산자도 참조하십시오. - MQL4 포럼
  2. 절대로 NormalizeDouble 을 사용하지 마십시오. 어떤 이유로. 엉터리입니다, 사용하지 마세요. 용도는 항상 틀리다
 
whroeder1 :
  1. 절대로 NormalizeDouble 을 사용하지 마십시오. 어떤 이유로. 엉터리입니다, 사용하지 마세요. 용도는 항상 틀리다

여전히 NormalizeDouble()이 필요하다고 생각합니다.

다음은 코드 조각을 사용하는 예입니다(MathFloor를 사용하는 예에도 동일하게 적용됨).

double NormalizeLots( double lots, string pair= "" ){
     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);
}

라고 불리는:

Print (NormalizeLots( 2 / 3.0 ));

결과:

0.7000000000000001

이제 코드가 조정되었습니다.

double NormalizeLots( double lots, string pair= "" ){
     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 ) );
}

결과:

0.7


 

 Result: 0.7000000000000001

"부동 소수점을 이해하지 못하고 일부 숫자를 정확하게 표현할 수 없습니다. (예: 1/10.) 배정밀도 부동 소수점 형식 - Wikipedia, 무료 백과사전 "의 어떤 부분이 명확하지 않습니까?

NormalizeDouble(0.7, 2)은 동일한 결과를 생성합니다(또는 0.699999999999999).

 
whroeder1 :

"부동 소수점을 이해하지 못하고 일부 숫자를 정확하게 표현할 수 없습니다. (예: 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 - NormalizeDouble : 0.07000000000000001
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에 대한 더 나은 책들에서도 꽤 많이 사용합니다.

애플리케이션에 따라 다를 수 있습니다. 디스플레이 문제는 주문 또는 수정 실패보다 덜 극적입니다.

개인적으로 나는 항상 정수 값으로 상향 변환하므로 거의 다루지 않습니다.