mql5语言的特点、微妙之处以及技巧 - 页 56

 
安德烈-哈蒂姆连斯基

你衡量过性能吗?我很好奇它的速度会慢多少。特别是自定义指标。

没有测量,但应该不会比MT4慢。

测量
#define  AMOUNT 1 e7
void OnStart()
{  
  int handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);
  const ulong StartTime = GetMicrosecondCount();
  
  for (int i = 0; i < AMOUNT; i++)
    handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);

  Print((string)((GetMicrosecondCount() - StartTime) / AMOUNT) + " mcs per iMA");
  Print(handle);    
}


其结果是

0.3383469 mcs per iMA


三分之一微秒的时间来测试。这意味着,每1000万次的单次运行将减慢3秒。

 
fxsaber:

测量

奇怪的是,你没有将创建句柄+在循环中获取值与你的原始版本进行比较,这就是有趣的区别。

 
安德烈-哈蒂姆连斯基

奇怪的是,你没有将创建句柄+在循环中获取值与你的原始版本 进行比较,这就是有趣的区别。

因为这些数值取自同一个手柄。iMA总是以相同的参数返回相同的句柄。

 
fxsaber:
在MQL5中,可以很好地接受这样的写法

也就是说,在每一个刻度 上 "创建 "一个手柄。新的指标实体将不会被创建,时间将只浪费在iMA输入参数与那些已经在以前的ticks上运行的指标的比较上。也就是说,与MT4中的做法完全相同。

有趣的设计。

请检查在OnInit中创建句柄的速度,用这种方法。

 
维塔利-穆齐琴科

请检查用这种方法创建OnInit句柄的速度。

这是与你的选择相比。

 

如何替换标准的OrderCalcProfit() 和OrderCalcMargin(),使函数可以跨平台?它似乎已经在这里的某个地方,但我在这里找不到它--也许我很困......。但我一定是在搜索的一个小时内就醒了 :)

 
阿尔乔姆-特里什金

如何替换标准的OrderCalcProfit()和OrderCalcMargin()函数,使其跨平台?它似乎已经被张贴在某个地方,但我在这里找不到它--也许我是醒着的......。但我一定是在一个小时的搜索过程中醒过来了 :)

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

MQL5.Community
MQL5.Community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
fxsaber:

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

:)

SymbolInfoMarginRate()在4中没有出现。该问题提出如下。

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

mql5语言的特殊性,技巧和窍门

Artyom Trishkin, 2017.10.06 06:36

什么可以取代标准的OrderCalcProfit()和OrderCalcMargin(),使函数可以跨平台?似乎已经有了,但我在这里找不到--可能是我太困了......。但我应该在一个小时的搜索过程中醒过来的:)

也没有关于OrderCalcProfit()的内容。
 

一个礼物,而不是一个语言机会

struct MQLTICK : public MqlTick
{
  bool operator >( const MqlTick &Tick )
  {
    return(this.bid > Tick.bid);
  }

  bool operator <( const MqlTick &Tick )
  {
    return(this.ask < Tick.ask);
  }
};

void OnStart()
{  
  MQLTICK Ticks[];
  
  Print(CopyTicks(_Symbol, Ticks));
  
  Print(Ticks[0] < Ticks[1]);
}
 
fxsaber:

一个礼物,而不是一个语言机会

以难以捉摸的运行时错误形式出现的礼物

struct MqlTick1 : MqlTick {        };
struct MqlTick2 : MqlTick { int i; };
void Copyticks( MqlTick& []) {}
void OnStart()
{
        MqlTick1 ticks1[];
        MqlTick2 ticks2[];
        int i1 = ::CopyTicks( _Symbol, ticks1 ); //нормально ??????????????
                   Copyticks(          ticks1 ); //error: 'ticks1' - parameter conversion not allowed
        int i2 = ::CopyTicks( _Symbol, ticks2 ); //нормально ??????????????
        Print( "i2=", i2, ":", GetLastError()); //Результат: -1:4006
}

::CopyTicks比Copyticks好在哪里?

而为什么结果总是-1。这些错误(4006)应该在编译时报告