Bibliotecas: BestInterval - página 23

 
fxsaber:

Esta é a única coisa que fiz até agora

O restante não precisa ser corrigido por lotes. Mas há erros relacionados ao outro (antigo). É necessário corrigir.

Atualizado. No modo BestInterval ativado, recomendo usar essa opção.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: Virtual

fxsaber, 2019.12.11 12:15 pm.

É difícil dizer quando os desenvolvedores consertarão a situação com a normalização dos preços iniciais dos símbolos e se farão isso. É por isso que esse modo foi introduzido.
// https://www.mql5.com/ru/forum/321656/page34#comment_14192799
#define  TICKS_FORCE_NORMALIZE // Normalização forçada de preços de ticks de entrada
 

Comportamento bastante inesperado.

Parece que se você executá-lo uma vez com Action=false, ele salvará o resultado da passagem em um arquivo e poderá aplicá-lo mais tarde. Mas o mais inesperado é que ele também salvará todos os parâmetros, como Total, RF, DD, etc. Em outras palavras, se você executá-lo com Action=true em outro intervalo do mesmo símbolo, de outro símbolo etc., ele não apenas aplicará o melhor momento para a negociação, mas também ficará no registro, fornecendo os valores antigos.

 
traveller00:

Se, em seguida, você executá-lo com Action=true em outro intervalo do mesmo símbolo, de outro símbolo etc., ele não só aplicará o melhor momento para a negociação, mas também ficará no registro, fornecendo os valores antigos.

Ele não mostra os valores da execução verdadeira, mas sim os dados da execução falsa que foi aplicada. Você pode alterar o símbolo, o intervalo, etc., mas os valores mostrados não serão alterados. Eles são relevantes apenas para o momento em que a entrada foi feita. Isso é feito propositalmente.

 
Por via das dúvidas, gostaria de salientar que, do ponto de vista da arquitetura, isso não funciona corretamente com o StopLoss. Teoricamente, o StopLoss acionado em action=false pode cair no intervalo que o BestInterval decide descartar. Como resultado, quando action=true ele será deslocado, e os números do resultado podem, às vezes, ser muito diferentes daqueles previstos quando action=false.
 
traveller00:
Por via das dúvidas, gostaria de salientar que, do ponto de vista da arquitetura, isso não funciona corretamente com o StopLoss. Teoricamente, o StopLoss acionado em action=false pode cair no intervalo que o BestInterval decide descartar. Como resultado, ele se deslocará em action=true, e os números do resultado podem, às vezes, ser muito diferentes daqueles previstos em action=false.

Parece que você está entendendo algo errado. Mesmo teoricamente, não deveria haver problemas.

 
Sim, o problema parece ser que o Sync, que está incluído no Virtual e que usa o BestInterval, ignora o StopLoss e o TakeProfit. O problema não é arquitetônico, sou eu que não estou entendendo completamente.
 
traveller00:
Sim, o problema parece ser que o Sync, que está incluído no Virtual e que usa o BestInterval, ignora o StopLoss e o TakeProfit. O problema não é arquitetônico, mas sim o fato de eu não ter entendido completamente.

Estou escrevendo TC por meio de limitadores e tomadores, portanto, seria bom mostrar um exemplo primitivo de reprodução do problema.

 
Quando active=true no BestInterval.mqh, há o voidOnTick( void ), dentro dele SYNC::Positions<BEST_TIME>();, o que levará o Sync.mqh ao staticvoid Positions( constint Handle = 0, constbool Reverse = false ). Dentro dele, os lotes são recalculados e, se estiverem dentro do intervalo exigido, são transferidos do ambiente virtual para o real por meio de SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0);;. É um pouco estranho que o preço não seja retirado das posições, mas lido no local, mas tudo bem. Como você pode ver, o StopLoss e o TakeProfit são passados a zero. Talvez você esteja usando a opção BESTINTERVAL_LIMITSYNC_NETTING, em que o TakeProfit é levado em consideração.
 
traveller00:
Quando active=true no BestInterval.mqh, há o voidOnTick( void ), dentro dele SYNC::Positions<BEST_TIME>();, o que levará o Sync.mqh ao staticvoid Positions( constint Handle = 0, constbool Reverse = false ). Dentro dele, os lotes são recalculados e, se estiverem dentro do intervalo exigido, são transferidos do ambiente virtual para o real por meio de SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0);;. É um pouco estranho que o preço não seja retirado das posições, mas seja lido no local, mas tudo bem. Como você pode ver, o StopLoss e o TakeProfit são passados a zero. Talvez você esteja usando a opção BESTINTERVAL_LIMITSYNC_NETTING, em que o TakeProfit é levado em consideração.

Sim, eu uso esse modo. O modo true foi criado mais para demonstração. Nem sequer pensei em perder tempo com uma solução universal, pois tudo seria desperdiçado.

Se você fizer alguns ajustes, poderá usar o BestInterval-true para passagens únicas de EAs com código-fonte fechado (Market, etc.).

Mas, ainda assim, o principal recurso do BestInterval é trabalhar no modo de otimização. O True é um recurso bom, mas não obrigatório.

 
  int FromFile( const string FileName = __FILE__, const int CommonFlag = 0 )
  {
    const bool Res = (::FileLoad(FileName, this.Intervals, CommonFlag) > 0) && (this.IsCalculated = true);

    if (Res)
    {
      this.AmountDeleteIntervals = ::ArraySize(this.Intervals) - (this.Intervals[0].OpenTime ? 0 : 1);

      this.FullInterval.Calculate(this.Intervals);
    }
    else
      ::Print("ERROR: Can not load the File " + FileName + "!");

    return(Res);
  }
Pequena correção cosmética, int => bool. Ou se eu puder sugerir retornar AmountDeleteIntervals em vez disso.