Organizando o ciclo do pedido - página 14

 
Andrey Khatimlianskii:

A OrderClose é garantida para fechar o comércio?

Não é garantido, mas há um cheque no código para isso. Cada chamada OnTick é independente da anterior.

 
fxsaber:

Não é garantido, mas há um cheque no código para este caso. Cada chamada OnTick é independente da anterior.

OK, fechar no próximo tick será suficiente.

 
@Artyom Trishkin,@Andrey Khatimlianskii, Obrigado por sua participação! É uma pena que ninguém mais tenha comentado o código MT5. Aparentemente, eles acham que tudo está bem.
 
fxsaber:
@Artyom Trishkin,@Andrey Khatimlianskii, Obrigado por participar! É uma pena que ninguém tenha comentado o código MT5. Aparentemente, eles acham que tudo está bem.

Naturalmente, o exemplo foi dado para responder que nem tudo está bem no MT5. Exemplo mostrando o problema

// Пример неправильного считывания торгового окружения на каждом тике
// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
  int Res = 0;
  
  // Этот MQL5-код с ошибкой
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if (PositionGetSymbol(i) == Symb)
      Res++;

/*
  // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/      
  return(Res);
}

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (!GetAmountPositions(_Symbol))
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

O que você acha, se você executar este roteiro em um símbolo sem posições, o que acontecerá no final?

A resposta correta é que uma ou duas posições serão abertas.

 
fxsaber:

Naturalmente, o exemplo foi dado para responder que nem tudo está bem no MT5. Exemplo mostrando o problema

O que você acha, se você executar este roteiro em um símbolo sem posições, o que acontecerá no final?

A resposta correta é que uma ou duas posições serão abertas.

Como conseqüência, a grande maioria dos Consultores Especialistas MT5 em Kodobase não são escritos corretamente!

 
fxsaber:
Poucos argumentarão 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 modelo de exemplo é escrito especificamente com SB. Então, pergunta para os especialistas do MT5, o código está correto?

Cheguei a este tópico por acidente e na verdade queria começar um tópico para discutir modelos de estratégia. Seu modelo está suficientemente próximo do que eu acho correto (legível para mim), mas ainda assim não gosto quando uma chamada de uma função é inserida no OnTick, que esconde um moinho inteiro.

Em algum momento eu até escrevi MetaEditor: Confiando no poder dos modelos. Desde então o idioma mudou, nenhum editor de modelos. Seria interessante discutir esta questão (poderia estar em um tópico separado), e também obter um artigo sobre o assunto. Acredito que ao escrever o código deve-se tentar tornar a estratégia legível num relance, sem ter que entrar em métodos de classe ou macro.

 
fxsaber:

Como conseqüência - a grande maioria dos Consultores Especialistas MT5 em Kodobaz não são escritos corretamente!

Como sempre - categoricamente. Não pode ser, embora eu não tenha lido seu código.

 
Rashid Umarov:

Há muito tempo eu quero iniciar um tópico para discutir modelos de estratégia. Seu modelo está suficientemente próximo do que eu acho correto (legível para mim), mas ainda não gosto quando uma chamada de uma função é inserida no OnTick, que esconde toda a fábrica de mineração.

Se você fizer OnTick == Estratégia, o modelo encolherá/encolherá até um tamanho obsceno.

Em algum momento eu até escrevi um artigo MetaEditor: Construindo sobre o poder dos modelos. Desde então o idioma mudou, nenhum editor de modelos. Seria interessante discutir esta questão (poderia estar em um tópico separado), e também obter um artigo sobre o assunto. Acredito que ao escrever o código deve-se tentar tornar a estratégia legível num relance, sem ter que entrar em métodos de classe ou macro.

Foi assim que se mostrou o modelo para ambas as plataformas. É tão simples que é difícil discuti-lo, embora para o MT5 seja fundamentalmente errado. Mas você tem CExpert. Eu mesmo ainda não olhei para lá - é assustador.

 
Rashid Umarov:

Como sempre - categórica. Não pode ser, embora eu não tenha lido seu código.

Você o leu, sua opinião é muito interessante.

 
fxsaber:

Naturalmente, o exemplo foi dado para responder que nem tudo está bem no MT5. Exemplo mostrando o problema

O que você acha, se você executar este roteiro em um símbolo sem posições, o que acontecerá no final?

A resposta correta é que uma ou duas posições serão abertas.

E se substituirmos GetAmountPositions por OnTradeTransaction padrão?

Aproximadamente assim:

#include <Trade/Trade.mqh>
  int Res = 0;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
   {
    /******************** Если открылась позиция********************/
    if(PositionSelectByTicket(trans.position))
     Res++;
    /******************** Если закрылась позиция********************/
    if(!PositionSelectByTicket(trans.position))
     Res--;
   }
}/*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (Res == 0)
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}
Razão: