程序库: 交易品种 - 页 6

 
class CURRENCY_CHECK
{
public:
  CURRENCY_CHECK( void )
  {
    const string CurrencyProfit = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
    const string AccountCurrency = ::AccountInfoString(ACCOUNT_CURRENCY);
    const bool Res = !::MQLInfoInteger(MQL_TESTER) || (CurrencyProfit == AccountCurrency);
    
    if (!Res && !::MQLInfoInteger(MQL_OPTIMIZATION))
    {
      ::Print(CurrencyProfit + " = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = " + AccountCurrency);
      
      ::TesterStop();
    }
  }
};

CURRENCY_CHECK CurrencyCheck; // 不允许测试慢速变体

2018.07.01 00:00:00   TER = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = USD
TesterStop() called on 0% of testing interval
 
// 脚本为所有利润不为零的仓位设置佣金。
#property script_show_inputs

input double inCommission = 0.004; // 每轮佣金百分比(每边 0.004 - 20 个单位/百万分之一)
input bool inAdd = false;          // true - 添加到当前值,false - 设置值

#include <Symbol.mqh>

string CommissionToString( const double TickValue )
{
  const double Commission = 1 - TickValue;
  
  return("Commission = " + DoubleToString(Commission * 100, 5) + "% per round (" + DoubleToString(Commission * 1000000 / 2, 1) + " per million (one side))");
}

void OnStart()
{
  const SYMBOL Symb;
  
  if (Symb.IsCustom())
  {
    const double TickValue = Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE);
    const double NewTickValue = inAdd ? TickValue * (1 - inCommission / 100) : 1 - inCommission / 100;
    
    if ((MessageBox(Symb.Name + "\nBefore: " + CommissionToString(TickValue) +
                   "\nAfter: " + CommissionToString(NewTickValue) + "\n\n Do you agree?", "Commission Change", MB_YESNO) == IDYES) &&
        Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, NewTickValue))
      MessageBox(Symb.Name + ": current " + CommissionToString(Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE)));
  }
}


不行

 

如果不太麻烦的话,我想知道如何正确使用符号库来生成自定义符号的示例 - 假设是 1/EURUSD = USDEUR。

我想知道如何正确复制可用的刻度线历史记录,以及如何在新图表上生成每个刻度线,以便在 "市场观察 "窗口中一切正常,即美元兑欧元图表尽可能接近常规图表,既可用于在线工作,也可在测试器中进行测试。

谢谢

 
Igor Makanu:

如果不麻烦的话,我想知道如何正确使用符号库生成自定义符号的示例 - 假设是 1/EURUSD = USDEUR

我想知道如何正确复制可用的刻度线历史记录,以及如何在新图表上生成每个刻度线,以便在 "市场观察 "窗口中一切正常,即美元兑欧元图表尽可能接近在线工作和在测试器中测试的常用图表。

谢谢

// 创建倒置符号的示例

#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 = ReversePrice(Tick.bid);
  Tick.ask = ReversePrice(Tick.ask);
  Tick.last = ReversePrice(Tick.last);
}

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);
}
 
fxsaber:

谢谢!

我今晚会研究一下,我有一个不同的问题,但我需要一个简单的例子来了解你的库能做什么。

----------------------------------


运行示例 // 创建反转符号的示例

一切都很清楚,只需几行代码,你就可以通过编程获得一个真实的自定义字符,真是太棒了!

SUS:在第 1158 版中,编译时出现了警告:

expression not boolean Symbol.mqh 192 17

在 Symbol.mqh 文件中的方法 bool IsCustom( void ) const
 
Igor Makanu:

SZY:在第 1158 版中,编译时出现警告:

expression not boolean Symbol.mqh 192 17

在 Symbol.mqh 文件中的方法 bool IsCustom( void ) const

我忘记更新了,我在 KB 中已经有了很多自己的代码,我的 MQL 文件夹中的野生代码该怎么说呢...

已更新。

 
fxsaber:

已更新。

已更新:

0 个错误,0 个警告,编译时间:1220 毫秒

一切正常,谢谢!
 

你好

是否可以将期货按列表复制到一个时间信息偏移的自定义符号中?由于需要期货的低流动性尾部,时间信息必须转移,这可能会影响过渡到新期货期间的指标计算

我只想把期货一个接一个地粘起来,因为事实上--它们的整个历史,而在 Expert Advisor 中,只需在未进行交易的时期的日期上做标记即可。
 
Aleksey Vyazmikin:

你好

是否可以将期货按列表复制到一个时间信息偏移的自定义符号中?由于需要期货的低流动性尾部,时间信息必须转移,这可能会影响过渡到新期货期间的指标计算

我只是想把期货一个接一个地粘起来,因为事实上--它们的整个历史,在 "专家顾问 "中只需在没有进行交易的时期的日期上做标记。

如果有源数据和粘合算法,当然就有这种可能性。您只需编写新符号的刻度存档。使用该历史记录形成自定义符号的方法与本分支示例中的方法相同。


唯一的问题是,您需要决定形成条形图的价格,以及在什么价格下执行市场订单。我会排除最后价格,但每个人都可以自行决定他需要什么。

 
fxsaber:

如果有源数据和胶合算法,当然就有这种可能性。您只需编写新符号的刻度存档。使用此历史记录形成自定义符号的方法与本分支示例中的方法相同。


唯一的问题是,您需要决定形成条形图的价格,以及在什么价格下执行市场订单。我会排除最后价格,但每个人都可以自行决定他需要什么。

当然,初始数据在终端中 - 往年的期货。形成刻度存档意味着什么?一般来说,我想在 M1 上测试 OHLC,可以说没有额外的刻度。

为什么不喜欢最后价格?我不明白为什么又是柱形图的形成价格--分钟柱形图按原价就可以了。一般来说,我需要的是与单独期货上相同的东西,而且在任何设置下都不会与真实价格重合,所以很清楚 - 根据我的观察,如果在所有刻度上进行测试,平均需要在负数上加 5 点。

您能帮我写一个这样的脚本吗?