Особенности языка mql4, тонкости и приёмы работы - страница 20

 
fxsaber:

Не нарушится. На алгоритм TimeCurrent влияет очень косвенно. Можно взять время бара и т.д.

Надо просто любым способом вычислить дату последнего прошедшего (в истории баров) воскресенья - чтобы были бары до воскресенья и после. Т.е можете взять хоть TimeLocal для этого.

Результатом всегда будет GMT+3 при наличии котировок около 00:00 (сессии круглосуточные), или GMT+3+N - где N - количество часов от закрытия сессии до полуночи или от полуночи до открытия. Какое отношение это имеет к часовому поясу котировок?

 
Ivan Titov:

Результатом всегда будет GMT+3 при наличии котировок около 00:00 (сессии круглосуточные), или GMT+3+N - где N - количество часов от закрытия сессии до полуночи или от полуночи до открытия. Какое отношение это имеет к часовому поясу котировок?

Совсем не помню этой темы, поэтому ответить на вопрос не могу. Если есть какое-то несоответствие, лучше начать с его демонстрации.

 
fxsaber:

Совсем не помню этой темы, поэтому ответить на вопрос не могу. Если есть какое-то несоответствие, лучше начать с его демонстрации.

Вот из этого кода на терминале БКС (символ ED-9.19) функция  TimeServerGMT() возвращает время 2019.08.11 22:48:55 в момент, когда TimeCurrent() равно 2019.08.12 11:48:55.

 
Ivan Titov:

Вот из этого кода на терминале БКС (символ ED-9.19) функция  TimeServerGMT() возвращает время 2019.08.11 22:48:55 в момент, когда TimeCurrent() равно 2019.08.12 11:48:55.

Не обратили внимание на этот комментарий в коде.

 
fxsaber:

Не обратили внимание на этот комментарий в коде.

Хотите сказать, что если у не форекс-символов история будет доступна, то работать не будет?

Также вот пример для форекса на Alpari-Demo EURUSD,H1 в тестере:

Для 2019.02.19 14:00:00 возвращает 2019.02.19 11:00:00

Для 2019.06.19 14:00:00-возвращает 2019.06.19 11:00:00

Хотя зимой должно быть GMT+2, а летом GMT+3 (EET).

 
Ivan Titov:

Хотите сказать, что если у не форекс-символов история будет доступна, то работать не будет?

Не помню. Но, наверное, не просто так было написано.


Важно осознавать, для чего GMT-смещение нужно. Возможно, мое видение этой величины слишком узкое, однако, вижу полезность его только в одном - умение синхронизации различных ценовых ВР между собой.

Других причин не вижу. Так вот данные функции обязаны уметь синхронизировать, например, EURUSD на разных брокерах (с разными GMT-offset). Если этого не происходит, только тогда ошибка.

 
fxsaber:

Важно осознавать, для чего GMT-смещение нужно. Возможно, мое видение этой величины слишком узкое, однако, вижу полезность его только в одном - умение синхронизации различных ценовых ВР между собой.

Других причин не вижу. Так вот данные функции обязаны уметь синхронизировать, например, EURUSD на разных брокерах (с разными GMT-offset). Если этого не происходит, только тогда ошибка.

Или ценовой ВР с каким-нибудь новостным. Тогда финт не пройдет?

 
Andrey Khatimlianskii:

Или ценовой ВР с каким-нибудь новостным. Тогда финт не пройдет?

Сначала синхронизируются два форекс-символа на разных источниках. После чего становится понятно смещение одного относительно другого. На основе этих данных синхронизируются уже остальные символы 

этих источников.

Синхронизацию с календарем хорошо бы проверить. Взять зимой новость и летом. И посмотреть, совпадает или нет.

 
Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам".
 

Вычисление профитности.

// Вычисляет профитность на истории не пересекающихся закрытых позиций.
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);
}


Применение

#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));   
  }
       
}


Результат

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