[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 104

 
Mathemat :

좀 더 구체적으로 말씀해주실 수 있나요? 예를 들어 주십시오.

Las-tochk '와 같은 초보자와 당신의 이 영리한 편지는 전혀 아무 말도 하지 않습니다.

나는 누군가가 다른 사람의 코드, 그러한 클래스의 예를 탐구하는 것이 흥미로울 것이라고 생각하지 않습니다.

 //+------------------------------------------------------------------+
//|                                                  WaveCounter.mq4 |
//|                                                             Паха |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Паха"

#define wC_SHADECOLOR   C '121,0,0'
#define wC_NAMEPART   "WaveCounter"
//#define NEW_LINE_COLOR  DarkKhaki
#define NEW_LINE_STILE   2
#define NEW_LINE_RAY 0
#define SCARP_LINE_STILE   1
//#define SCARP_LINE_COLOR White

#include <WaveCounterCore.mqh>
/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// Var
string wC_sName = "" ;
int wC_iTimeframe;
int wC_iDirection;
bool wC_bFirst;
int iwC_iLockBar;
double wC_dSizePorog[][ 2 ];
//------------------------ rez
int wC_iMoveBar[ 2 ];
double wC_dMovePrice[ 2 ];
bool wC_bScarp;
int wC_iStop;
/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
/*
//-------------------------------------------------- private
bool wC_vn_getWaveSizeArray();
//-------------------------------------------------- public
string wC_Create(bool bSizeFilter,
                  bool bAddToExtr);
bool wC_Check(string &sName, 
               bool bFromBegin, 
               bool bFirst);
bool wC_IsScarp();
int wC_IsStop();
bool wC_Redraw();
*/
/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///

string wC_Create( bool bSizeFilter,
                   bool bAddToExtr)
   {
   //----
   string sShadeName[ 2 ] = { "wC_Shade1" , "wC_Shade2" };
   
   //--//
       if (ObjectFind(sShadeName[ 0 ]) < 0 )
         {
         Shade_create( sShadeName[ 0 ], wC_SHADECOLOR );
         return ( "" );
         }
      
       if (ObjectFind(sShadeName[ 1 ]) < 0 )
         {
         Shade_create( sShadeName[ 1 ], wC_SHADECOLOR );
         return ( "" );
         }
   //--\\
   
   if ( ! Shade_attach(sShadeName, false ) ) 
       return ( "" );      
   if ( ! Shade_direction(wC_iDirection, 0 , 1 ) )
       return ( "" );
   if ( ! Shade_minTimeframe( 0 ) )
       return ( "" );
   wC_iTimeframe = Shade_getTimeframe();
   int iCorrectIndex[ 2 ] = { 0 , 1 };
   Shade_correctKoord(iCorrectIndex); 
   
   datetime datPoint0;
   double dPoint0, dPoint1;
   if (wC_iDirection == 2 )
      {
       if ( ! Shade_getPointTimePrice( 0 , CONTMOV1,   false , datPoint0, dPoint0) )
         return ( "" );
      }
   else
      {
       if ( ! Shade_getPointTimePrice( 0 , CONTMOV1,   true , datPoint0, dPoint0) )
         return ( "" );
      } 

   if (bSizeFilter)
      {
       if ( ! wC_vn_getWaveSizeArray() )
         return ( "" );
         
       int iIndexPoroga[ 1 ];
       if ( ! MyInputBox( "Индекс порога" , iIndexPoroga) )
         return ( "" );
       if ( iIndexPoroga[ 0 ] < 0   || iIndexPoroga[ 0 ] + 1 > ArrayRange(wC_dSizePorog, 0 ) )
         {
         Alert( "Недопустимый индекс" );
         return ( "" );
         }
         
       if (wC_iDirection == 2 )
         dPoint1 = dPoint0 + wC_dSizePorog[ iIndexPoroga[ 0 ] ][ 0 ] * dPoint0;
       else
         dPoint1 = dPoint0 - wC_dSizePorog[ iIndexPoroga[ 0 ] ][ 0 ] * dPoint0;
      iwC_iLockBar = MYEMPTY;
      }
   else
      {
       if (wC_iDirection == 2 )
         {
         if ( ! Shade_getPoint( 1 , CONTMOV2, true , iwC_iLockBar) )
             return ( false );
         dPoint1 = iHigh(NULL, wC_iTimeframe, iwC_iLockBar);
         }
       else
         {
         if ( ! Shade_getPoint( 1 , CONTMOV2, false , iwC_iLockBar) )
             return ( false );
         dPoint1 = iLow(NULL, wC_iTimeframe, iwC_iLockBar); 
         }
       if (dPoint1 == 0 )
         return ( false );
       if (bAddToExtr)
         iwC_iLockBar --;
      }

   if ( ! Fun_partOfName(wC_sName) )
       return ( "" );   
   wC_sName = StringConcatenate(wC_sName, wC_NAMEPART);
   
   if ( ! ObjectCreate(wC_sName, OBJ_TREND, 0 , datPoint0, dPoint0, datPoint0, dPoint1) )
       return ( "" );
   if ( ! ObjectSetText(wC_sName, "2" ) )
       return ( "" );
   if ( ! ObjectSet(wC_sName, OBJPROP_RAY, NEW_LINE_RAY) )
       return ( "" );
   if ( ! ObjectSet(wC_sName, OBJPROP_COLOR, Fun_ColorFromPanel()) )
       return ( "" );
   if ( ! ObjectSet(wC_sName, OBJPROP_STYLE, NEW_LINE_STILE) )
       return ( "" );
   
   Fun_deleteObjects(sShadeName);
   return (wC_sName); 
   }
//--------------------------------------------------

bool wC_vn_getWaveSizeArray()
   {
   static bool bSizePorogInit = false ;
   if (bSizePorogInit)
       return ( true );
   string sSymbol = Symbol();
   if ( sSymbol == "USDCHF" )
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeUSDCHF, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeUSDCHF) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "AUDJPY" )
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeAUDJPY, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeAUDJPY) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "EURUSD" )
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeEURUSD, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeEURUSD) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "EURGBP" )         
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeEURGBP, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeEURGBP) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
     
   if ( sSymbol == "EURJPY" )           
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeEURJPY, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeEURJPY) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "GBPUSD" )            
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeGBPUSD, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeGBPUSD) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "USDCAD" )            
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeUSDCAD, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeUSDCAD) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "USDJPY" )            
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeUSDJPY, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeUSDJPY) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
         
   if ( sSymbol == "AUDUSD" )            
      {
       if (ArrayResize(wC_dSizePorog, ArrayRange(prop_dWaveSizeAUDUSD, 0 )) < 0 )
         return ( false );
       if (ArrayCopy(wC_dSizePorog, prop_dWaveSizeAUDUSD) < 1 )
         return ( false );
      bSizePorogInit = true ;
       return ( true );
      }
      
   Alert( "У символа нет размерного массива, или он не прописан в функции Tl_vn_getWaveSizeArray()" );
   return ( false );
   }
