Errores, fallos, preguntas - página 1863

 
fxsaber:

ACCOUNT_PROFIT en el probador muestra una tontería.


Voy a añadir:

1. para los instrumentos de cambio

Как следствие, неправильно оцениваются эквити, просадка и т.д.

2. Además, la lógica del Asesor Experto no funciona correctamente cuando se centra en la ganancia/pérdida total de las posiciones.

Nos centramos en los valores de ACCOUNT_PROFIT al cierre.

2017.04.20 11:30:26.318 Core 1  2017.04.17 18:02:46   Профит = 333.01

Al cerrar, el terminal vuelve a calcular el beneficio, por lo que se termina con

cerrar en la pérdida

2017.04.20 11:30:26.318 Core 1  2017.04.17 22:02:08   Профит = -338.66

como resultado tenemos

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
input     string symb="GOLD-6.17";
input     string symb1="GOLD-9.17";
input     double  ТП  =333;
datetime date1;
double i1,ask1,ask2,bid1,bid2,last1,last2,profit;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  double price1=SymbolInfoDouble(symb,SYMBOL_BID);
  double price2=SymbolInfoDouble(symb1,SYMBOL_BID);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
Comment("");
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {
//---
      profit=AccountInfoDouble(ACCOUNT_PROFIT);
      Comment("ПРофит = ",profit);
     if(PositionsTotal()==0 )
     {
      m_trade.Buy(1.00,symb);
      m_trade.Buy(1.00,symb1);    
     }

   if( MathAbs(profit)>=ТП )
     {
      Print("Профит = ",profit);
     CloseAll();
     }

  }  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

 
kaus_bonus:

Yo añadiré:

En la SD, estamos tratando con...
 
Slawa:
Parece que no entiendo algo sobre la HFT. Por lo que sé, cuando se opera "muy rápido", no se tiene en cuenta las operaciones anteriores.

HFT dio un ejemplo de una ST que simplemente hace muchas operaciones.

Puedes hacer una carrera durante un largo periodo de algún scalper. Lo principal es tener muchas operaciones (decenas de miles). A continuación, aparecerán las desventajas de la implementación actual del trabajo con el historial.


La situación actual es la siguiente. Si hay muchas ofertas, no utilice el historial.

 
fxsaber:
En la SD...


eso es genial.

basta con eliminar el uso del precio LAST para obtener resultados adecuados

 

Por favor, ayúdenme a encontrar la sangría mínima en puntos desde el precio de apertura de la posición hasta los niveles de stop-loss y take-profit, para no ponerlos demasiado cerca del precio de apertura y no encontrar el error 10016 (TRADE_RETCODE_INVALID_STOPS). He intentado utilizar SymbolInfoInteger (ver código abajo), pero este cálculo devuelve 0. Si alguien puede darme una idea de cómo calcularlo correctamente.

void OnStart()
  {
   long stopLevel;
   if(SymbolInfoInteger("EURUSD",SYMBOL_TRADE_STOPS_LEVEL,stopLevel))
      Print("stopLevel = ",stopLevel);
  }
 
Maxim Khrolenko:

Por favor, ayúdenme a encontrar la sangría mínima en pips desde el precio de apertura de la posición hasta los niveles de stop-loss y take-profit, para no ponerlos demasiado cerca del precio de apertura y no encontrar el error 10016 (TRADE_RETCODE_INVALID_STOPS). He intentado utilizar SymbolInfoInteger (ver código abajo), pero este cálculo devuelve 0. Si alguien puede darme una idea de cómo calcularlo correctamente.


0 - sin límite. Pero también existen SYMBOL_SESSION_PRICE_LIMIT_MIN y SYMBOL_SESSION_PRICE_LIMIT_MAX.
 
fxsaber:

0 - no hay límite. Pero también existen SYMBOL_SESSION_PRICE_LIMIT_MIN y SYMBOL_SESSION_PRICE_LIMIT_MAX.
Hmm, en ese caso me gustaría que SYMBOL_TRADE_STOPS_LEVEL funcionara de otra manera. Si el 0 es ilimitado, entonces teóricamente, al enviar .PositionOpen(...) al servidor, podríamos establecer stops a 1 pip (por 5 dígitos) del precio de apertura pero el error TRADE_RETCODE_INVALID_STOPS aparecería al 100%. Hasta ahora estoy perplejo.
 
Maxim Khrolenko:
Hmm, en ese caso me gustaría que SYMBOL_TRADE_STOPS_LEVEL funcionara de alguna manera diferente. Si 0 es ilimitado, entonces teóricamente, al enviar .PositionOpen(...) al servidor, uno podría colocar stops a 1 pip (por 5 dígitos) del precio de apertura, pero el error TRADE_RETCODE_INVALID_STOPS aparecería al 100% aquí. Hasta ahora estoy perplejo.

¿Qué te parece esto?

 if(stoplevel==0) stoplevel=SymbolInfoInteger(symb,SYMBOL_SPREAD);
 
Algo le ha pasado al probador de nuevo - 1586. Asesor experto en reproducción
#include <MT4Orders.mqh>

// Metaquotes-Demo, RTS-6.17, 2017.04.07 - 2017.04.08, на основе реальных тиков, начальный баланс 100000
void OnTick()
{  
  static int Type = OP_BUY;

  MqlTick Tick;    
  
  if (OrderSelect(0, SELECT_BY_POS) && (OrderType() <= OP_SELL))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);    
  else if ((OrdersTotal() == 0) && SymbolInfoTick(_Symbol, Tick) && (Tick.bid != 0) && (Tick.ask != 0))
  {
    OrderSend(_Symbol, Type + OP_BUYLIMIT, 1, (Type == OP_BUY) ? Tick.ask : Tick.bid, 0, 0, 0);
    
    Type = OP_SELL - Type;
  }    
}

En cada tick pone un límite al precio actual (para ejecutar inmediatamente) o cierra la posición. Es decir, debe haber muchos puestos. Pero este no es el caso, ya que los limitadores han dejado de ejecutarse. Aquí está el final del registro que muestra

2017.04.20 12:47:41.885 2017.04.07 10:00:00   sell limit 1.00 RTS-6.17 at 114060 (114060 / 114180 / 113770)
2017.04.20 12:47:41.885 2017.04.07 23:44:59   order canceled due end of test [#140  sell limit 1.00 RTS-6.17 at 114060]
2017.04.20 12:47:41.885 final balance 91195.12 RUR
2017.04.20 12:47:41.885 RTS-6.17,M1: 327182 ticks, 788 bars generated. Test passed in 0:00:00.218.

SellLimit se fijó en Bid, pero nunca se ejecutó.

En 1585 todo estaba bien.

 
fxsaber:
Algo se ha hecho al probador de nuevo - 1586.

Y entiendo que me equivoque, pero aún así me da la impresión de que hay un planteamiento erróneo de la liberación de las construcciones. No solía haber un número tan grande de informes de errores tras la publicación de las compilaciones.

Razón de la queja: