주문 열거 주기의 구성 - 페이지 12

 
Artyom Trishkin :

프라이팬은 무엇을 위한 것입니까?

- 예를 들어, 계란을 튀기기 위해.

-그래서 대화는 스크램블 에그가 아니라 프라이팬에 관한 것입니다 ...


ooh - 멋지다 - 두 명의 공격자가 맞붙었다 ... 화상 - 그렇지 않으면 그렇게 지루하다 ...

 
Artyom Trishkin :

프라이팬은 무엇을 위한 것입니까?

- 예를 들어, 계란을 튀기기 위해.

-그래서 대화는 스크램블 에그가 아니라 프라이팬에 관한 것입니다 ...

봤어? 이미 당신과 내가 거의 치명적인 싸움에서 씨름하고 있다고 믿습니다.

여하튼 나는 이미 이 토론을 계속하는 것이 게을렀습니다. 밀리초마다 주문을 정렬해야 하는 이유를 이해할 수 없습니다. 계란후라이도 그 중 하나인가...

 
Alexey Viktorov :

봤어? 이미 당신과 내가 거의 치명적인 싸움에서 씨름하고 있다고 믿습니다.

여하튼 나는 이미 이 토론을 계속하는 것이 게을렀습니다. 밀리초마다 주문을 정렬해야 하는 이유를 이해할 수 없습니다. 계란후라이도 그 중 하나인가...

그래 ..., 바로 발 뒤꿈치를 잡고 ... :)
나는 모든 사람을 말하는 것이 아닙니다. 그러나 종종 - 환경의 변화를 적시에 감지하기 위해.
 
글쎄, 나는 그렇게하지 않습니다 ... 썩은 ... 실망 ...
 

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

주문 열거 주기의 구성

fxsaber , 2017.10.06 02:00

 bool IsChange( const bool InitFlag = false )
{
   static int PrevTotal = 0 ;
   static int PrevHistoryTotal = 0 ;
  
   const int Total = OrdersTotal ();
   const int HistoryTotal = OrdersHistoryTotal ();    
  
   if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal ;    
  }
  
   return (!InitFlag && ((Total != PrevTotal) || ( HistoryTotal != PrevHistoryTotal)));
}

역사에 의존하지 않는 버전.

 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);
}

이 버전은 VPS의 MT5와 특히 관련이 있습니다. MT5는 History와 함께 매우 느리게 작동하고 계산 비용이 많이 듭니다.

 
fxsaber :

역사에 의존하지 않는 버전.

이 버전은 특히 VPS의 MT5와 관련이 있습니다. MT5는 History와 함께 매우 느리게 작동하며 계산 비용이 많이 듭니다.


이 경우 일반 OnTrade()를 사용하는 것이 좋습니다.

무역

이벤트가 발생하면 함수가 호출됩니다.   목록이 변경될 때 발생하는 거래   발행된 명령   그리고   오픈 포지션 ,   주문 내역   그리고   거래 내역 . 모든 거래 작업(대기 중인 주문, 포지션 열기/닫기, 정지 배치, 보류 중인 주문 실행 등)은 주문 및 거래 내역 및/또는 포지션 목록 및 현재 주문을 그에 따라 변경합니다.

 
Sergey Chalyshev :

이 경우 일반 OnTrade()를 사용하는 것이 좋습니다.

불행히도 당신은 할 수 없습니다. 이 스레드에 대해.

 
이 말에 이의를 제기하는 사람은 거의 없을 것입니다.

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

오류, 버그, 질문

fxsaber , 2018.01.23 09:39

성공적이지 못한 OrderSend 후에는 현재 거래 환경을 완전히 다시 읽어야 합니다. 이 규칙은 항상 적용되어야 합니다.

이것은 보편적인 규칙입니다. 그러나 MT5에서의 구현에 대해 생각하는 사람은 거의 없습니다. 따라서 가장 간단한 TS에 대한 템플릿을 작성했습니다(거의 모두 코드베이스에 있음).

 // Шаблон большинства ТС

