오류, 버그, 질문 - 페이지 443

 
voix_kas :

결과:

내가 뭔가 잘못하고 있거나(수정해 주세요), 존경받는 MetaDriver 가 이론상 실수를 저질렀거나(알고리즘을 설계할 때).

:)

음, 알고리즘의 "설계"가 약 3분(그리고 구현하는 데 7분)이 걸렸다는 사실을 감안할 때, 저는 잘했습니다 :) 목표는 작동하는 아이디어를 보여주고 문제 설명을 명확히 하는 것이었습니다.

그리고 이 모든 것이 결국 유용한 것으로 판명되었습니다. 개발자는 MathFloor() 함수 를 염두에 두는 진정한 이유가 있었습니다. 분명히 모든 것이 순전히 이 함수에서 구현되는 것은 아닙니다.

결국 나는 계속 나아가야 했다. 재미 있었어요. 거의 한 시간의 실험 후에 안정적인 함수(CountSignedDigits(double x)에 대해 이야기하고 있음)를 얻었습니다.

그리고 나서 - 지금도 모든 입력 값에 대해 정확히 무엇이 작동할지 확신할 수 없습니다. 자동 스트레스 테스트를 개발하지 않고 수동으로 했습니다. 테스트하십시오.

부동 소수점 이하 소수점 이하 10자리까지 안정적인 동작을 기대합니다.

 int CountSignedDigits( double x)
{
   for ( int i= 0 ; i< 1000 ; i++,x*= 10 )
  {
     if (x- MathFloor (x+ 0.000000000005 )< double ( 0.000000000005 )) return i;
  }
   return - 1 ;
}
스트레스 테스트 첨부. // 코드에서 일부 중간 구현을 제거하지 않았습니다. 시도 / 반영하기 위해 의견을 남겼습니다. 개발자 포함.
파일:
 
komposter :
1. 로트에 대한 발굴을 정의할 필요가 없습니다. 원하는 단계로 정규화하기만 하면 됩니다.

2. 거래 요청을 전송하는 동안 쓰레기가 로트 변수(소수 11자리)에 들어가더라도 터미널 자체에서 필터링해야 합니다.

3. 적어도 몇 년 동안 이 디자인을 사용하는 데 문제가 없었습니다.

4. 그리고 안전하게 플레이하고 싶다면 소수점 이하 8자리(여백 포함)까지 정규화를 고수할 수 있습니다. "올바른" 정규화 쓰레기가 나타난 후에는 훨씬 더 멀어질 것입니다.

첫 번째 아이디어는 정확하고 나머지는 의심스럽습니다. :)

구현은 연습을 위해 작동하지만 "problem-starter"(c)에 의해 정의된 인위적인 조건은 정확하지 않습니다. 불연속 단계의 경우 lot_min을 기준으로 생성되는 것이 아니라 0을 기준으로 생성됩니다. :)

그러나 눈치채면 쉽게 고칠 수 있습니다.

 double komposterNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble ( lot / lot_step, 0 ) * lot_step;
   if ( lot < lot_min ) lot = lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}
double metadriverNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}

// 이 모든 것을 심각하게 받아들이지 않기를 이 진주들에게 요청합니다. 설명은 뇌 훈련에 대한 순전히 이론적인 것입니다. 실제로는 lot_step이 0.0231과 같은 것을 본 적이 없기 때문입니다....

;)

 
metadriverNormalizeLot

옵션이 맞습니다. 내 NL()에서와 같이 lot_min 을 올바르게 설명했습니다.

 

힙에 내 옵션. 일부 상품의 경우 가격 변경 단계는 1포인트 이상입니다.

 //---------------------------------------------------------------------
//  Нормализация цены:
//---------------------------------------------------------------------
double
NormalizePrice( string _symbol, double _org_price )
{
   double   norm_price = _org_price;

   double   min_price_step = NormalizeDouble ( current_tick_size / current_point, 0 );

  norm_price = NormalizeDouble ( NormalizeDouble (( NormalizeDouble ( _org_price / current_point, 0 )) / min_price_step, 0 ) * min_price_step * current_point, current_digits );

   return ( norm_price );
}

