程序库: BestInterval - 页 23

 
fxsaber:

这是我目前做的唯一一件事

其余部分不需要批量更正。但有一些错误与其他(旧)相关。有必要更正。

已更新。在激活的 BestInterval 模式下,我建议使用该选项。

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

库:虚拟

fxsaber, 2019.12.11 12:15 pm.

很难说开发人员何时会解决初始符号价格正常化的问题,也很难说他们是否会这样做。这就是引入该模式的原因。
//https://www.mql5.com/ru/forum/321656/page34#comment_14192799
#define  TICKS_FORCE_NORMALIZE // 对输入的跳动价格进行强制正常化处理
 

非常出乎意料的行为。

如果以 Action=false 运行一次,它似乎会将传递结果保存到文件中,以便以后应用。但出乎意料的是,它还会保存所有参数,如总计、RF、DD 等。换句话说,如果在同一符号或其他符号的另一个时间间隔内以 Action=true 运行,它不仅会应用最佳交易时间,还会在日志中记录旧值。

 
traveller00:

如果在同一符号的另一个区间或另一个符号等上以 Action=true 运行,它不仅会应用最佳交易时间,还会在日志中记录旧值。

它不会显示真实运行的值,而是显示已应用的错误运行的数据。您可以更改符号、时间间隔等,但它显示的值不会改变。它们只与输入的时间相关。这样做是有目的的。

 
为了以防万一,我想指出的是,从架构的角度来看,它不能与 StopLoss 正常工作。理论上,在操作=false 时触发的 StopLoss 可能会落入 BestInterval 决定抛出的范围。因此,当操作=true 时,它会发生偏移,结果数字有时会与操作=false 时预测的数字大相径庭。
 
traveller00:
为了以防万一,我想指出的是,从架构的角度来看,它不能与 StopLoss 正常工作。理论上,在操作=false 时触发的 StopLoss 可能会落入 BestInterval 决定抛出的范围。因此,它会在操作=true 时发生偏移,结果数字有时会与操作=false 时预测的数字大相径庭。

看来你误解了什么。即使从理论上讲,也不应该有问题。

 
是的,问题似乎在于,Virtual 中包含的使用 BestInterval 的 Sync 忽略了 StopLoss 和 TakeProfit。问题不在于架构,而是我没有完全弄明白。
 
traveller00:
是的,问题似乎在于,Virtual 中包含的使用 BestInterval 的 Sync 忽略了 StopLoss 和 TakeProfit。问题不在于架构,而是我没有完全弄明白。

我正在通过限价器和止损器编写 TC,因此最好能提供一个重现该问题的原始示例。

 
当 BestInterval.mqh 中的 active=true 时,有voidOnTick( void ),其内部是SYNC::Positions<BEST_TIME>();,这将导致 Sync.mqh 中的 staticvoid Positions( const intHandle= 0, const bool Reverse = false )。mqh 中的staticvoid Positions( constint Handle = 0, constbool Reverse = false )。内部重新计算手数,如果手数在要求的区间内,则通过SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0);; 将手数从虚拟环境转移到真实环境。 有点奇怪的是,价格不是从仓位中获取,而是就地读取,不过没关系。正如你所看到的,StopLoss 和 TakeProfit 均为零。也许你使用的是BESTINTERVAL_LIMITSYNC_NETTING 选项,其中 TakeProfit 已被考虑在内。
 
traveller00:
当 BestInterval.mqh 中的 active=true 时,有voidOnTick( void ),其内部是SYNC::Positions<BEST_TIME>();,这将导致 Sync.mqh 中的 staticvoid Positions( const intHandle= 0, const bool Reverse = false )。mqh 中的staticvoid Positions( constint Handle = 0, constbool Reverse = false )。内部重新计算手数,如果手数在要求的区间内,则通过SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0);; 将手数从虚拟环境转移到真实环境。 有点奇怪的是,价格不是从仓位中获取,而是在现场读取,不过没关系。正如您所看到的,StopLoss 和 TakeProfit 均为零。也许您使用的是BESTINTERVAL_LIMITSYNC_NETTING 选项,其中 TakeProfit 已被考虑在内。

是的,我使用这种模式。真实模式更多是为了演示。我根本没想过要在通用解决方案上浪费时间,因为这样一切都白费了。

如果稍加修补,就可以将 BestInterval-true 用于封闭源代码的 EA(市场等)的单次交易。

不过,BestInterval 的主要功能还是在优化模式 下工作。True 是一个很好的功能,但不是必须的。

 
  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);
  }
小的外观修正,int => bool。或者,我建议用返回 AmountDeleteIntervals 代替。