mql4语言的特点、微妙之处以及技巧 - 页 20

 
fxsaber:

它不会。TimeCurrent算法受到了非常间接的影响。你可以把酒吧的时间等。

你只需要以任何方式计算上周日的日期(在酒吧历史中)--这样就会有周日之前和周日之后的酒吧。你可以使用TimeLocal来做这个。

如果报价日期接近00:00(不间断会议),结果将总是GMT+3,或GMT+3+N--其中N是会议结束到午夜或从午夜到开幕的小时数。这与报价的时区 有什么关系?

 
Ivan Titov:

如果00:00附近有引号,结果将总是GMT+3(24小时会议),或GMT+3+N - 其中N是会议结束到午夜或从午夜到开放的小时数。这与报价的时区有什么关系?

我完全不记得这个话题了,所以我无法回答这个问题。如果有任何不一致的地方,你最好先证明一下。

 
fxsaber:

完全不记得这个话题了,所以我无法回答这个问题。如果有任何不一致的地方,你最好先证明一下。

这里从BCS终端(符号ED-9.19)上的这段 代码来看,当TimeCurrent()为2019.08.12 11:48:55时,TimeServerGMT() 函数返回时间2019.08.11 22:48:55。

 
Ivan Titov:

从BCS终端(符号ED-9.19)上的这段 代码来看,当TimeCurrent()为2019.08.12 11:48:55时,函数TimeServerGMT()返回时间2019.08.11 22:48:55

关于交易、自动交易系统和交易策略测试的论坛

mql4语言的特点、微妙之处以及技巧

fxsaber, 2018.03.29 14:32

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

没有注意到代码中的这个注释。

 
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(欧洲东部时间)。

 
Ivan Titov:

你是说,如果非外汇交易角色有历史记录可用,就不能工作?

我不记得了。但这可能是出于某种原因而写的。


重要的是,要意识到格林威治标准时间的偏移是为了什么。也许我对这一价值的看法过于狭隘,但我认为它的用处只有一个--使不同的价格BP相互同步的能力。

我没有看到任何其他原因。因此,这些功能必须能够同步,例如在不同的经纪商(有不同的GMT-offset)的EURUSD。 如果没有发生这种情况,才有可能出现错误。

 
fxsaber:

重要的是要意识到GMT的偏移是为了什么。也许我对这一价值的看法过于狭隘,但我认为它只对一件事有用--使各种价格BP相互同步的能力。

我没有看到任何其他原因。因此,这些功能必须能够同步,例如在不同的经纪商(有不同的GMT-offset)的EURUSD。如果没有发生这种情况,才有可能出现错误。

或者是一个价格BP与一些新闻BP。那么这一招就不起作用了?

 
Andrey Khatimlianskii:

或者是有某种新闻的价格BP一。那么这一招会不会失败呢?

首先,不同来源上的两个外汇符号是同步的。之后,一个人相对于另一个人的偏向就会变得很清楚。根据这些数据,其余的符号

这些来源的。

检查一下与日历的同步性会很好。冬天和夏天都要看新闻。并看看它是否重合。

 
 

盈利能力的计算。

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