//---------------------------------------------------------------------
//  Вычисление лота:
//---------------------------------------------------------------------
double
NormalizeLot( double _required_lot )
{
   double         lot, k;

   if ( current_min_lot_step > 0 )
  {
    k = 1.0 / current_min_lot_step;
  }
   else
  {
    k = 1.0 / current_min_permitted_lot;
  }

  lot = MathFloor ( _required_lot * k ) / k;

   if ( lot < current_min_permitted_lot )
  {
   lot = current_min_permitted_lot;
  }

   if ( lot > current_max_permitted_lot )
  {
    lot = current_max_permitted_lot;
  }

  lot = NormalizeDouble ( lot, 2 );
   return ( lot );
}
 

단계 가 0이 아니라 최소 로트에서 "가는" 공리로 취하면 올바른 알고리즘은 다음과 같습니다.

 double voixkasNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
  if ( lot < lot_min ) lot = lot_min;
   else lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;

   if ( lot > lot_max ) lot = lot_max;
   return NormalizeDouble (Lot, 8 );
}

Composter 버전에서 단계는 0에서 "진행"됩니다. 나에게 옳지 않은 것 같습니다.
MetaDriver 변형에서 코드는 음수 값을 건너뜁니다. =피

 
voix_kas :
...

MetaDriver 변형에서 코드는 음수 값을 건너뜁니다. =피

:)) ..... 아 글쎄! 예, vapche는 당신을 위해 작동하지 않습니다 !! ;-피 ;-b ;-피

 double voixkasNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
   if ( lot < lot_min ) lot = lot_min;
   else lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;

   if ( lot > lot_max ) lot = lot_max;
   return NormalizeDouble ( L ot , 8 );
}

글쎄, 그것에 관한 한 가장 짧고 동시에 "정확한"옵션은 다음과 같습니다.

 double mdNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
  lot = MathMin (lot, lot_min);
  lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;
   return NormalizeDouble ( MathMin (lot, lot_max), MathMax (CountSignedDigits(lot_min),CountSignedDigits(lot_step));
}

그리고 이것은 lot_step , lot_minlot_max 의 무효와 부정을 확인하지 않은 것입니다 !!!!

:)))))

 

Yyy ... 신경을 건드렸다. :)) 포럼 게시물에 있는 수동 규칙의 마지막 줄, 그래서 용서할 수 있습니다. =)
그건 그렇고, 코드도 컴파일되지 않습니다(마지막 줄에서 닫는 괄호를 잊어버렸습니다). :-아르 자형
또한 2-3배 느리게 작동하며(이제 스크립트에서 측정했습니다) 검사 품질은 동일합니다. :-아르 자형

일반적으로 유효 최하위 숫자를 결정하기 위한 적절한 코드는 없지만 Composter의 조언을 사용하겠습니다. 볼륨을 소수점 이하 8자리로 정규화합니다.
함정이 없기를 바랍니다.

도움을 주셔서 감사합니다.

 

내가 봐도 웃긴 너희들.

그의 첫 번째 게시물에서 그는 NL()을 주었습니다.

 

구루에게 한 가지 더 질문이 있었다. 다중 통화를 테스트할 때 오류가 발생합니다(스크린샷 첨부).
나는 무역 작업을 하려고 하는데 가격이 없다는 대답을 얻었습니다. 테스터는 이 쌍에 대한 호가가 2011.01.03 01:00:00 에 도착하기 시작하는 반면 EURUSD도 이 오류를 해결하기 위해 2011.01.03 00:00:00 부터 호가되는 것을 보여줍니다.

오류가 있는 스크린샷

 
voix_kas :

구루에게 한 가지 더 질문이 있었다. 다중 통화 거래 플랫폼을 테스트할 때 오류가 발생합니다(스크린샷 첨부).
나는 무역 작업을 하려고 하는데 가격이 없다는 대답을 얻었습니다. 테스터는 이 쌍에 대한 호가가 2011.01.03 01:00:00 에 도착하기 시작하는 반면 EURUSD도 2011.01.03 00:00:00 에서 호가되는 것을 보여줍니다. 이 오류를 해결하는 방법은 무엇입니까?

거래 및 견적 세션이 문제 해결에 도움이 되지 않습니까?
사유: