Características da linguagem mql5, subtilezas e técnicas - página 86

 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Bugs, bugs, perguntas

fxsaber, 2018.06.20 23:18

Decidiu verificar quanto tempo duram estas situações de ordem fantasma, quando uma ordem está no sistema mas não no Terminal.

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


Resultado

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


32 milissegundos uma ordem está lá mas não no Terminal! Imagine as consequências se a lógica de negociação fosse executada neste intervalo ...


É interessante que as ordens fantasma estão mais frequentemente presentes apenas emTRADE_TRANSACTION_ORDER_DELETE e em TRADE_TRANSACTION_DEAL_ADD (muito mais raras) tipos de transação.


Muito mau matiz de plataforma.


ZZY A velocidade das transações comerciais no 5 é questionável, infelizmente.

 
O HistorySelect é lento, se você fizer o pedido de histórico desde o início. Portanto, é desejável fazer algo como isto

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

OrderCloseTime Expert Advisor MQL5

fxsaber, 2018.07.06 09:27

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static datetime PrevTime = 0;
  
  if (HistorySelect(PrevTime, INT_MAX)) // HistorySelect(0, INT_MAX) - slow.
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
  
  PrevTime = CloseTime;
}


Claramente a solução está à beira de ser uma muleta. As outras implementações não serão mais tão sucintas. Uma forma simples de contornar os freios geralmente não funciona.

 
fxsaber:
Implementação rápida do OnTick com múltiplos símbolos

Não consigo perceber,

por que o OnTick tem o parâmetro Símbolo e por que está sem o parâmetro?

e por que está abaixo do comentário novamente?

porque não apenas umOnChartEvent básico?

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
Fxsaber, temos um druker de código fixe. Eu não consigo perceber este chip.
 
Fast528:

porque não apenas através de umOnChartEvent básico?

Porque é conveniente manter as "moscas e costeletas" separadas. Escreva toda a lógica em um OnTick com vários caracteres. Coincidências nos nomes são aleatórias...

 
fxsaber:

Porque é conveniente manter as "moscas e costeletas" separadas. Escreva toda a lógica em um OnTick com vários símbolos. Coincidências nos nomes são coincidências...

...com todos vocês até ao ano 2028...

é o teu código, eu vou encontrar o completo.

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Советник

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
Fast528:

Ninguém está forçando você a usar esta variante da implementação do evento NewTick com múltiplos símbolos. Neste ramo, eu coloco todo o tipo de coisas juntas de forma simples.

 
fxsaber:

Ninguém está forçando você a usar esta variante da implementação do evento NewTick com múltiplos símbolos. Neste fio, eu só juntei todo o tipo de coisas.

Eu estava interessado no OnTick, também com parâmetros, o compilador engole

 
Fast528:

Estava a pensar porque é que a OnTick????

Não me conheço, coincidência aleatória.

 
fxsaber:

Eu não me conheço, coincidência aleatória.

Não me diga, encontrei uma funcionalidade, os MCs ainda não corrigiram o nome de uma das principais funções, passei muito tempo lendo e procurando por ela.

à procura de um recurso não documentado.