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

 
Vladimir Pastushak:

是否有可能区分手动创建的图形对象和由指标 或EA创建的 对象?

在函数中

OBJPROP_HIDDEN

从终端菜单 "图表"-"对象"-"对象列表 "中选择一个图形对象的名称。值为 "true "允许从列表中隐藏一个不必要的对象。默认情况下,对于显示日历事件、交易历史以及从MQL5程序中创建的 对象 会设置为true。要查看此类图形对象 并访问其属性,请点击 "对象列表 "窗口中的 "全部"。

bool

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
可能是众所周知的事情,但我自己没有意识到这个细微差别。

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

图书馆:专家

fxsaber, 2020.10.09 04:55

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Поставили задание в очередь чарта.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Заставляем двигаться очередь.
}

我强调了代码中的一个重要位置。没有它,在脚本结束之前,将不会有模式的应用。

 
关于EventChartCustom中的第一个输入参数

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

MT5和速度在行动

安东,2020.10.08 11:00

不同的意义和不同的执行机制。0 - 事件在 "自己 "图表的队列中。-1 - 事件在它自己的队列中。

 
Vladimir Pastushak:

在这一周结束时,我的脑子已经不好使了。

我有一张在MT5中对冲的未结头寸的票据,例如123456。

我想在平仓 后计算利润,但我不能这样做。

我是这样做的,但我只得到佣金...

我如何用票据获取平仓的利润?

尝试使用HistorySelectByPosition() 更好地选择交易。

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 

有必要在一个mqh中找出某些东西是否曾被另一个mqh调用。mqh不知道对方的存在。他们中的一个可能在,一个可能不在。

总而言之,这个问题是不寻常的(对我来说)。以一种相当拐杖式的方式解决了问题。

void f1()
{
  SetUserError(0);
}

void f2()
{
  if (_LastError == ERR_USER_ERROR_FIRST)
    Print("f1() была вызвана.");
  else
    Print("f1() не была вызвана");
}

void OnStart()
{
  f1();
  f2();
}

我认为这是很糟糕的做法,但它是有效的。

 
如果有人需要关闭警报窗口
// Закрытие Alert-окна
bool CloseAlert()
{  
  const long Chart = ChartOpen(_Symbol, _Period);  
  const bool Res = Chart && !ChartSaveTemplate(Chart, NULL);
                            
  if (Chart)
    ChartClose(Chart);
    
  return(Res);  
}
 
fxsaber:

有必要在一个mqh中找出某些东西是否曾被另一个mqh调用。mqh不知道对方的存在。他们中的一个可能在,一个可能不在。

总而言之,这个问题是不寻常的(对我来说)。以一种相当拐杖式的方式解决了问题。

我认为这是很糟糕的做法,但它是有效的。

使用_LastError有一个无法解决的问题,当连接第三方库时,存在用户错误代码碰撞的非零概率。作为一个替代方案,保持你自己的lastError。要么是一个全局变量,在所有的mqh中被includeguard包裹,要么是一个单一变量。
 

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

MT5和速度在行动

fxsaber, 2020.10.20 12:28

快速卸载机器的中级总数。

对于那些使用条形图和指标进行交易的人来说,价格数据的相关性是非常模糊的。

蜱虫和翻车者很难做到实时。

 
在MT5中Sleep(0) == Sleep(1)。因此,使用Sleep(0)时,不会像MT4那样出现巨大的CPU负荷。

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

mql5的特殊性,技巧和窍门

斯拉瓦, 2018.09.20 15:40

PS。MQL5中的Sleep()函数 不是重定向到win api函数::Sleep()。更确切地说,如果数值小于100,就是重定向。但在100以上,它是一个循环,里面有win api slip,所以它可以被IsStopped打断。

还有一个更微妙的问题。如果毫秒数<=0,我们就预加1。也就是说,我们从不调用::Sleep(0)。

它已经被遗忘了。仅对MT5而言是如此。在MT4中Sleep(0)可以暂停终端。

 
我有一个想法,把虚拟改为指针,这样我就不必在每次调用时检查额外的条件。
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


但我决定先比较一下性能,用一个简单的例子。

// Сравнение производительности функции с доп. условием и указателя на функцию.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

typedef double (*TFunc)( const int ); // Определяем нужный тип указателя на функцию.

double Prices[];

double GetPrices2( const int Pos )
{
  return(Prices[Pos]);
}

double GetPrices( const int Pos )
{
  return(Pos >= 0 ? GetPrices2(Pos) : 0); // Специально введено доп. условие, чтобы уменьшить производительность.
}

void OnStart()
{
  const int Size = ArrayResize(Prices, 1 e7);
  
  double Sum1 = 0;
  double Sum2 = 0;

  TFunc Func = GetPrices2;
    
  // Замер производительности через указатель функции.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum2 += Func(i);
      , 1)


  // Замер производительности через функцию с доп. условием.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum1 += GetPrices(i);
      , 1)  

  Print(Sum1);
  Print(Sum2);
}


其结果是。

2020.10.21 01:07:00.745 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 29 in OnStart: for(inti=0;i<Size;i++)Sum2+=Func(i);] = 33906 mcs.
2020.10.21 01:07:00.756 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 36 in OnStart: for(inti=0;i<Size;i++)Sum1+=GetPrices(i);] = 10923 mcs.


类型化的变体输了三倍。我拒绝在关键的地方使用它。例如,对于TC来说,同样的OrdersTotal在优化器的每一次勾选中都至少被调用一次。


在调试模式下,情况正好相反。因此,在MT4中使用typedef进行加速是有意义的。