Organizar el ciclo de pedidos - página 14

 
Andrey Khatimlianskii:

¿Está garantizado que OrderClose cierre la operación?

No está garantizado, pero hay una comprobación en el código para esto. Cada llamada OnTick es independiente de la anterior.

 
fxsaber:

No está garantizado, pero hay una comprobación en el código para este caso. Cada llamada OnTick es independiente de la anterior.

Bien, el cierre en el siguiente tick servirá.

 
@Artyom Trishkin,@Andrey Khatimlianskii, ¡Gracias por su participación! Es una pena que nadie más haya comentado el código de MT5. Al parecer, creen que todo está bien.
 
fxsaber:
@Artyom Trishkin,@Andrey Khatimlianskii, ¡Gracias por participar! Es una pena que nadie haya comentado el código de MT5. Al parecer, creen que todo está bien.

Por supuesto, el ejemplo fue dado para responder que no todo está bien en MT5. Ejemplo que muestra el 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();
}

¿Qué piensas, si ejecutas este script en un símbolo sin posiciones, qué pasará al final?

La respuesta correcta es que se abrirán uno o dos puestos.

 
fxsaber:

Por supuesto, el ejemplo fue dado para responder que no todo está bien en MT5. Ejemplo que muestra el problema

¿Qué piensas, si ejecutas este script en un símbolo sin posiciones, qué pasará al final?

La respuesta correcta es que se abrirán uno o dos puestos.

Como consecuencia, la gran mayoría de los Asesores Expertos de MT5 en Kodobase no están escritos correctamente.

 
fxsaber:
Pocos discutirán esta afirmación

Esta es una regla universal. Pero no mucha gente piensa en su implementación en MT5. Por eso escribí una plantilla de TS más sencilla (en kodobase casi todas son así)

Por alguna razón, algunas personas escriben más código para la misma TS. Pero en realidad este código lo hace igual de bien. La mayoría de los CTs sólo requieren escribir BuySignal y SellSignal. No se necesita nada más.

La plantilla de ejemplo está escrita específicamente con SB. Así que la pregunta a los expertos de MT5, ¿es el código correcto?

Llegué a este hilo por casualidad y en realidad quería iniciar un hilo para discutir las plantillas de estrategia. Tu plantilla se acerca bastante a lo que creo que es correcto (legible para mí), pero aún así no me gusta cuando se inserta una llamada de una función en OnTick, que esconde todo un molino de minería.

En su día incluso escribí MetaEditor: Confiando en el poder de las plantillas. Desde entonces el lenguaje ha cambiado, no hay editor de plantillas. Sería interesante discutir este tema (podría ser en un hilo aparte), y también conseguir un artículo sobre el tema. Creo que cuando se escribe código hay que intentar que la estrategia sea legible de un vistazo sin tener que meterse en métodos de clases o macros.

 
fxsaber:

Como consecuencia, la gran mayoría de los Asesores Expertos de MT5 en Kodobaz no están escritos correctamente.

Como siempre, categóricamente. No puede ser, aunque no he leído su código.

 
Rashid Umarov:

Llevo mucho tiempo queriendo iniciar un hilo para hablar de las plantillas de estrategia. Tu plantilla se acerca bastante a lo que creo que es correcto (legible para mí), pero sigue sin gustarme que se inserte una llamada de una función en OnTick, lo que oculta todo el molino minero.

Si haces que OnTick == Strategy, la plantilla se encogerá/reducirá a un tamaño obsceno.

En su momento incluso escribí un artículo MetaEditor: Building on the power of templates. Desde entonces el lenguaje ha cambiado, no hay editor de plantillas. Sería interesante discutir este tema (podría ser en un hilo aparte), y también conseguir un artículo sobre el tema. Creo que cuando se escribe código hay que intentar que la estrategia sea legible de un vistazo sin tener que meterse en métodos de clases o macros.

Así es como se mostraba la plantilla de ambas plataformas. Es tan simple que es difícil discutirlo, aunque para MT5 es fundamentalmente erróneo. Pero tienes a CExpert. Yo no he mirado ahí, me da miedo.

 
Rashid Umarov:

Como siempre, categórico. No puede ser, aunque no he leído su código.

Si lo lees, tu opinión es muy interesante.

 
fxsaber:

Por supuesto, el ejemplo fue dado para responder que no todo está bien en MT5. Ejemplo que muestra el problema

¿Qué piensas, si ejecutas este script en un símbolo sin posiciones, qué pasará al final?

La respuesta correcta es que se abrirán uno o dos puestos.

¿Y si sustituimos GetAmountPositions por el estándar OnTradeTransaction?

Aproximadamente así:

#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ón de la queja: