Organizando o ciclo do pedido - página 12

 
Artyom Trishkin:

- Para que você precisa de uma frigideira?

- Por exemplo, para fritar ovos.

- não é sobre ovos mexidos, é sobre a frigideira.


Ooh, isso é engraçado... dois assaltantes em confronto... Continue, está ficando entediante...

 
Artyom Trishkin:

- Para que você precisa de uma frigideira?

- Como a fritura de ovos, por exemplo.

- Então não estamos falando de ovos mexidos, estamos falando de uma frigideira.

Você viu isso? Já pensamos que você e eu estamos presos em uma experiência de quase morte.

Estou ficando um pouco preguiçoso para continuar esta discussão. Não consigo entender porque a cada milissegundo você tem que passar pelas ordens. A menos que seja para fritar um ovo...

 
Alexey Viktorov:

Você viu isso? Já pensamos que você e eu estamos presos em uma experiência de quase morte.

Estou ficando um pouco preguiçoso com esta discussão. Não consigo entender por que temos que passar pelas ordens a cada milissegundo. A menos que queira fritar ovos com eles...

Sim... acertou no calcanhar... :)
Não estou dizendo todas as vezes. Mas muitas vezes, a tempo de detectar uma mudança no ambiente.
 
bem, eu não jogo assim ... ...murchou... desapontado...
 

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Organização de um ciclo de pedidos

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

Versão sem referência à história.

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

Esta versão é especialmente relevante para o MT5 no VPS, já que o MT5 trabalha com a História muito lentamente e é computacionalmente caro.

 
fxsaber:

Versão sem referência histórica.

Esta versão é especialmente relevante para o MT5 em VPS, pois o MT5 é muito lento e intensivo em CPU.


Em tal caso, é melhor usar o OnTrade() regular.

OnTrade

Esta função é chamada quando ocorre um eventocomercial, que muda a lista depedidos colocados eposições em aberto, ohistórico de pedidos e ohistórico de negócios. Quando qualquer ação comercial (abertura de ordem pendente, abertura/fechamento de posição, parada de ajuste, acionamento de ordem pendente, etc.) o histórico de ordens e negócios e/ou lista de posições e ordens atuais é alterado de acordo.

 
Sergey Chalyshev:

Nesse caso, é melhor usar o OnTrade() normal.

Infelizmente, você não pode. É disso que se trata o ramo.

 
Poucos argumentarão com esta declaração

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Bichos, insetos, perguntas

fxsaber, 2018.01.23 09:39

Depois que a OrderSend falhou e a OrderSend foi bem sucedida, o ambiente comercial atual deve ser lido completamente novamente. Esta regra deve ser sempre aplicada.

Esta é uma regra universal. Mas poucas pessoas pensam em sua implementação no MT5. Por isso escrevi um modelo da TS mais descomplicada (em kodobase quase todas são assim)

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

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

Por alguma razão, algumas pessoas escrevem mais código para o mesmo TS. Mas na verdade, este código também faz bem. A maioria dos TCs requer apenas a escrita BuySignal e SellSignal. Nada mais é necessário.

O modelo de exemplo é escrito especificamente com SB. Então, pergunta aos especialistas do MT5, o código está correto?

 
fxsaber:
Quase ninguém argumentaria com esta declaração

Esta é uma regra universal. Mas não são muitas as pessoas que pensam em sua implementação no MT5. Por isso escrevi um modelo da TS mais descomplicada (em kodobase quase todas são assim)

Por alguma razão, algumas pessoas escrevem mais código para o mesmo TS. Mas na verdade, este código também faz bem. A maioria dos TCs requer apenas a escrita BuySignal e SellSignal. Nada mais é necessário.

O exemplo do modelo é escrito especificamente com SB. Então, pergunta aos especialistas do MT5, o código está correto?

Sobre esta declaração:

Após uma falha no OrderSend e um OrderSend bem sucedido, o ambiente comercial atual deve ser lido completamente novamente. Esta regra deve ser sempre aplicada.

Por que devemos puxar tudo depois de um fracasso? Por que devemos verificar o histórico de pedidos e posições? As ordens e posições atuais também? Não é suficiente atualizar os preços e os dados necessários para o momento atual?

 
Artyom Trishkin:

Por que puxar tudo depois de um mau? Por que se preocupar com o histórico de pedidos e posições? Ordens e posições atuais também? Não é suficiente atualizar os preços e os dados que precisamos no momento?

Se você tomar isto literalmente, então você pode ler a história passada de cada símbolo da Market Watch. Mas eu acho que você realmente entende o significado da declaração.

O código implementa esse tipo de declaração. É por isso que eu tinha uma pergunta para todos que entendem MT5: o código é correto?

Razão: