PROFI에서 SUPERPROFI에 대한 모든 질문 - 1. - 페이지 42

 
swanhearts :

안녕하세요, 그들은 저에게 MA 표시기를 보냈습니다. 필요한 모든 레벨이 즉시 있습니다. 문제는 지표(각 MA) 위로 마우스를 가져가면 이 MA의 기간이 표시되지 않는다는 것입니다. 이 순간을 해결하는 방법? 이름 IndicatorShortName ( "MASHKI =)" )을 변경할 때 영구적인 구문 오류가 발생했습니다. 도와주세요, 제발.

표시기 버퍼 이름은 SetIndexLabel을 사용하여 설정됩니다.

 

1. 이전 호출과 동일한 틱에서 함수 호출이 발생했는지 확인하는 가장 저렴한 방법은 무엇입니까?

 bool tick_already_processed()
{
   return ( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return ;

   // recalculate only once on each tick
}

void OnTick ()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

시간(TimeCurrent)은 이론적으로 SymbolInfoTick의 시간(ms 단위)도 동일하게 유지될 수 있습니다.

입찰가, 요청 및 시간(ms)을 비교하는 것은 비용이 많이 듭니다.

우리는 EA 자체에서 제어를 구성하는 옵션을 제공하지 않으며 보편적인 독립 기능을 얻고 싶습니다.


2. 거래 운영 에 대한 유사한 질문 . 마지막 출시 이후 주문/포지션 목록에서 변경된 사항이 있는지 어떻게 알 수 있습니까(오픈 레벨, SL 및 TP 포함)?

상위 5개에서 OnTrade의 일종의 플래그 소대는 자체 제안(및 완료 후 재설정)을 제안하지만, 생각하지 않는 것이 더 저렴합니다.

그러나 다시, 나는 보편적인 해결책을 원합니다.


누가 아이디어가 있습니까?

 

Andrey Khatimlianskii :  

https://www.mql5.com/ru/code/16997

Resources.mqh 파일

IsNewPeriod 함수


주요 아이디어는 내부에 정적 함수를 사용하는 것입니다.

틱을 기억하고 확인하려면 ID = GetMicroSecondsCount에 저장할 수 있습니다.

주문과 동일하게 - 마술을 확인하십시오.

아래 의사 코드를 확인하지 않았습니다. :)

 bool IsNewTick( ulong newId) // GetMicrosecondCount() or magic
{
   static ulong id = 0 ;
  
   if (id != newId) 
  {
    id = newId;
     return true ;
  }
  
   return false ; 
}
 
Andrey Khatimlianskii :

2. 거래 운영 에 대한 유사한 질문 . 마지막 출시 이후 주문/포지션 목록에서 변경된 사항이 있는지 어떻게 알 수 있습니까(오픈 레벨, SL 및 TP 포함)?

상위 5개에서 OnTrade의 일종의 플래그 소대는 자체 제안(및 완료 후 재설정)을 제안하지만, 생각하지 않는 것이 더 저렴합니다.

그러나 다시, 나는 보편적인 해결책을 원합니다.


누가 아이디어가 있습니까?

여기에 용어(SL/TP 등)를 추가하십시오.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

주문 열거 주기의 구성

fxsaber , 2017.10.18 12:29

 struct HISTORY_UNIT
{
   long Ticket;
   int Type;
   double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(:: OrderTicket ()), Type(:: OrderType ()), Lots(:: OrderLots ())
  {
  }

   bool operator !=( const HISTORY_UNIT &Unit ) const
  {
     return (( this .Ticket != Unit.Ticket) || ( this .Type != Unit.Type) || ( this .Lots != Unit.Lots));
  }
      
