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

 
mktr8591 :

제가 거래 상황을 잘못 이해한 것 같습니다.

내가 상상한 대로: 보류 중인 지정가 주문은 여러 거래로 채워졌습니다. 이 모든 시간 동안 그것은 실시간 주문에 매달렸고 ORDER_TIME_SETUP 필드는 상수가 아니었습니다. 마지막 거래 후 그는 역사에 기록되었습니다. 이 시점에서 ORDER_TIME_SETUP 은 상수가 되었습니다.

아니면 틀렸나요?

ORDER_TIME_SETUP은 항상 상수입니다. 내가 역사에 들어갔을 때 ORDER_TIME_DONE이 나타났습니다.

 
fxsaber :

ORDER_TIME_SETUP은 항상 상수입니다. 내가 역사에 들어갔을 때 ORDER_TIME_DONE이 나타났습니다.

이제 지연 제한을 설정하고 있습니다. 그런 다음 내 손으로 변경하고 스크립트와 ORDER_TIME_SETUP 을 변경합니다.

내가 무엇을 잘못하고 있지?

 
Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2020.04.09
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 :

이제 지연 제한을 설정하고 있습니다. 그런 다음 내 손으로 변경하고 스크립트와 ORDER_TIME_SETUP 을 변경합니다.

내가 무엇을 잘못하고 있지?

이것은 노출 시간을 변경하지 않습니다.

 

과연, 포스트. 하지만 전혀 기억나지 않았다. 버그라고 생각합니다.


fxsaber :

부분실행을 반복하면 어떻게 될지 모르겠습니다.

이제 나는 이 브로커(나는 그들의 소프트웨어에 오류가 있는 쪽으로 기울고 있다)가 더 이상 변경되지 않을 것임을 압니다.

 
// Возвращает снепшот котирования символа.
int QuotesSnapshot( const string Symb = NULL , const datetime From = 0 )
{    
   int Snapshot = INT_MAX ;

   MqlTick Ticks[];
  
#define DAY ( 24 * 3600 )  
   const int Size = CopyTicksRange (Symb, Ticks, COPY_TICKS_INFO , From ? From * 1000 : SymbolInfoInteger (Symb, SYMBOL_TIME ) / DAY * DAY * 1000 );
#undef DAY  
  
   for ( int i = 1 ; i < Size; i++)
  {
     const int Interval = ( int )(Ticks[i].time_msc - Ticks[i - 1 ].time_msc);
    
     if (Interval < Snapshot)
      Snapshot = Interval;
  }
  
   return (Snapshot);
}

때때로 틱이 브로드캐스트되는 빈도를 아는 것이 유용합니다.

 

CloseBy 작업은 두 개의 거래를 생성합니다. 첫 번째(CloseBy의 첫 번째 위치) 거래의 스왑에는 두 위치의 스왑 합계가 포함됩니다. 두 번째 거래의 스왑은 0입니다.

CloseBy를 통해 위치를 부분적으로 청산하면 열린 위치의 나머지 부분에서 스왑이 박탈되고 0으로 재설정됩니다.


 // Демонстрация работы со свопами во время частичного закрытия через CloseBy.

#define REPORT_TESTER             // В тестере будут автоматически записываться отчеты
#define REPORT_BROWSER             // Создание отчета с запуском браузера - требует разрешения DLL.
#include <Report.mqh> // https://www.mql5.com/ru/code/18801

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnTick ()
{
   static bool FirstRun = true ;
  
   if (FirstRun)
  {
     if (! OrderSelect ( 0 , SELECT_BY_POS))
      FirstRun = OrderSend ( _Symbol , OP_BUY, 100 , Ask, 0 , 0 , 0 );
     else if (OrderSwap())
    {
       const TICKET_TYPE Ticket = OrderTicket();
      
//      FirstRun = !(OrderCloseBy(OrderSend(_Symbol, OP_SELL, 0.01, OrderClosePrice(),0, 0, 0), Ticket) &&
      FirstRun = !(OrderCloseBy(Ticket, OrderSend ( _Symbol , OP_SELL, 0.01 , OrderClosePrice(), 0 , 0 , 0 )) &&
                   OrderSelect ( 0 , SELECT_BY_POS) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 ));      
    }    
  }    
}


결과.


따라서 롤오버된 적이 없는 최소 위치에서 거대한 스왑이 있을 수 있습니다. 롤오버에서 살아남은 큰 포지션을 위한 제로 스왑.

 

롤오버 수 계산(가장 빠른 옵션 아님).

 #define DAY  ( 24 * 3600 )
#define WEEK (DAY * 7 )

