文章 "交易者生活窍门: 利用 defines (#define) 融合 ForEach"

 

新文章 交易者生活窍门: 利用 defines (#define) 融合 ForEach已发布:

对于那些仍然使用 MQL4 编程且不想切换到 MQL5 的人来说, 本文是一个过渡步骤。 我们继续寻找以 MQL4 风格编写代码的机会。 这一次, 我们将研究 #define 预处理器的宏替代。

创建智能交易系统几乎总是需要大量的循环工作。 循环随处环绕着我们: 搜索订单, 历史交易, 图表对象, 市场观察品种, 指标缓冲区中的柱线。 为了让程序员的生活更轻松一点, MetaEditor 以 代码片段 (snippets) 为特色, 意即当您输入第一个字符时, 按 Tab 键后它们会自动变成一小段代码。 这就是 'for' 循环片段的工作原理:


不错, 但它尚未覆盖我们的所有需求。 考虑最简单的例子: 假设我们需要搜索市场观察内的所有品种。

作者:Vladimir Karputov

 
存钱罐

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

库:CDouble 和 CDoubleVector

amrali, 2018.02.12 23:53

#define  forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)
所有东西都需要塞进 for 的内部,这样就可以重复调用 forEach。否则,重新定义变量会很无趣。
 
在 TimeCurrent 之前选择 HistorySelect 是一个典型的错误。由于语句对某人的意义可能取决于作者,这里有一组引文

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

FORTS。关于执行的问题

Renat Fatkhullin, 2015.02.10 08:16

我还没有运行代码,但源代码显示了 HistorySelect 中错误的结束日期这一典型错误。

每个第一个调用该函数的程序员都会使用错误的日期,不断点检历史结束时间,并检测 "进入历史的交易时间过长"。

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

FORTS。关于执行的问题

Renat Fatkhullin, 2015.02.10 09:15

错误在于人们没有考虑当前时刻是什么时候,而是用错误的日期替代错误的来源。

只要指定一个已知的遥远日期作为结束日期,而不是过时的 serverTime 就足够了。

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

FORTS。关于执行的问题

Renat Fatkhullin, 2015.02.10 13:56

开始和结束日期的设定都应考虑到误差的实现和强制保证金。也就是说,至少要减 N 秒和加 N 秒。

TimeTradeServer() 并不是一个 rltime 精确时间,而是完全根据进入市场概览的价格刻度进行更新。


如果历史样本中突然没有数据,99% 意味着错误出在查询边界上。

HistorySelect(0, LONG_MAX);
 

Предопределённые переменные _XXXX переводятся в функции MQL5 при помощи беспараметрической формы #define:

//--- _Digits 变量存储小数点后的位数、
#define _Digits         Digits()
为什么?此外,有了这样一个宏,就不能将 _Digits 用作某些函数的输入参数。也就是说,代码将无法运行。
 
//--- 当前符号的最新已知卖方价格(卖出价 
double GetAsk()
  {
   MqlTick tick;
   SymbolInfoTick(Symbol(),tick);
   return(tick.ask);
  }

太贵了!如果你真的想通过结构来做,你至少应该做过。而且由于某种原因没有进行检查。

SymbolInfoDouble 完全符合 MT4 标准。

 
#define IsTradeContextBusy  true

也许是假的?

也许是假的?
 
对于 MarketInfo,最好使用枚举 + 重载的方法

交易、自动交易系统和交易策略测试论坛。

智能交易系统:量子 103

fxsaber, 2017.09.26 09:55 pm.

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
 
为了完全兼容,只缺少 MQL4 的简化交易功能。
要做到这一点,您需要非常了解这两种架构。并非所有事情都是显而易见的。
 

fxsaber:
В копилку

#define  forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)

有趣而不显眼的技术 )

[删除]  

你能做多少扭曲的事情?

定义是用一种文字代替另一种文字的愚蠢行为。它们没有任何力量!

最好试着在模板上做同样的事情。

 
Koldun Zloy:

你能这样做多少次?

定义是用一种文字代替另一种文字的愚蠢行为。它们没有任何力量!

少写有时很方便

最好尝试在模板上做同样的事情。

这只是一个可行性、可用性和性能的问题。