   bool IsChange( void )
  {
     const HISTORY_UNIT Tmp;
     const bool Res = ( this != Tmp);
    
     if (Res)
       this = Tmp;
      
     return (Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
   static HISTORY_UNIT History[];  

   const int Total = OrdersTotal ();  
   bool Res = ( ArraySize (History) != Total);

   for ( int i = 0 , j = Res ? ArrayResize (History, 0 , Total) : 0 ; i < Total; i++)      
     if ( OrderSelect (i, SELECT_BY_POS ))
    {
       if (Res || (Res = History[j].IsChange()))
         ArrayResize (History, j + 1 , Total);
      
      j++;
    }
  
   return (Res);
}
 
Andrey Khatimlianskii :

1. 이전 호출과 동일한 틱에서 함수 호출이 발생했는지 확인하는 가장 저렴한 방법은 무엇입니까?

시간(TimeCurrent)은 이론적으로 SymbolInfoTick의 시간(ms 단위)도 동일하게 유지될 수 있습니다.

입찰가, 요청 및 시간(ms)을 비교하는 것은 비용이 많이 듭니다.

우리는 EA 자체에서 제어를 구성하는 옵션을 제공하지 않으며 보편적인 독립 기능을 얻고 싶습니다.

여기서 문제는 저렴함이 아니라 틱 번호 매기기의 신뢰성입니다. 전투 고문에서 나는 이것을합니다.

 #ifdef __MQL5__
#else // __MQL5__
   // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
   static bool IsNotChange( const bool bInit = false )
  {
     static bool IsChange = false ;
     
     if (bInit)
      IsChange = false ;
      
   #ifdef HISTORYTICKS_ISCHANGE
     if (bInit)
      HISTORYTICKS::IsChange();
     else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
   #endif // HISTORYTICKS_ISCHANGE
    
     return (!IsChange);
  }
#endif // __MQL5__

이것은 기능의 MT4 버전입니다. 표시기-스파이를 통한 번호 매기기.


MT5에 대해 동일한 기능의 버전을 제시하지 않습니다. 초과를 제거해야 합니다. 하지만 이 기능을 기반으로 합니다.

   // Свежие тики с последнего вызова
   static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
     static long LastTime = 0 ;
     static int LastAmount = 0 ;

     if (dFrom)
    {
     :: Comment ( "Waiting Ticks from " + :: TimeToString (dFrom, TIME_DATE ) + "..." );

      LastAmount = 0 ;
    }
    
    :: ArrayFree (Ticks);
  
     int Size = (dFrom || LastTime) ? :: CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , dFrom ? ( long )dFrom * 1000 : LastTime) : 0 ;
    
     if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1 ].time_msc;
       int NewLastAmount = 1 ;
      
       for ( int i = Size - 2 ; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
       if (:: ArrayRemove (Ticks, 0 , LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
     else
      Size = :: ArrayResize (Ticks, 0 );
    
     return (Size);
  }


0이 아닌 값이 반환된 경우 - 새 틱입니다.

 
... :

주요 아이디어는 내부에 정적 함수를 사용하는 것입니다.

틱을 기억하고 확인하려면 ID = GetMicroSecondsCount에 저장할 수 있습니다.

고맙습니다!

전체 질문은 존재하지 않는 이 고유 ID(틱 번호)에 있습니다.

GetMicroSecondsCount는 호출 사이에 변경되기 때문에 도움이 되지 않으며(이것이 의도된 것입니다) GetTickCount 는 이론적으로 인접한 2개의 틱에서 변경되지 않을 수 있습니다.

 
fxsaber :

여기서 문제는 저렴함이 아니라 틱 번호 매기기의 신뢰성입니다. 전투 고문에서 나는 이것을합니다.

아니요, 입찰/매도/ms 비교보다 확실히 느릴 것입니다.

신뢰성에 어떤 문제가 있습니까? 중요한 것은 무언가가 변한다는 것입니다.

 
fxsaber :

여기에 용어(SL/TP 등)를 추가하십시오.

나는 즉시 이 코드를 기억했다.

그러나 임무는 모든 주문의 불필요한 열거를 피하는 것입니다.

이 주기는 전체 Expert Advisor에 대해 하나가 될 수 있습니다. 그러나 그런 다음 함수에 변경 사항이 있다는 표시를 전달해야 합니다(같은 성공으로 호출할 수 없음).

 
Andrey Khatimlianskii :

아니요, 입찰/매도/ms 비교보다 확실히 느릴 것입니다.

신뢰성에 어떤 문제가 있습니까? 중요한 것은 무언가가 변한다는 것입니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

PROFI에서 SUPERPROFI에 대한 모든 질문 - 1.

Andrey Khatimliansky , 2020.03.05 23:46

시간(TimeCurrent)은 이론적으로 SymbolInfoTick의 시간(ms 단위)도 동일하게 유지될 수 있습니다.

입찰가, 요청 및 시간(ms )을 비교하는 것은 비용이 많이 듭니다.

time_msc 변경 단계가 1000ms인 MT4의 경우 특히 그렇습니다.

 
Andrey Khatimlianskii :

그러나 임무는 모든 주문의 불필요한 열거를 피하는 것입니다.

이 주기는 전체 Expert Advisor에 대해 하나가 될 수 있습니다. 그러나 그런 다음 함수에 변경 사항이 있다는 표시를 전달해야 합니다(같은 성공으로 호출할 수 없음).

이해하지 못했습니다. 데이터베이스에서 무언가가 변경된 경우 알아낼 수 있는 유일한 방법은 데이터베이스의 이전 상태와 비교하는 것입니다.

각 해당 데이터베이스 요소를 비교할 수 있습니다. 또는 그들로부터 해시를 계산하고 해시를 비교하십시오.