// Возврящает количество "четвергов" между двумя датами.
int GetAmountWeekDay( const datetime Begin, const datetime End, const int DayWeek = - 1 )
{
   const datetime OffsetTime = (DayWeek - WEDNESDAY ) * DAY;
  
   return ((DayWeek != - 1 ) ? ( int )((End - OffsetTime) / WEEK - (Begin - OffsetTime) / WEEK) : 0 );
}

// Возврящает количество рабочих дней между двумя датами.
int GetAmountWorkingDays( const datetime Begin, const datetime End )
{
   const int Res = ( int )(End / DAY - Begin / DAY);
  
   return (Res ? Res - GetAmountWeekDay(Begin, End, SATURDAY ) - GetAmountWeekDay(Begin, End, SUNDAY ) : 0 );
}

// Возвращает количество ролловеров (включая тройные) между двумя датами.
int GetRolloverAmounts( datetime TimeOpen, datetime TimeClose,
                         datetime RolloverTime = 0 , const int Rollover3Days = WEDNESDAY )
{
  RolloverTime = RolloverTime % DAY;
  
  TimeOpen -= RolloverTime;
  TimeClose -= RolloverTime;
  
   const int Res = GetAmountWorkingDays(TimeOpen, TimeClose);
  
   return (Res ? Res + (GetAmountWeekDay(TimeOpen, TimeClose, Rollover3Days) << 1 ) : 0 );
}

#undef WEEK
#undef DAY


사용 예.

 // Сравниваем реальные и вычисленные значения свопов.

#include <MT4Orders.mqh>

input datetime inRolloverTime = 0 ; // Время ролловера
input int inCount = 100 ; // Маскимальное количество распечаток

// Вычисляет своп закрытой позиции.
double CalcOrderSwap( const datetime RolloverTime = 0 )
{
   return (((OrderType() <= OP_SELL) &&
          ( SymbolInfoInteger (OrderSymbol(), SYMBOL_SWAP_MODE ) == SYMBOL_SWAP_MODE_POINTS ))
             // https://www.mql5.com/ru/forum/170952/page208#comment_24667438
           ? GetRolloverAmounts(OrderOpenTime(), OrderCloseTime(), RolloverTime,
             ( int ) SymbolInfoInteger (OrderSymbol(), SYMBOL_SWAP_ROLLOVER3DAYS )) *
             SymbolInfoDouble (OrderSymbol(), OrderType() ? SYMBOL_SWAP_SHORT : SYMBOL_SWAP_LONG ) *
             SymbolInfoDouble (OrderSymbol(), SYMBOL_TRADE_TICK_VALUE ) *
             OrderLots()
           : 0 );
}

#define TOSTRING(A) " " + #A + " = " + ( string )(A)

void OnStart ()
{  
   for ( int i = OrdersHistoryTotal() - 1 , Count = 0 ; (i >= 0 ) && (Count < inCount); i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY) && OrderSwap())
    {
      OrderPrint();
       Print (( string )Count++ + TOSTRING(OrderSwap()) + TOSTRING(CalcOrderSwap(inRolloverTime)) + "\n" );
    }
}


결과.

 # 2122237 2021.09 . 09 23 : 09 : 15.512 sell 0.18 GBPCAD 1.75119 0.00000 1.75286 2021.09 . 10 04 : 27 : 40.506 1.75286 - 0.84 - 0.80 - 20.07 7 ;[ 0 ] 7
97 OrderSwap() = - 0.8 CalcOrderSwap(inRolloverTime) = - 0.8048844238618312
 
fxsaber # :

CloseBy 작업은 두 개의 거래를 생성합니다. 첫 번째(CloseBy의 첫 번째 위치) 거래의 스왑에는 두 위치의 스왑 합계가 포함됩니다. 두 번째 거래의 스왑은 0입니다.

CloseBy를 통해 위치를 부분적으로 청산하면 열린 위치의 나머지 부분에서 스왑이 박탈되고 0으로 재설정됩니다.

...

따라서 롤오버된 적이 없는 최소 위치에서 거대한 스왑이 있을 수 있습니다. 롤오버에서 살아남은 큰 포지션을 위한 제로 스왑.

기이!

정말, 반올림 때문에 (센트를 잃지 않거나 추가하지 않기 위해)?

아니면 거의 사용되지 않는 작업이므로 문제가 되지 않습니까?

 
Andrey Khatimlianskii # :

기이!

정말, 반올림 때문에(센트가 손실되거나 추가되지 않도록)?

이것은 확실히 사실이 아닙니다. 왜냐하면. 부분 마감 시(전체 OrderLots가 아닌 OrderClose) 그에 따라 스왑이 트리거됩니다.

아니면 거의 사용되지 않는 작업이므로 문제가 되지 않습니까?

각본이 잘 짜여진게 아닌가 싶습니다.