Erros, bugs, perguntas - página 1863

 
fxsaber:

O ACCOUNT_PROFIT no testador mostra disparates.


Acrescentarei:

1. para instrumentos de troca

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

2. além disso, a lógica do Expert Advisor não funciona correctamente quando se concentra no lucro/perda total das posições.

Concentramo-nos nos valores ACCOUNT_PROFIT no encerramento.

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

Ao fechar, o terminal recalcula o lucro, de modo que se acaba com

perto da perda

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

como resultado, temos

#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:

Acrescentarei:

No SD, estamos a lidar com...
 
Slawa:
Aparentemente, não compreendo nada sobre o HFT. Tanto quanto sei, quando se negoceia "muito depressa", não se preocupa com as trocas anteriores.

HFT deu um exemplo de um TS que apenas faz muitas transacções.

Pode correr um longo período de escalpe. O principal é ter muitos ofícios (dezenas de milhares). Aparecerão então as desvantagens da implementação actual do trabalho com a história.


A situação actual é a seguinte. Se houver muitos negócios, não utilize a história.

 
fxsaber:
No SD...


isso é óptimo.

basta remover o uso do ÚLTIMO preço para obter resultados adequados

 

Ajude-me por favor a encontrar o recuo mínimo em pontos do preço de posição aberta para parar a perda e níveis de lucro, de modo a não os colocar demasiado perto do preço de abertura e a não correr contra o erro 10016 (TRADE_RETCODE_INVALID_STOPS). Tentei usar SymbolInfoInteger (ver código abaixo), mas este cálculo retorna 0. Se alguém me puder dar uma ideia de como o calcular correctamente.

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

Por favor ajude-me a encontrar o recuo mínimo em pips do preço de posição aberta para parar a perda e níveis de lucro, de modo a não os colocar demasiado perto do preço de abertura e a não correr contra o erro 10016 (TRADE_RETCODE_INVALID_STOPS). Tentei usar SymbolInfoInteger (ver código abaixo), mas este cálculo retorna 0. Se alguém me puder dar uma ideia de como o calcular correctamente.


0 - sem limite. Mas há também SYMBOL_SESSION_PRICE_LIMIT_MIN e SYMBOL_SESSION_PRICE_LIMIT_MAX.
 
fxsaber:

0 - não há limite. Mas há também SYMBOL_SESSION_PRICE_LIMIT_MIN e SYMBOL_SESSION_PRICE_LIMIT_MAX.
Hmm, nesse caso gostaria que SYMBOL_TRADE_STOPS_LEVEL funcionasse de forma diferente. Se 0 for ilimitado, então teoricamente, ao enviar .PositionOpen(...) ao servidor, poderíamos definir paragens a 1 pip (por 5 dígitos) do preço aberto, mas o erro TRADE_RETCODE_INVALID_INVALID_STOPS apareceria a 100%. Até agora, estou perplexo.
 
Maxim Khrolenko:
Hmm, nesse caso gostaria que SYMBOL_TRADE_STOPS_LEVEL funcionasse de alguma forma diferente. Se 0 for ilimitado, então teoricamente, ao enviar .PositionOpen(...) para o servidor, poder-se-ia colocar paragens a 1 pip (por 5 dígitos) do preço aberto, mas o erro TRADE_RETCODE_INVALID_INVALID_STOPS apareceria a 100% aqui. Até agora, estou perplexo.

E que tal isto?

 if(stoplevel==0) stoplevel=SymbolInfoInteger(symb,SYMBOL_SPREAD);
 
Algo voltou a acontecer ao testador - 1586. Consultor especializado para reprodução
#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;
  }    
}

A cada sinal ou coloca um limite ao preço actual (para executar imediatamente) ou fecha a posição. Ou seja, deveria haver muitas posições. Mas não é este o caso, uma vez que os limitadores deixaram de executar. Aqui está o fim do registo mostrando

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 foi fixado em Bid, mas nunca foi executado.

Em 1585 tudo estava bem com ele.

 
fxsaber:
Algo foi feito ao provador novamente - 1586.

E compreendo que estou errado, mas ainda assim tenho a impressão de uma abordagem errada para a libertação de construções. Não costumava haver um número tão grande de relatórios de bugs após o lançamento das construções.