이전 눈금 값 - 페이지 4

 
보다 간소화된 코드에 대해 Nicholi에게 감사드립니다. 몇 가지 실험을 한 후, 나는 ask_diff를 float로 선언하면 정확한 자릿수와 차이가 발생하지만 유형 변환으로 인한 데이터 손실 가능성에 대한 컴파일 오류가 발생한다는 것을 발견했습니다. 내 차이점이 매우 작은 부정확성을 갖거나 컴파일 경고가 표시되는 것 중에서 선택해야 하는 것 같습니다. 후자가 거래 결정에 더 낫지 만 다른 사람이 ask_diff에서 소수점 이하 다섯 자리까지 얻을 수있는 솔루션을 가지고 있습니까?
 
rdone :
더욱 간소화된 코드를 제공해 주신 Nicholi에게 감사드립니다. 몇 가지 실험을 한 후, 나는 ask_diff를 float로 선언하면 정확한 자릿수와 차이가 발생하지만 유형 변환으로 인한 데이터 손실 가능성에 대한 컴파일 오류가 발생한다는 것을 발견했습니다. 내 차이점이 매우 작은 부정확성을 갖거나 컴파일 경고가 표시되는 것 중에서 선택해야 하는 것 같습니다. 후자가 거래 결정에 더 낫지 만 다른 사람이 ask_diff에서 소수점 이하 다섯 자리까지 얻을 수있는 솔루션을 가지고 있습니까?

귀하의 ask_diff는 int 유형이어야 하며 대신 다음과 같아야 합니다.

int diff = int ( round ((current.ask - last.ask) / _Point ));
 
방금 NormalizeDouble 및 DoubleToString을 발견했습니다. 야, 이런 날은 처음이야...
 
rdone :
방금 NormalizeDouble 및 DoubleToString을 발견했습니다. 야, 이런 날은 처음이야...
내 목표는 현재 Ask와 이전 Ask(파트 1) 간의 차이를 파악한 다음 이러한 차이의 누적 합계를 유지하는 것입니다(파트 2). 파트 1은 작동하지만 파트 2는 이전 요청 금액을 반환합니다. 누구든지 내가 잘못 가고있는 곳을보고 코스 수정을 제공 할 수 있습니까?
 double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
MqlTick tick_curr, tick_prev;
void OnTick ()
  {
   if ( SymbolInfoTick ( Symbol (),tick_curr))
     {
       /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
       Print ( DoubleToString (ask_diff, 5 ));
       /* Part 2 */
      diff_ask = diff_ask + ask_diff;
       Print ( DoubleToString (diff_ask, 5 ));     
      tick_prev = tick_curr;
     }
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
  }
 
종종 발생하는 것처럼 코드는 내가 원하는 것이 아니라 원래 해야 하는 일을 하고 있었습니다. 로직은 항상 tick_prev를 채워야 하지만 첫 번째 틱에서는 그렇지 않습니다. 첫 번째 틱에 tick_prev를 채울 필요가 없는 논리에 관심이 있지만 그렇지 않으면 작동합니다.
 
rdone :
종종 발생하는 것처럼 코드는 내가 원하는 것이 아니라 원래 해야 하는 일을 하고 있었습니다. 로직은 항상 tick_prev를 채워야 하지만 첫 번째 틱에서는 그렇지 않습니다. 첫 번째 틱에 tick_prev를 채울 필요가 없는 논리에 관심이 있지만 그렇지 않으면 작동합니다.
이제 코드로.
 double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
int notfirst;
MqlTick tick_curr, tick_prev;
void OnTick ()
  {
   if ( SymbolInfoTick ( Symbol (),tick_curr))
     {
       if (notfirst > 0 )
      {
       /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
       Print ( DoubleToString (ask_diff, 5 ));
       /* Part 2 */
      diff_ask = diff_ask + ask_diff;
       Print ( DoubleToString (diff_ask, 5 ));
      }
      tick_prev = tick_curr;
      notfirst = 1 ;  
     }
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
  }
 
rdone :
종종 발생하는 것처럼 코드는 내가 원하는 것이 아니라 원래 해야 하는 일을 하고 있었습니다. 로직은 항상 tick_prev를 채워야 하지만 첫 번째 틱에서는 그렇지 않습니다. 첫 번째 틱에 tick_prev를 채울 필요가 없는 논리에 관심이 있지만 그렇지 않으면 작동합니다.
 double diff_ask= 0 ;
MqlTick tick_curr, tick_prev={ 0 };
void OnTick ()
  {
   if ( SymbolInfoTick ( Symbol (),tick_curr))
     {
       /* Part 1 */
      diff_ask += tick_prev.ask!= 0.0 ?(tick_curr.ask-tick_prev.ask): 0.0 ;
       Print ( DoubleToString (diff_ask, 5 ));
       /* Part 2 */
       //diff_ask = diff_ask + ask_diff;
       //Print(DoubleToString(diff_ask,5));     
      tick_prev = tick_curr;
     }
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
  }
 
Ernst Van Der Merwe :
이것은 내가 달성하고자 하는 코딩 수준입니다. 에른스트 감사합니다!
diff_ask += tick_prev.ask!= 0.0 ?(tick_curr.ask-tick_prev.ask): 0.0 ;
 
rdone :
이것은 내가 달성하고자 하는 코딩 수준입니다. 에른스트 감사합니다!

double은 거의 같지 않으므로 포인트 차이를 double로 저장하고 싶지 않습니다. 정수 값으로 저장하려고 합니다. 예를 들어 (1.00001 - 1.00000) / 0.00001 = 1포인트. 따라서 두 개의 틱만 비교하는 경우 코드를 더 간결하게 만들고 MqlTick 의 하위 클래스를 만들고 포인트 diff에 대해 int 속성을 추가할 수 있습니다.

 struct MyTick : public MqlTick { int point_diff;} tick_curr={ 0 }, tick_prev={ 0 };
void OnStart ()
{
   tick_prev = tick_curr;
   SymbolInfoTick ( _Symbol , tick_curr);
   if (tick_prev.ask != 0.0 ){
      tick_curr.point_diff = int ( round (
         (tick_curr.ask - tick_prev.ask) / _Point
      ));
       printf ( "%.5f -> %.5f: %d point diff" ,
         tick_prev.ask,
         tick_curr.ask,
         tick_curr.point_diff
      );
   }
}