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

 
  1. 예, 그들은 그것을 많이 사용합니다. 모두 화폐만 있을 때 쓰여졌습니다. 이제 금속이 있고 틱 크기 != 포인트인 경우 평면이 잘못되었습니다.
  2. 02 : 00 : 00.069 - 맞춤형 전문가 EURUSD,H1: | _lotSize - NormalizeDouble : 0.07000000000000001
    OP는 15자리까지 두 배를 계속 인쇄하며 정확히 0.07이 아닌 이유를 이해할 수 없습니다. 어떤 숫자는 정확히 1/8을 나타낼 수 없기 때문입니다. 1/10 수 있습니다. 할 수 없습니다.
 
honest_knave :
double  LotCalculator( double  lots)
  {
   ...
    return ( NormalizeDouble (lots, 2 ));
  }

이 의견은 정말 많은 도움이 되며 유용하지만 소수점 이하 자릿수를 더 많이 줍니다.
(더 많은 소수가 정상입니다 - 이미 그것에 대해 읽었기 때문에)

나는 여전히 ' NormalizeDouble '에 대해 걱정하고 'NormalizeDouble'보다 더 나은 다른 방법을 찾고 있습니다.

감사해요!

 

댓글을 써주신 분들께 진심으로 감사드립니다.

@whroeder1 - 귀하의 의견(/링크)을 광범위하게 조사하겠습니다. 감사합니다.
@Marco - LotSize LotStep 문제 이후에 사용하겠습니다. 감사해요!

 
Max Enrik :

이 의견은 정말 많은 도움이 되며 유용하지만 소수점 이하 자릿수를 더 많이 줍니다.
(더 많은 소수가 정상입니다 - 이미 그것에 대해 읽었기 때문에)

나는 여전히 ' NormalizeDouble '에 대해 걱정하고 'NormalizeDouble'보다 더 나은 다른 방법을 찾고 있습니다.

감사해요!

아마도 당신이 성취하고자 하는 바를 정확히 설정하는 것이 가장 좋을 것입니다.

함수 가 주문을 위한 유효한 로트 크기를 반환하도록 하려면 NormalizeDouble() 을 사용할 필요가 없습니다. 내 원래 코드 스니펫 또는 WHRoeder가 이를 달성할 것입니다. 그들 사이에는 개인 취향의 문제가 될 미묘한 차이가 있습니다.

그러나 해당 로트 값에 대해 직접 Print()를 수행하면 0.07000000000000001과 같은 "이상한" 결과를 얻을 수 있습니다.

이것은 OrderSend()의 경우 문제가 되지 않지만 예상한 것과 다를 수 있습니다.

숫자가 "정상적인" 방식으로 표시되도록 하려면 다음 두 가지를 선택할 수 있습니다.

1. 함수에서 NormalizeDouble()을 사용할 수 있습니다. 표준 인쇄물의 경우 값은 예상한 대로입니다. 그러나 (수동으로) 소수 자릿수를 충분히 인쇄하면 결국 그 숫자가 생각한 것과 정확히 일치하지 않는다는 것을 알게 될 것입니다. 이것이 WHRoeder가 만들고자 하는 요점입니다(제 생각에는). 이 솔루션은 가장 우아하지는 않지만 가장 간단합니다. 또는...

2. 로트 크기를 그대로 두고(즉, NormalizeDouble을 사용 하지 않음) 필요할 때 표시 목적으로 값을 조정할 수 있습니다. 필요한 것에 따라 DoubleToStr() 또는 StringFormat() 또는 printf()를 사용 하여 이를 달성할 수 있습니다. 이것은 보다 유연한 접근 방식입니다.

실제 값과 해당 값이 표시되는 방식이 동일할 필요는 없습니다. 정확히 0.07을 저장할 수 없습니다.

   double myVal= 0.07 ;
   printf ( "%.24f" ,myVal);

결과: 0.070000000000000006661338

그러나 필요한 경우 확실히 0.07을 표시할 수 있습니다.
 
honest_knave :

아마도 당신이 성취하고자 하는 바를 정확히 설정하는 것이 가장 좋을 것입니다.
...

와우~ 잘 쓰셨네요~ 댓글 처럼 거의 이해가 됩니다.
그래서 나는 곧 새로운 코멘트를 쓸 것입니다.

//--- 두 번째 편집

내가 언급했듯이 나는 LotSize가 필요하지 않으며 LotStep은 디스플레이에 바로 표시됩니다. LotSize가 필요하고 LotStep 은 모든 곳에서 동일한 것을 표시할 수 있습니다.
나는 단지 그것에 대해 걱정합니다.

 

동적 로타이징에 관한 것이라면 항상 간단한 기어박스를 연결할 수 있습니다.

//Gearbox//
double Lots;
Balance= AccountInfoDouble ( ACCOUNT_BALANCE );

if (Balance> 10000 )
{Lots= 10 ; Print ( " Gear Two" );}
if (Balance> 100000 )
{Lots= 100 ; Print ( " Gear Three" );}
if (Balance> 1000000 )
{Lots= 1000 ; Print ( " Gear Four" );}
if (Balance> 10000000 )
{Lots= 10000 ; Print ( " Gear Five" );}

if (Balance< 10000000 )
{Lots= 1000 ; Print ( " Gear Four" );}
if (Balance< 1000000 )
{Lots= 100 ; Print ( " Gear Three" );}
if (Balance< 100000 )
{Lots= 10 ; Print ( " Gear Two" );}
if (Balance< 10000 )
{Lots= 1 ; Print ( " Gear One" );}
if (Balance> 1000000000 )
{Lots= 0 ;}
 

제 EA의 일부를 여러분과 함께 게시해야 하므로 저를 더 명확하게 이해하는 데 도움이 되기를 바랍니다.
그래서 그 좋은 코드가 무엇인지 알아야 합니다.

좋은 (명확한) 조언이나 도움을 주십시오. 미리 감사드립니다.

void OnChartEvent ( const int       id     , // Event ID
                   const long    & lparam , // Parameter of type long event
                   const double & dparam , // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
{

    _lotCalc();
     //-------Process Button---------------------------------------------------------|
     if ( sparam == _btnLotMinus )
    {
         ObjectSetInteger ( 0 , _btnLotMinus, OBJPROP_STATE , false );
        _lotSize -= _lotStep;

         if ( NormalizeDouble ( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
        _calcUpdade( CALC_CHANGE_LOT );

         Print ( " | Lot:   " , _lotSize );
         return ;
    }   //---if Close
     //                          ...
}

double _lotCalc()
{
     //---
    _lotMin  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN   );
    _lotMax  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX   );
    _lotStep = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );

     //---
     return ( NormalizeDouble ( _lotSize, 2 ) );
}
 
Max Enrik :

제 EA의 일부를 여러분과 함께 게시해야 하므로 저를 더 명확하게 이해하는 데 도움이 되기를 바랍니다.
그래서 그 좋은 코드가 무엇인지 알아야 합니다.

좋은 (명확한) 조언이나 도움을 주십시오. 미리 감사드립니다.

컴파일되지 않고 테스트되지 않은 늦은 밤.

_lotSize를 처음 설정한 위치를 알 수 없습니다... _lotSize가 항상 _lotStep의 배수인지 확인해야 합니다.

IMHO 모든 로트 계산을 OnChartEvent()와 _lotCalc() 간에 분할하는 것보다 함께 유지하는 것이 좋습니다. 최소/최대/단계를 확인하고 증가/감소를 수행하는 하나의 기능 입니다.

void OnChartEvent ( const int       id     , // Event ID
                   const long    & lparam , // Parameter of type long event
                   const double & dparam , // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
{
    _lotCalc();
     //-------Process Button---------------------------------------------------------|
     if ( sparam == _btnLotMinus )
    {
         ObjectSetInteger ( 0 , sparam , OBJPROP_STATE , false );
         _lotSize = fmax (_lotMin, _lotSize-_lotStep);
        _calcUpdade( CALC_CHANGE_LOT );
         printf ( " | Lot: %.2f  " , _lotSize );
         return ;
    }   //---if Close
     //                          ...
}

void _lotCalc()
{
     //---
    _lotMin  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN   );
    _lotMax  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX   );
    _lotStep = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );

     //---
}
 
honest_knave :

컴파일되지 않고 테스트되지 않은 늦은 밤.
_lotSize를 처음 설정한 위치를 알 수 없습니다... _lotSize가 항상 _lotStep의 배수인지 확인해야 합니다.
IMHO 모든 로트 계산을 OnChartEvent()와 _lotCalc() 간에 분할하는 것보다 함께 유지하는 것이 좋습니다. 최소/최대/단계를 확인하고 증가/감소를 수행하는 하나의 기능입니다.

그것은 저에게 많은 도움이 되었습니다. 그것은 제 lotSizelosStep 문제를 해결했음을 의미합니다.
정말 감사합니다.

#Lot 0(영) & (해결된 Lot Size와 Lot Step 문제 사이)- 마감됨

 

네, lotSize 코드를 잊어버렸기 때문에 init 함수 에서 사용합니다.
_lotSize에 적합한 장소입니까?

감사해요!

int OnInit ()
{
    _pip = Point ;
     if ( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point ;
    _lotSize = _lotValue * MarketInfo ( Symbol (), MODE_MINLOT );

     //...
}