//--------------------------------------------------

bool wC_Check( string &sName, 
               bool bFromBegin, 
               bool bFirst)
   {
   if (StringFind(sName, wC_NAMEPART) == - 1 )
       return ( false );
   wC_bScarp = false ;
   wC_iStop = - 1 ;
   wC_sName = sName;
   string sDescrip = ObjectDescription(sName);
   int iID = StrToInteger(sName);
   if (iID == 0 )
       return ( false );
      
   datetime datLastTime;
   if (sDescrip == "1"   &&  ! bFirst)
      {
      datLastTime = FL_LastTime();
       if (datLastTime == - 1 )
         datLastTime = MYEMPTY;
       if ( ! tlC_Load(iID, datLastTime) )
         return ( false );
      wC_bFirst = false ;
       if (bFromBegin)
         if ( ! tlC_SeekToBegin())
             return ( false );
      }
   else
      {
       if (sDescrip == "2"   &&  bFirst)
         {
         int iBeginBar = iBarShift(NULL, wC_iTimeframe, ObjectGet(sName, OBJPROP_TIME1), true );
         if (iBeginBar == - 1 )
             return ( false );
         datLastTime = FL_LastTime();
         if (datLastTime == - 1 )
            datLastTime = MYEMPTY;
         if ( ! tlC_Attach(iID, wC_iDirection, wC_iTimeframe, iBeginBar, ObjectGet(sName, OBJPROP_PRICE2), iwC_iLockBar, datLastTime) )
             return ( false ); 
         if (iwC_iLockBar != MYEMPTY)
            tlC_SetStops( false , MYEMPTY);
         wC_bFirst = true ;
         }
       else
         return ( false );
      }
   
   if ( ! tlC_Check() )
       return ( false );
      
   wC_bScarp = tlC_IsScarp();
   wC_iStop = tlC_IsStop();
   tlC_GetCurView(wC_iMoveBar, wC_dMovePrice);
   if (wC_bScarp)
      {
       int iTempVar;
       double dTempVar;
      tlC_GetCurPos(iTempVar, dTempVar);
      wC_iMoveBar[ 1 ] = iTempVar;
      wC_dMovePrice[ 1 ] = dTempVar;
      }
   
   return ( true );
   }
