MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 739

 
Ilya Prozumentov :

이것은 저자 자신만이 여기서 무슨 일이 일어나고 있는지 이해할 것입니다. OnTick()의 더 나은 코드 캐리

작가님과 통화했습니다. 도움이되지 않았습니다. 그 자신은 거의 탐색 할 수 없습니다. " 여기에서 상태를 확인하십시오. 나는 당신을 전혀 돕지 않을 것입니다.

내 코드 부분에 대해서는 답변할 수 있고(!) 답변할 수 있지만 귀하의 코드 부분에 대해서는 답변할 수 없습니다 .

다음은 OnTick() 코드입니다.

 void OnTick ()
  { RefreshRates ();
//---
   string TextDisplay= "" ;

/*  Check News   */
   bool trade= true ; string nstxt= "" ; int NewsPWR= 0 ; datetime nextSigTime= 0 ;
   if (MidleNews || HighNews) 
     { RefreshRates ();
       if (SourceNews== 0 )
        { // Investing
         RefreshRates ();
         if (CheckInvestingNews(NewsPWR,nextSigTime)){ trade= false ; } // news time
        }
     }
   if (trade)
     { // No News, Trade enabled
      nstxt= "No News, Waiting" ;
       if ( ObjectFind ( 0 , "NS_Label" )!=- 1 ){ ObjectDelete ( 0 , "NS_Label" ); }

        } else { // waiting news , check news power
       color clrT=LowColor;
       if (NewsPWR> 3 )
        {
         nstxt= "Waiting Non-farm Payrolls News" ;
         clrT = HighColor;
           } else {
         if (NewsPWR> 2 )
           {
            nstxt= "Waiting High News" ;
            clrT = HighColor;
              } else {
             if (NewsPWR> 1 )
              {
               nstxt= "Waiting Midle News" ;
               clrT = MidleColor;
                 } else {
               nstxt= "Waiting Low News" ;
               clrT = LowColor;
              }
           }
        }
       // Make Text Label
       if (nextSigTime> 0 ){ nstxt=nstxt+ " " + TimeToString (nextSigTime, TIME_MINUTES ); }
       if ( ObjectFind ( 0 , "NS_Label" )==- 1 )
        {
         LabelCreate( StringConcatenate (nstxt),clrT);
        }
       if ( ObjectGetInteger ( 0 , "NS_Label" , OBJPROP_COLOR )!=clrT)
        {
         ObjectDelete ( 0 , "NS_Label" );
         LabelCreate( StringConcatenate (nstxt),clrT);
        }
     }
   nstxt= "\n" +nstxt;
/*  End Check News  */ 


   if (trade && oppoz)  
     { // No news and Trade Allowed
     Fun_New_Bar();
            
       if (New_Bar)      
     { 
       Alert ( "Открыть позицию" ); ManageTrade(); // Your trade functions
     }
     oppoz= false ;
     }

   TextDisplay=TextDisplay+nstxt;
   Comment (TextDisplay);

   return ;
  }
 
Alekseu Fedotov :

교체 시도

여기 이 줄에

효과가 있었던 것 같습니다! 현재 20분 동안 메시지가 없습니다. 그가 13시에 뉴스에 어떻게 반응하는지 보자.

 
Artyom Trishkin :
nan - NaN - 숫자가 아님 - 숫자가 아닙니다. Z-점수 계산에서 숫자를 정규화해 보십시오.

덕분에 도움이 되었습니다.

MathCeil() 함수가 작동하지 않는 것이 이상합니다. 도움이 된 NormalizeDouble() 숫자 - == Z 점수는 = -92233720368547.77 입니다. 지표는 굉장하지만 균형은 거의 변하지 않습니다




 
Alekseu Fedotov :

교체 시도

여기 이 줄에

괜찮은! 모든 것이 설정에 따라 작동했으며 오류가 없습니다. 고맙습니다!

저는 간단한 솔루션과 간단한 코드를 좋아합니다.

관심을 가지고 완전한 평신도를 돕기 위해 노력한 모든 사람들에게도 감사드립니다.

 

가격 레이블을 Bid에 바인딩하고 제대로 작동하는 것을 확인하고 다른 차트로 전환하고 수직 좌표가 즉시 약 15픽셀만큼 이동하는 것을 봅니다.

나는 레이블을 "도망쳤다"고 돌아오고 다음 틱까지 제자리에 있지 않고 "조국으로"돌아갑니다. 이것은 무엇에서 올 수 있습니까?




 //+------------------------------------------------------------------+
//|                                              !_clr_indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window


string objname= "Bid" ;
input color Bid_color = clrCrimson ;

