Características da linguagem mql4, sutilezas e técnicas - página 20

 
fxsaber:

Não será assim. O algoritmo TimeCurrent é afetado muito indiretamente. Você pode tomar horários de bar, etc.

Basta calcular a data do último domingo (na história do bar) de qualquer forma - para que haja bares antes e depois de domingo. Você pode usar o TimeLocal para isso.

O resultado será sempre GMT+3 se a data da cotação estiver próxima às 00:00 (sessões sem parar), ou GMT+3+N - onde N é o número de horas desde o fechamento da sessão até a meia-noite ou desde a meia-noite até a abertura. O que isso tem a ver com o fuso horário das citações?

 
Ivan Titov:

O resultado será sempre GMT+3 se houver cotações por volta das 00:00 (sessões de 24 horas), ou GMT+3+N - onde N é o número de horas da sessão perto da meia-noite ou da meia-noite até a abertura. O que isso tem a ver com o fuso horário das citações?

Não me lembro de nada deste tópico, portanto não posso responder à pergunta. Se houver alguma inconsistência, é melhor começar demonstrando-a.

 
fxsaber:

Não me lembro de nada deste tópico, então não posso responder à pergunta. Se houver alguma inconsistência, é melhor começar demonstrando-a.

Aqui deste código no terminal BCS (símbolo ED-9.19) a funçãoTimeServerGMT() retorna a hora 2019.08.11 22:48:55 quando TimeCurrent() é 2019.08.12 11:48:55.

 
Ivan Titov:

A partir deste código no terminal BCS (símbolo ED-9.19) função TimeServerGMT() retorna o tempo 2019.08.11 22:48:55 quando TimeCurrent() é 2019.08.12 11:48:55

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Características da linguagem mql4, sutilezas e truques

fxsaber, 2018.03.29 14:32

// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю

Não prestou atenção a este comentário no código.

 
fxsaber:

Não prestou atenção a este comentário no código.

Você está dizendo que se personagens que não são estrangeiros tiverem história disponível, não vai funcionar?

Também aqui está um exemplo para forex em Alpari-Demo EURUSD,H1 em tester:

Para 2019.02.19 14:00:00 devoluções 2019.02.19 11:00:00

Para 2019.06.19 14:00:00 - devoluções 2019.06.19 11:00:00

Embora no inverno deva ser GMT+2 e no verão GMT+3 (EET).

 
Ivan Titov:

Você está dizendo que se personagens não forexuais tiverem um histórico disponível, isso não vai funcionar?

Eu não me lembro. Mas provavelmente foi escrito por uma razão.


É importante estar ciente do que é a compensação GMT. Talvez minha visão deste valor seja muito estreita, no entanto, vejo sua utilidade em apenas uma coisa - a capacidade de sincronizar BPs de preços diferentes uns com os outros.

Não vejo outras razões. Portanto, estas funções devem ser capazes de sincronizar, por exemplo, o EURUSD em diferentes corretores (com diferentes GMT-offset). Se isto não acontecer, somente então há um erro.

 
fxsaber:

É importante perceber para que serve a compensação GMT. Talvez minha visão deste valor seja muito estreita, mas vejo sua utilidade apenas por uma coisa - a capacidade de sincronizar os vários preços BPs uns com os outros.

Não vejo outras razões. Portanto, estas funções devem ser capazes de sincronizar, por exemplo, o EURUSD em diferentes corretores (com diferentes GMT-offset). Se isto não acontecer, somente então há um erro.

Ou um preço BP com algumas novidades BP. Então o truque não vai funcionar?

 
Andrey Khatimlianskii:

Ou um preço BP com algum tipo de notícia. Será que o truque então falhará?

Primeiro, os dois símbolos de divisas nas diferentes fontes estão sincronizados. Depois disso, torna-se claro o viés de um parente em relação ao outro. Com base nestes dados, o resto dos símbolos

dessas fontes.

A sincronização com o calendário seria bom para verificar. Leve as notícias no inverno e no verão. E veja se coincide ou não.

 
Comentários não relacionados a este tópico foram movidos para"Quaisquer perguntas de novatos sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos".
 

Cálculo da rentabilidade.

// Вычисляет профитность на истории не пересекающихся закрытых позиций.
bool GetSumGain( const double Risk, double &SumGain, double &MaxDD, double &RF, const string Symb, const int Magic = -1 )
{
  bool Res = true;
  const double Leverage = Risk * 100;  
      
  SumGain = 1;
  MaxDD = 0;
  RF = 1;

  double MaxGain = SumGain;
  double DDGain = SumGain;
    
  for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Res = (SumGain > 0)); i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL) &&
        (OrderSymbol() == Symb) && ((Magic == -1) || (OrderMagicNumber() == Magic)))        
    {
      SumGain *= 1 - Leverage * ((OrderType() << 1) - 1) * (1 - OrderOpenPrice() / OrderClosePrice());
      
      if (SumGain > MaxGain)
        MaxGain = SumGain;
      else if (1 - SumGain / MaxGain > MaxDD)
      {
        MaxDD = 1 - SumGain / MaxGain;
        
        DDGain = SumGain;
      }
    }
    
  RF = SumGain / DDGain;
      
  return(Res);
}


Aplicando

#property strict
#property  show_inputs

input int MagicNumber = 1; // Для какого мэджика вычислить профитность?

#define  D(A) DoubleToString(A, 2)

void OnStart()
{
  for (int i = 1; i <= 20; i++)
  {
    double SumGain, MaxDD, RF;    
    const double Risk = i * 0.1;
    
    if (GetSumGain(Risk, SumGain, MaxDD, RF, _Symbol, MagicNumber))   
      Print((string)MagicNumber + ": при риске " + D(Risk) +
                                  " увеличение было бы в " + D(SumGain) + " раза" +
                                  " с максимальной относительной просадкой по балансу " + D(MaxDD) + 
                                  ", фактор восстановления = " + D(RF));   
  }
       
}


Resultado

1: при риске 0.30 увеличение было бы в 2.16 раза с максимальной относительной просадкой по балансу 0.19, фактор восстановления = 2.01
1: при риске 0.20 увеличение было бы в 1.68 раза с максимальной относительной просадкой по балансу 0.13, фактор восстановления = 1.60
1: при риске 0.10 увеличение было бы в 1.30 раза с максимальной относительной просадкой по балансу 0.07, фактор восстановления = 1.27