//--------------------------------------------------

bool wC_IsScarp()
   {
   return (wC_bScarp);
   }
//--------------------------------------------------

int wC_IsStop()
   {
   return (wC_iStop);
   }
//--------------------------------------------------


  
 

한 가지 기능이 맞지 않았습니다.

bool wC_Redraw()
   {
   if (wC_iStop != - 1 )
      {
      ObjectDelete(wC_sName);
       return ( true );
      }
   if (wC_bFirst)
       if ( ! ObjectSetText(wC_sName, "1" ))
         return ( false );
   int iTimeframe = tlC_GetTimeframe();
   double dLockPrice = tlC_GetPriceLock();
   datetime datMoveTime[ 2 ];
   datMoveTime[ 0 ] = iTime(NULL, iTimeframe, wC_iMoveBar[ 0 ]);
   if (datMoveTime[ 0 ] == 0 )
       return ( false );
   if ( ! ObjectMove(wC_sName, 0 , datMoveTime[ 0 ], wC_dMovePrice[ 0 ]) )
       return ( false );
   
   if (dLockPrice == MYEMPTY)
      {
      datMoveTime[ 1 ] = iTime(NULL, iTimeframe, wC_iMoveBar[ 1 ]);
       if (datMoveTime[ 1 ] == 0 )
         return ( false );
       if ( ! ObjectMove(wC_sName, 1 , datMoveTime[ 1 ], wC_dMovePrice[ 1 ]) )
         return ( false );
         
       if (wC_bScarp)
         {
         if ( ! ObjectSet(wC_sName, OBJPROP_RAY, false ) )
             return ( false );
         if ( ! ObjectSet(wC_sName, OBJPROP_STYLE, SCARP_LINE_STILE) )
             return ( false );
         if ( ! ObjectSetText(wC_sName, "0" ))
             return ( false );
         //ObjectSet(wC_sName, OBJPROP_COLOR, SCARP_LINE_COLOR);    
         return ( true );
         }
       else
         ObjectSet(wC_sName, OBJPROP_RAY, true );
      }
   else
       if ( ! ObjectMove(wC_sName, 1 , datMoveTime[ 0 ], dLockPrice) )
         return ( false );
      
   if ( ! tlC_Save())
       return ( false );
   
   return ( true );
   }
 
alsu :

아니요, 시간 t3에. 요점은 t3이 막대의 첫 번째 눈금이라는 것입니다. 이는 계산이 아직 이루어지지 않았기 때문에 IndicatorCounted()의 값이 아직 변경되지 않았음을 의미합니다. 이는 start() 함수가 끝난 후에만 발생합니다. . 이것은 매우 논리적입니다. 함수는 계산된 막대의 수를 반환하므로 이 막대의 최소 한 눈금이 계산될 때까지 값을 변경할 필요가 없습니다. 따라서 t3 시점에서 여전히 값 299를 볼 수 있지만 다음 틱에서는 이미 300이 됩니다.

