程序库: 交易品种 - 页 8

 
Stanislav Korotky:

买入价和卖出价不应该互换吗?

为了使价差不为负数,确实需要。

 
fxsaber:
// 创建倒置符号的示例

在这个示例中,我打开了 一个自定义符号的图表,没有历史记录。条形图的绘制仅从当前刻度开始。

如何使用历史记录?

+

expression not boolean  Symbol.mqh      192     17
 
ilvic:

在这个示例中,我打开了 一个自定义符号的图表,没有历史记录。条形图仅从当前刻度开始绘制。

如何使其具有历史记录?

+

本主题中的示例为热衷于编程的用户直观展示了库的功能。

供用户使用的现成脚本不在主题中发布。

 

我正在尝试创建一个自定义符号,该符号 的历史记录将根据通常的 MA 进行实时更新。

iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);

瞬时并不重要,重要的是以分钟为单位。

尝试了以下代码

// 创建倒置符号的示例

#include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/zh/code/20225

CUSTOMSYMBOL CustomSymb(StringSubstr(_Symbol, 3, 3) + StringSubstr(_Symbol, 0, 3) + StringSubstr(_Symbol, 6)); // 创建一个符号

double ReversePrice( const double Price )
{
  return(Price ? NormalizeDouble(1 / Price, _Digits) : 0);
}

void ReverseTick( MqlTick &Tick )
{
  Tick.bid = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.ask = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.last = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
}

bool ReverseTicks( MqlTick &Ticks[] )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    ReverseTick(Ticks[i]);
    
  return(true);
}

bool GetTicks( MqlTick &Ticks[] )
{
  return(CopyTicks(_Symbol, Ticks) > 0);
}

void OnInit()
{
  MqlTick Ticks[];
  
  if (CustomSymb.IsCustom() && GetTicks(Ticks) && ReverseTicks(Ticks) &&
      (CustomSymb.AddTicks(Ticks) > 0) && (CustomSymb.DataToSymbol() > 0) && CustomSymb.On())
    ChartOpen(CustomSymb.Name, PERIOD_CURRENT); // 打开图表
}

void OnTick()
{  
  MqlTick Tick[1];
  
  if (CustomSymb.IsCustom() && SymbolInfoTick(_Symbol, Tick[0]) && ReverseTicks(Tick))
    CustomTicksAdd(CustomSymb.Name, Tick);
}

完全不起作用。

有专家能告诉我如何正确地从 MA 创建自定义符号吗?

 
erotin:

如何正确创建 MA 自定义角色?

#include <Symbol.mqh> //https://www.mql5.com/zh/code/18855

bool FillPrices( MqlTick &Tick )
{
  static const int handle = iMA(Symbol(), Period(), 1, 0, MODE_SMA, PRICE_CLOSE);
  double Array[1];
  
  const bool Res = (CopyBuffer(handle, 0, 0, 1, Array) > 0);

  if (Res)
  {
    Tick.bid = Array[0];
    Tick.ask = Array[0];
    Tick.last = Array[0];
  }
    
  return(Res);
}

void OnTick()
{
  static const SYMBOL Symb("CUSTOM_" + _Symbol, NULL, _Symbol); // 创建一个符号
  static const bool Init = Symb.IsExist() && Symb.IsCustom() && Symb.On() && ChartOpen(Symb.Name, PERIOD_M1);
    
  MqlTick Tick[1];
  
  if (Init && SymbolInfoTick(_Symbol, Tick[0]) && FillPrices(Tick[0]))
// Symb += Tick;
    CustomTicksAdd(Symb.Name, Tick);
}
 
fxsaber:

谢谢。

如何在此图表中再添加 1 年的 MA 读数历史?

 
erotin:

我怎样才能在这张图上再添加 1 年的 MA 阅读历史?

剩下的都不用我做了。

 
fxsaber:

ZY 我在 EURGBP 上进行了全面测量。时间收益是 ~2 倍。交易完全重合。真的是免费的!

通过点数快速检查了 Tester 的新模式。单次运行结果


所有符号货币均设置为账户货币。

final balance 107448.00 EUR
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.084. Test passed in 0:00:40.141 (including ticks preprocessing 0:00:04.524).


点数模式

final balance 107448.00 pips
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.093. Test passed in 0:00:38.827 (including ticks preprocessing 0:00:04.508).


持续时间在误差范围内。

 

如果我们在Swissquote-Server 上开立一个模拟账户并运行该脚本,我们将看到以下一行。

2020.03.26 08:53:12.567 5, 5

这意味着在历史交易中,买入价/卖出价与市场观察中的价格相差 5 个点(市场观察中的价格比历史交易中的价格要高)。

因此,在测试器中无法在原始符号上重现在终端中看到的情况。


唯一的解决办法是使用自定义符号,该符号基于历史跳动点的相应分界点。

 

一个有趣的问题出现了--堆栈是否也存在同样的问题,即堆栈 中的价格 与图表中的不同?

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