mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 173

 
fxsaber :

위에서 업데이트되었습니다.

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

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2020.04.09 13:13

전혀 만나지 않은 것 같습니다. 설명서를 보십시오. 주문당 두 권이 있습니다.

이것은 라이브 제한입니다. 첫 번째 숫자는 원래 볼륨이고 두 번째 숫자는 채워진 볼륨입니다. 동등해지거나 제거되는 즉시 역사에 남을 것입니다.


그리고 이것은 두 부분으로 실행되는 하나의 주문이 아닌가요? 어쩐지 미완성 볼륨이 이상하게 일치했다.

 
Alexey Viktorov :

그리고 이것은 두 부분으로 실행되는 하나의 주문이 아닌가요? 어쩐지 미완성 볼륨이 이상하게 일치했다.

우연의 일치. 그들은 심지어 다른 마법을 가지고 있습니다.

 
fxsaber :

오더 모드에서는 라이브일 때 오더가 있을 수 없습니다. 죽으면 - 처음에 말했듯이 첫 공연의 시간이있을 것입니다.


역사에서 찾았습니다.

 
fxsaber :

CloseBy를 통해 접을 때 마법이 사라진 것 같습니다. 확인이 필요합니다.

이러한 이유로 아래의 첫 번째 코드가 작동하지 않는 것 같습니다.

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

MQL5의 역사 이익?

fxsaber , 2017.08.26 19:16

  1. MQL5
     double Profit( void )
    {
     double Res = 0 ;
    
     if ( HistorySelect ( 0 , INT_MAX ))
       for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
       {
         const ulong Ticket = HistoryDealGetTicket (i);
         
         if (( HistoryDealGetInteger (Ticket, DEAL_MAGIC ) == MagicNumber) && ( HistoryDealGetString (Ticket, DEAL_SYMBOL ) == Symbol ()))
           Res += HistoryDealGetDouble (Ticket, DEAL_PROFIT );
       }
         
       return (Res);
    }


  2. MQL5 + MQL4
     #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0 ;
    
     for ( int i = OrdersHistoryTotal () - 1 ; i >= 0 ; i--)
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && ( OrderMagicNumber () == MagicNumber) && ( OrderSymbol () == Symbol ()))
         Res += OrderProfit ();
         
       return (Res);
    }

마법으로 이익을 계산하는 것이 문제인 것 같습니다.

 
주문 가격은 정상화되지만 거래는 정상화되지 않습니다. 스크립트는 이러한 트랜잭션을 찾습니다.
 void OnStart ()
{
   if ( HistorySelect ( 0 , INT_MAX ))
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--) // Перебираем все сделки
    {
       const ulong Ticket = HistoryDealGetTicket (i); // Тикет сделки
       const double Price = HistoryDealGetDouble (Ticket, DEAL_PRICE ); // Цена сделки
      
       if ( NormalizeDouble (Price, 5 ) != Price) // Если цена сделки не нормализована,      
         Print (Ticket);                         // печатаем тикет сделки.
    }
}
 

실시간으로 MT5에 의해 자동으로 배치되는 개시/마감 위치에 대한 화살표는 TradeTransaction 이벤트를 기반으로 합니다.


나는 단지 이러한 이벤트(12개 정도의 포지션 열기 및 닫기)가 단기적인 연결 끊김으로 인해 터미널에 도달하지 못한 것을 보았을 뿐입니다. 방금 일어난 일입니다. 나는 컴퓨터에 앉아서 내 눈으로 지켜봤습니다. 결과적으로 해당 화살표가 없습니다.


그리고 여기에서 때때로 말했듯이 전투 고문에서 OnTradeTransaction 에 의존할 수 없습니다. OrderSendAsync 작업을 위한 신뢰할 수 있는 공개 메커니즘이 없다는 것은 유감입니다.

 
fxsaber :

OrderSendAsync 작업을 위한 신뢰할 수 있는 공개 메커니즘이 없다는 것은 유감입니다.