int OnInit ()
  {

int x,y;
double Bid = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
int width = ( int ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS , 0 );   //ширина графика

   ObjectCreate ( 0 , objname, OBJ_LABEL , 0 , 0 , 0 );
   
   ObjectSetString ( 0 , objname, OBJPROP_TEXT , DoubleToString ( Bid , _Digits - 1 ));
   ObjectSetInteger ( 0 , objname, OBJPROP_FONTSIZE , 12 );
   ObjectSetInteger ( 0 , objname, OBJPROP_COLOR , Bid_color);
   ObjectSetString ( 0 , objname, OBJPROP_FONT , "Verdana" );

   ChartTimePriceToXY ( 0 , 0 , TimeCurrent (), Bid , x, y); 
   ObjectSetInteger ( 0 , objname, OBJPROP_XDISTANCE , width- 60 );

   Print ( "y=" , y, "  " , ObjectGetInteger ( 0 ,objname, OBJPROP_TIME , 0 ));

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {


int x2,y2;
double Bid2 = SymbolInfoDouble ( Symbol (), SYMBOL_BID );


           ChartTimePriceToXY ( 0 , 0 , TimeCurrent (), Bid2, x2, y2); 
      
         ObjectSetInteger ( 0 , objname, OBJPROP_YDISTANCE , y2);

   Print ( "x2=" , x2, "  y2=" , y2, "  " , "  Bid=" ,Bid2);

   return (rates_total);
  }


void OnDeinit ( const int reason) 
   { 

       ObjectDelete ( 0 ,objname);
   } 
 
 
 
psyman :

가격 레이블을 Bid에 바인딩하고 제대로 작동하는 것을 확인하고 다른 차트로 전환하고 수직 좌표가 즉시 약 15픽셀만큼 이동하는 것을 봅니다.

나는 레이블을 "도망쳤다"고 돌아오고 다음 틱까지 제자리에 있지 않고 "조국으로"돌아갑니다. 이것은 무엇에서 올 수 있습니까?

차트는 다음 틱에서만 다시 그려 지기 때문입니다. 하지만 지금 차트를 강제로 다시 그리는 것은 위험합니다. 이전 두 개의 MT5 빌드에서는 브레이크가 어린이용이 아니었습니다. MT4처럼 잘 몰라서 확인해봐야겠네요.

 
Alexey Viktorov :

차트는 다음 틱에서만 다시 그려 지기 때문 입니다. 하지만 지금 차트를 강제로 다시 그리는 것은 위험합니다. 이전 두 개의 MT5 빌드에서는 브레이크가 어린이용이 아니었습니다. MT4처럼 잘 몰라서 확인해봐야겠네요.

따라서 이것은 결과이며 변위의 원인이 무엇인지 명확하지 않습니다.

수평적으로도 똑같은 일이 일어나고 가장 불쾌한 것은 라벨이 가격에 맞는다는 것입니다. 이것은 상황을 분석하기 위해 대부분의 코드를 잘라냅니다.

이 상황에서 벗어나는 방법?

 
psyman :

따라서 이것은 결과이며 변위의 원인이 무엇인지 명확하지 않습니다.

수평적으로도 똑같은 일이 일어나고 가장 불쾌한 것은 라벨이 가격에 맞는다는 것입니다. 이것은 상황을 분석하기 위해 대부분의 코드를 잘라냅니다.

이 상황에서 벗어나는 방법?

CHARTEVENT_CHART_CHANGE 이벤트 에서 동일한 방식으로 레이블 좌표를 업데이트하십시오.

 if (id== CHARTEVENT_MOUSE_MOVE || id== CHARTEVENT_CHART_CHANGE )
 
Ilya Prozumentov :

CHARTEVENT_CHART_CHANGE 이벤트 에서 동일한 방식으로 레이블 좌표를 업데이트하십시오.


나는 시도했지만 레이블이 반환되도록 마우스를 움직여야합니다. 이것은 다른 쪽에서만 동일한 목발입니다 :-)

그리고 CHARTEVENT_CHART_CHANGE에 대한 차트 간 전환은 이벤트가 아닙니다.

누구든지 이 이상 현상을 극복하는 방법을 알아낼 수 있습니까?

 
psyman :


나는 시도했지만 레이블이 반환되도록 마우스를 움직여야합니다. 이것은 다른 쪽에서만 동일한 목발입니다 :-)

그리고 CHARTEVENT_CHART_CHANGE에 대한 차트 간 전환은 이벤트가 아닙니다.

누구든지 이 이상 현상을 극복하는 방법을 알아낼 수 있습니까?

OnInit에서 변수 초기화 수행(객체 다시 그리기 포함)