自定义符号。误差、错误、问题、建议。

 
由于这个话题相当广泛,我认为对它进行单独讨论是个好主意。
 

Bug 01.

自定义字符表已经打开。例如,如果你手动删除所有条形和刻度线历史,图表窗口就会挂起--不刷新。

预期的行为与空的自定义符号一样。

 

Bug 02.

你需要删除最后一周的自定义符号 引号。你可以删除它,但即使是ChartRedraw也不会带来任何视觉效果。

只有当你用鼠标滚动图表时,它才会恢复正常。你能通过ChartRedraw来解决可视化的问题吗?


ZZY 暂时做了类似的透支工作

    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
    Sleep(1000);
    ChartRedraw();
    
    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
 

Bug 03.

TicksAdd具有以下保护功能。如果一个刻度线比市场观察中的刻度线早,它就会被忽略。


不幸的是,这种机制并不与TicksDelete和TicksReplace互动。

你需要删除自定义符号历史上的最后一天,并将删除后的最后一次勾选放入市场观察。

如果删除是可以的,那么由于我上面描述的规则,暴露最后一个勾就不会起作用。


我建议要么改变TicksAdd规则,要么TicksDelete/TicksReplace将Market Watch中的tick替换为历史上的最后一个tick,如果其时间小于当前时间。


回放问题

template <typename T>
T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); }
#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)                    // Макрос для удобного и наглядного вывода значений

void OnStart()
{
  const string Name = "TEMP1235";                                                                   // Имя кастомного символа
  const string SymbOrig = "EURUSD";                                                                 // Имя оригинального символа

  MqlTick Ticks[];
  const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год.
    
  if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true)))   // Создали символ на основе EURUSD.
  {            
    _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));                                               // Поместили в него историю EURUSD.
    
    MqlTick AddTicks[1];                                                                            
    AddTicks[0] = Ticks[Size - 1];                                                                  // Последний тик в истории.
    
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Последний тик добавили в Обзор рынка и еще раз в историю
    
    _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX));                              // Удалили все тики, оставив только данные за январь 2019.
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Взяли последний тик из оставшейся истории.
    
    ArrayPrint(AddTicks);                                                                           // Посмотрели, что это, действительно, последний тик января.
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Попробовали записать его в Обзор рынка - не получилось.
    
    _P(SymbolSelect(Name, false));                                                                  // Удалили символ из Обзора рынка.
    _P(CustomSymbolDelete(Name));                                                                   // Удалили символ.
  }
}


结果

void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638
void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true
void OnStart(), Line = 13: SymbolSelect(Name,true) = true
void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638
void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1
void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087
void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000        0 1548979198644       2       0.00000
void OnStart(), Line = 26: CustomTicksAdd(Name,AddTicks) = -1
void OnStart(), Line = 28: SymbolSelect(Name,false) = true
void OnStart(), Line = 29: CustomSymbolDelete(Name) = true


我理解,如果没有源代码,错误信息 将停留在文字上。描述起来多么无聊,但这可能是展示、发现和修复错误的最有效方法。

 

昨天刚开始整理合成物,测试器里有一些胡言乱语。带配方的合成物在测试器中是否有效?

创造了一个合成的、来自帮助的公式。这样说对吗?

1

这就是测试的结果。

2

这是无稽之谈--所有的交易都是盈利的,根据图像不可能是均匀的;所有的交易都在测试结束后被关闭,利润为零。我一定是做错了什么。我还应该检查什么?我在此附上日志。

附加的文件:
20190224.log  9322 kb
 
Alexey Volchanskiy:

我一定是做错了什么。我还应该看什么?

在截图中你可以看到,符号的盈利货币 与账户货币不一样。因此,转换后的结果是零。

为了使其 "开箱即用",将其命名为 "EURUSD_ALEX1"。

 
你能告诉我自定义符号及其设置存储在哪个文件夹里吗?我在终端和软件中都找不到它。
 
pivomoe:
你能告诉我自定义符号及其设置存储在哪些文件夹里吗?在终端和软件中删除并没有帮助。

\MetaTrader5\Bases\Custom\

 

Bug 04.

特定回放的另一个错误

template <typename T>
T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); }
#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)                    // Макрос для удобного и наглядного вывода значений

void OnStart()
{
  const string Name = "TEMP8";                                                                      // Для каждого запуска нужно менять имя символа, чтобы увидеть проблему
  const string SymbOrig = "EURUSD";                                                                 // Имя оригинального символа

  MqlTick Ticks[];
  const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год.
    
  if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true)))   // Создали символ на основе EURUSD.
  {            
    _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));                                               // Поместили в него историю EURUSD.
    
    MqlTick AddTicks[1];                                                                            
    AddTicks[0] = Ticks[Size - 1];                                                                  // Последний тик в истории.
    
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Последний тик добавили в Обзор рынка и еще раз в историю
    
    _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX));                              // Удалили все тики, оставив только данные за январь 2019.
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Взяли последний тик из оставшейся истории.    
    ArrayPrint(AddTicks);                                                                           // Посмотрели, что это, действительно, последний тик января.

    const int NewSize = _P(CopyTicksRange(Name, Ticks));                                            // Запросили всю историю тиков кастомного символа
    
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Снова Взяли последний тик из истории.    
    ArrayPrint(AddTicks);                                                                           // Увидели, что последний тик изменился!
    
    _P(SymbolSelect(Name, false));                                                                  // Удалили символ из Обзора рынка.
    _P(CustomSymbolDelete(Name));                                                                   // Удалили символ.    
  }
} 


结果

void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638
void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true
void OnStart(), Line = 13: SymbolSelect(Name,true) = true
void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638
void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1
void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087
void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000        0 1548979198644       2       0.00000
void OnStart(), Line = 26: CopyTicksRange(Name,Ticks) = 2157552
void OnStart(), Line = 28: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.02.22 23:57:59 1.13303 1.13316 0.0000        0 1550879879799       6       0.00000
void OnStart(), Line = 31: SymbolSelect(Name,false) = true
void OnStart(), Line = 32: CustomSymbolDelete(Name) = true


CopyTicksRange中包含的错误--改变了tick的历史!请注意,为了重现它,你必须一直在脚本中改变自定义符号的名称。而且,尽管脚本成功地删除了它。事实证明,删除一个符号根本就不是删除。

 
fxsaber:

在截图中你可以看到,符号的盈利货币 与账户货币不一样。因此,转换后的结果是零。

为了使其 "开箱即用",将其命名为 "EURUSD_ALEX1"。

谢谢你,这就是问题所在。我把它命名为我的账户中的名字,它就成功了。另一个问题。在实际交易中会发生什么? 合成订单是否转化为真实货币对的订单和头寸,在这种情况下(见一个公式)欧元兑美元和美元兑加元?

我在哪里可以看到它,测试者的日志只显示合成的。

й

 
真实的自定义符号 只供参考,不用于交易。他们只能在测试器中进行交易。