#include <Trade/Trade.mqh>

// Сигнал на покупку
bool BuySignal( const string Symb ) { return ( true ); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return ( false ); }

// Находит позицию соответствующего типа
bool PositionsScan( const string Symb, const ENUM_POSITION_TYPE Type )
{
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if (( PositionGetSymbol (i) == Symb) && ( PositionGetInteger ( POSITION_TYPE ) == Type))
       return ( true );    
    
   return ( false );  
}

// Торговое действие на сигнал
bool Action( const string Symb, const ENUM_POSITION_TYPE Type, const double Lots = 1 )
{
   static CTrade Trade;    
   bool Res = true ;    
  
   // Закрыли противоположные сигналу позиции
   while ((PositionsScan(Symb, ( ENUM_POSITION_TYPE )( 1 - Type))) && (Res = Trade.PositionClose( PositionGetInteger ( POSITION_TICKET ))));

   // Открыли позицию по сигналу
   return (Res && !PositionsScan(Symb, Type) && (Type ? Trade.Sell(Lots, Symb) : Trade.Buy(Lots, Symb)));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
   if (BuySignal(Symb))
    Action(Symb, POSITION_TYPE_BUY );
   else if (SellSignal(Symb))
    Action(Symb, POSITION_TYPE_SELL );
}

void OnTick ()
{
  Strategy( _Symbol );
}

어떤 이유로 일부 사람들은 동일한 차량에 대해 더 많은 코드를 작성합니다. 그러나 실제로 이 코드도 마찬가지입니다. 대부분의 TS는 BuySignal 및 SellSignal만 작성하면 됩니다. 다른 것은 필요하지 않습니다.

예제 템플릿은 특별히 SB를 사용하여 작성되었습니다. 따라서 질문은 MT5 전문가를 위한 것입니다. 코드가 정확합니까?

 
fxsaber :
이 말에 이의를 제기하는 사람은 거의 없을 것입니다.

이것은 보편적인 규칙입니다. 그러나 MT5에서의 구현에 대해 생각하는 사람은 거의 없습니다. 따라서 가장 간단한 TS에 대한 템플릿을 작성했습니다(거의 모두 코드베이스에 있음).

어떤 이유로 일부 사람들은 동일한 차량에 대해 더 많은 코드를 작성합니다. 그러나 실제로 이 코드도 마찬가지입니다. 대부분의 TS는 BuySignal 및 SellSignal만 작성하면 됩니다. 다른 것은 필요하지 않습니다.

예제 템플릿은 특별히 SB를 사용하여 작성되었습니다. 따라서 질문은 MT5 전문가를 위한 것입니다. 코드가 정확합니까?

다음은 다음과 같습니다.

성공적 이지 못한 OrderSend 후에는 현재 거래 환경을 완전히 다시 읽어야 합니다. 이 규칙은 항상 적용되어야 합니다.

왜 실패한 후에 모든 것을 끌어 당기는가? 왜 주문과 직위의 역사를 귀찮게합니까? 현재 주문 및 위치도? 현재 필요한 가격과 데이터를 업데이트하기에 충분하지 않습니까?

 
Artyom Trishkin :

왜 실패한 후에 모든 것을 끌어 당기는가? 왜 주문과 직위의 역사를 귀찮게합니까? 현재 주문 및 위치도? 현재 필요한 가격과 데이터를 업데이트하기에 충분하지 않습니까?

문자 그대로 이해하면 Market Watch에서 각 기호의 과거 틱 기록도 읽을 수 있습니다. 그러나 나는 당신이 그 말의 의미를 실제로 이해하고 있다고 생각합니다.

코드는 이 명령문을 구현하는 것 같습니다. 따라서 MT5를 이해하는 모든 사람을 위한 질문이 있었습니다. 코드가 정확합니까?