程序库: 交易品种 - 页 9

 
Stanislav Korotky:

一个有趣的问题出现了--在堆栈中没有观察到同样的问题--那么堆栈 中的价格 是否与图表中的不同?

一位用户向我抱怨基于 BookEvent 的诱导器和图表不同步。

堆栈应与市场观察相对应。因此,它可能与图表不同。

 
fxsaber:

因此,在 Tester 中,您无法在原始符号上重现终端中看到的内容。

以下是您在终端中看到的情况。

交易在 "空中 "进行。指标进入森林。只有勾选历史 的分界线。

 

我不知道出了什么问题,可能是新的 2515 版本做错了什么。

这是脚本:

#property copyright "IgorM"
#property link      "https://www.mql5.com/zh/users/igorm"
#property version   "1.00"
#property script_show_inputs

input int      History        = 1 e5;
input double   Weierstrass_A  = 0.33;
input double   Weierstrass_B  = 1.5;
input int      Weierstrass_N  = 10;
input double   Weierstrass_Koeff = 0.45;

#include <fxsaber\Symbol.mqh> // https://www.mql5.com/zh/code/18855
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
{
   const SYMBOL SymbDB("W" + _Symbol);
   datetime dt_end = TimeCurrent();
   if(!SymbDB.IsExist()) // 如果未创建符号,则退出
   {
      Alert("Error create Weierstrass func, symbol = ", "W" + _Symbol);
      return;
   }
   SymbDB.Off();
   SymbDB.CloneProperties(); // 复制属性
   if(CustomRatesDelete(SymbDB.Name, 0, dt_end) == -1)
   {
      Alert("Error CustomRatesDelete , GetLastError = ", GetLastError());
      return;
   }
// 找到用于归一化的系数
   int fw_MAX = INT_MIN, fw_MIN = INT_MAX;
   for(int i = 4 * History; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      if(wtmp > fw_MAX) fw_MAX = wtmp;
      if(wtmp < fw_MIN) fw_MIN = wtmp;
   }
   const int fw_knorm = fw_MAX - fw_MIN;

// 通过记录刻度线创建图表
   MqlTick ticks[];
   ArrayResize(ticks, History * 4);
   for(int i = 4 * History - 1; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      ticks[i].last = ticks[i].bid = ticks[i].ask = NormalizeDouble(1.0 + Weierstrass_Koeff * (2.0 * (wtmp - fw_MIN) / fw_knorm - 1), _Digits);
      ticks[i].bid -= _Point;
      ticks[i].time_msc = ticks[i].time = dt_end--;
      ticks[i].time_msc *= 1000;
      ticks[i].volume = 1;
      ticks[i].volume_real = 1.0;
      ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
   }
   CustomTicksAdd(SymbDB.Name, ticks);
   if(SymbDB.On()) // 包括在市场观察中
      ChartOpen(SymbDB.Name, PERIOD_M1); // 打开一个新的符号图表
}
//+------------------------------------------------------------------+
int FuncWeierstrass(const double Wa, const double Wb, const int WN, const int cnt)
{
   int result = 0;
   for(int i = 0; i <= WN; i++)
   {
      result += (int)(MathPow(Wb, i) * MathCos(MathPow(Wa, i) * M_PI * cnt));
   }
   return(result);
}
//+------------------------------------------------------------------+


一切正常,但只能运行一次。

重启时会出现黑屏 "等待更新",手动删除自定义符号 后即可解决


是程序库还是终端的新版本出了问题?

 
Igor Makanu:

是程序库还是新版终端无法正常工作?

我不知道。我不使用 TicksAdd。

 
fxsaber:

我不知道。我不用 TicksAdd。

我想我明白了,所以我在代码中将其替换为

CustomTicksAdd(SymbDB.Name, ticks);

CustomTicksReplace(SymbDB.Name,0,TimeCurrent()*1000,ticks);

重新启动脚本后,它现在似乎可以工作了,唯一的问题是市场概览窗口中没有 Ask/Bid 符号值,但这并不重要。



更新:

应仔细阅读帮助,一切正常,但CustomTicksAdd 在将符号添加到市场概览时才能正常工作,即应这样使用

if(SymbDB.On()) // 包括在市场观察中
   {
      CustomTicksAdd(SymbDB.Name, ticks);
      ChartOpen(SymbDB.Name, PERIOD_M1); // 打开一个新的符号图表
   }
 

我在 MT 中发现了一个令人不快的错误--由于某些原因,它没有设置SYMBOL_TRADE_TICK_SIZE。调试显示,正确的值被写入该属性(例如,欧元兑美元的值为 0.00001),但创建一个符号后,该值为 0。

有人解决过这个问题吗?这是 MT 的错误还是符号库的特殊性?

 
Stanislav Korotky:

我在 MT 中发现了一个令人不快的错误--由于某些原因,它没有设置SYMBOL_TRADE_TICK_SIZE。调试显示,正确的值被写入该属性(例如,欧元兑美元的值为 0.00001),但创建符号后,该值为 0。

有人解决过这个问题吗?这是 MT 的错误还是符号库的特殊性?

是只看到 "0",还是轮询属性后得到 "0"?

 
Stanislav Korotky:

我在 MT 中发现了一个令人不快的错误--由于某些原因,它没有设置SYMBOL_TRADE_TICK_SIZE。调试显示,正确的值被写入该属性(例如,欧元兑美元的值为 0.00001),但创建符号后,该值为 0。

有人解决过这个问题吗?这是 MT 的错误还是符号库的特殊性?

可能取决于设置字段的顺序。我是这样设置的

    this.SetProperty(SYMBOL_DIGITS, this.Ticks.GetDigits());

    this.SetProperty(SYMBOL_TRADE_CONTRACT_SIZE, 1 e5); // https://www.mql5.com/ru/forum/330333#comment_14608694
    this.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);

    this.SetProperty(SYMBOL_TRADE_TICK_SIZE, this.GetProperty(SYMBOL_POINT));
 
fxsaber:

这可能取决于实地任务分配的顺序。我是这样做的

我使用的是 CloneProperties 调用,其中有这么几行(在当前公开版本中):

...
    CLONE(SYMBOL_TRADE_CONTRACT_SIZE) &&
    CLONE(SYMBOL_TRADE_FACE_VALUE) &&
    CLONE(SYMBOL_TRADE_LIQUIDITY_RATE) &&
    CLONE(SYMBOL_TRADE_TICK_SIZE) &&
    CLONE(SYMBOL_TRADE_TICK_VALUE) &&
...

这里的顺序略有不同,但正确的值都转移到了合约和其他属性上,唯一的问题是刻度线大小。

 

在调用 CloneProperties 之后,我写了这些废话:

    Symb.CloneProperties(_Symbol);
    if(SymbolInfoDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE) == 0)
    {
      CustomSymbolSetDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE, SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
    }

正常情况下是这样应用的。但这是某种拐杖。