더 명확합니까?

예, 더 이해가 됩니다. 감사합니다.
 
어드바이저가 실행 중일 때 화면의 왼쪽 상단에 댓글이 표시됩니다. 어떻게 100-200핍을 오른쪽으로 이동할 수 있습니까? 왜냐하면 그 구석에서는 일반적으로 문자의 오버레이 때문에 무언가를 읽을 수 없습니다 .. ((((
 
w_ersoc :
어드바이저가 실행 중일 때 화면의 왼쪽 상단에 댓글이 표시됩니다. 어떻게 100-200핍을 오른쪽으로 이동할 수 있습니까? 왜냐하면 그 구석에서는 일반적으로 문자의 오버레이 때문에 무언가를 읽을 수 없습니다 .. ((((

주석 텍스트 의 시작 부분에 공백이 있는 것이 가장 쉽습니다.

또는 다음과 같이:

   ObjectCreate ( "label_object1" , OBJ_LABEL , 0 , 0 , 0 );  
   ObjectSet ( "label_object1" , OBJPROP_XDISTANCE , 720 );  
   ObjectSet ( "label_object1" , OBJPROP_YDISTANCE , 45 );
   ObjectSetText ( "label_object1" , StringConcatenate ( "Процент отрицательных %:     " , PercentMinus), 8 , "Lucida Console" , NavajoWhite );
   
 
moskitman :

주석 텍스트의 시작 부분에 공백이 있는 것이 가장 쉽습니다.

또는 이렇게...

고맙습니다!-)
 
위에 제가 포스팅한 내용을 조금 설명드리겠습니다. 예를 들어, 우리는 MKL4 언어로 자동차 모델을 만드는 작업에 직면해 있습니다. 우리는 자동차에 오일 압력, 크랭크축 속도, 냉각수 온도 등 몇 가지 속성이 있다는 것을 알고 있습니다. . 그러나 조금 추상화하면 차에서 필요한 것을 이해할 수 있습니다. 앞으로, 뒤로, 왼쪽, 오른쪽으로 이동합니다. 따라서 include에서 모든 속성을 변수로 선언하고 외부에서 건드리지 않습니다. 외부 환경과 상호 작용하기 위해 forward(), backward(), left(), right() 함수를 그대로 둡니다. 일반적으로 캡슐화와 비슷합니다. 이것은 프로젝트 를 복잡하게 만들 때 많은 도움이 될 것입니다.
 
여러분, 올바른 표현을 쓰는 방법은 무엇입니까? 2가지 가격을 비교하셔야 합니다.
Close[ 2 ]>=Open[ 1 ]

그러나 Open[1] 의 경우 가격이 1pp 미만이라고 작성해야 합니다.

소수점 5자리가 있는데 안썼어요

Close[ 2 ] >= (Open[ 1 ]- 10 * Point )

그러나 이 용어는 사실이 아니며 작동하지 않을 수도 있습니다.

그러나 올바른 글쓰기 방법은 무엇입니까?

 
kilnart :

그러나 이 용어는 사실이 아니며 작동하지 않을 수도 있습니다.

정확히 작동하지 않는 것은 무엇입니까?
 
kilnart : 올바른 글쓰기 방법은 무엇입니까?

다음과 같이 시도하십시오.

 if ( Digits == 5 ){
   if (Close[ 2 ]-Open[ 1 ]>= 10 * Point ); // цена больше на 10 пп в 5-ти знаке
}
if ( Digits == 4 ){
   if (Close[ 2 ]-Open[ 1 ]>= Point ); // цена больше на 1 пп в 4-х знаке
}

//или так ...

switch ( Digits ){
   case 5 : if (Close[ 2 ]-Open[ 1 ]>= 10 * Point ); // цена больше на 10 пп в 5-ти знаке
   case 4 : if (Close[ 2 ]-Open[ 1 ]>= Point ); // цена больше на 1 пп в 4-х знаке
}