및 서비스가 거래 작업 에 액세스할 수 있습니까? - 그렇다면 10ms마다 모니터링하고 차트에 이벤트를 보낼 수 있습니다.

나는 도움말을 보았고 아마도 서비스에 대해 추가했다고 생각했지만 내 생각에는 작년과 같았습니다.

•서비스는 지표, 어드바이저 및 스크립트와 달리 작업을 위해 차트에 바인딩할 필요가 없는 프로그램입니다. 스크립트와 마찬가지로 서비스는 시작 이벤트 이외의 이벤트를 처리하지 않습니다. 서비스를 시작하려면 해당 코드에 OnStart 핸들러 함수가 포함되어야 합니다. 서비스는 시작 이외의 이벤트를 허용하지 않지만 EventChartCustom을 사용하여 차트에 사용자 정의 이벤트를 보낼 수 있습니다.

UPD: 스크립트 서비스 스케치

 struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator ==( const SOrderInfo &v){ return (positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart ()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while (! IsStopped ())
   {
       Sleep ( 10 );
      CurrState = UpdateOrdersInfo();
       if (CurrState == LastState) continue ;
      LastState = CurrState;
       Print ( "Orders changed!" );
   }
   return ( 0 );
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal ();
   result.orderstotal        = OrdersTotal ();
   result.historyorderstotal = HistoryOrdersTotal ();
   return (result);
}
//+------------------------------------------------------------------+

나는 내 손으로 여러 주문을 열고 닫았습니다. 제 생각에는 문제없이 작동합니다.

 
Igor Makanu :

및 서비스가 거래 작업 에 액세스할 수 있습니까? - 그렇다면 10ms마다 모니터링하고 차트에 이벤트를 보낼 수 있습니다.

이것은 sovtenik의 동일한 열거와 다르지 않습니다. 숫자를 비교하는 것만으로는 충분하지 않으며 내부가 바뀔 수 있습니다.

 
Andrey Khatimlianskii :

이것은 sovtenik의 동일한 열거와 다르지 않습니다. 숫자를 비교하는 것만으로는 충분하지 않으며 내부가 바뀔 수 있습니다.

Alerts와 같은 서비스는 매우 좋습니다. 차트가 필요하지 않으며 터미널과 함께 자동으로 실행됩니다. 계정 간 전환 상황을 해결하기만 하면 됩니다.

ZY Service는 전투 고문이 될 수 있습니다. GUI가 없으면 그다지 편리하지 않습니다.
 
Andrey Khatimlianskii :

이것은 sovtenik의 동일한 열거와 다르지 않습니다. 숫자를 비교하는 것만으로는 충분하지 않으며 내부가 바뀔 수 있습니다.

은 다르다

소위 통제 및 관리 작업이 있습니다.

EA - 관리, 서비스 - 제어

제어가 중복되어서는 안 됩니다. 시스템의 모든 리소스를 제거하고 제어 대신 불안정한 시스템을 가져옵니다.

이벤트의 중요도를 결정하는 것이 필요합니다. IMHO, 마감 및 열기 주문은 제어가 필요한 중요한 이벤트이며 TP 및 SL 변경은 이전과 같이 수행할 수 있습니다(몇 번의 실패 시도 - 우리는 포기했습니다. 우리는 그것을 다시 반복할 것입니다 다음 틱)

그리고 당신이 제안한 대로 - 가능한 한 모든 것을 제어하기 위해 - SQLite에서 주문 상태를 반복할 수 있습니다. 그러면 이 데이터베이스를 서비스 및 EA와 동기화하는 작업이 나타날 것입니다 .... 이 모든 것은 불필요합니다


나는 그 체계가 더 단순해야 한다고 생각합니다 - 다음과 같습니다: 우리는 EA의 터미널로부터 OnTradeTransaction 이벤트를 수신했고 EA의 추가 제어를 위해 서비스로부터 OnChartEvent 이벤트를 생성했습니다.