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

 
Vasiliy Pushkaryov:
你是否有一张图片,说明它是什么样子的?不太清楚,我还没有使用OBJ_CHART

没有图片。但你可以用手来建造它。选择插入->对象->图形对象->图表,像这样插入OBJ_CHART后,在对象属性中选择 "将对象画成背景",禁用刻度。

 
fxsaber:

没有图片。但你可以用手来建造它。选择插入->对象->图形对象->图形,像这样插入OBJ_CHART后,在对象属性中选择 "将对象画成背景",禁用缩放。


谢谢,看起来很酷

 

在调试模式下,你不能知道一个函数或表达式返回的值。

比如说

void OnStart()
{
  double Angle = 1;
  double d = MathSin(Angle / 2) * MathSin(Angle * 2);
}

例如,分配的函数返回什么。


我使用(不仅是在调试模式下)这种方式

template <typename T>
T MyPrint( const T Value, const string Str )
{
  static const bool IsDebug = MQLInfoInteger(MQL_DEBUG);

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

    Print(Str + " = " + (string)Value);
  }
  
  return(Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)

void OnStart()
{
  double Angle = 1;
  double d = _P(MathSin(Angle / 2)) * _P(MathSin(Angle * 2));
}


结果

void OnStart(), Line = 21: MathSin(Angle/2) = 0.479425538604203
void OnStart(), Line = 21: MathSin(Angle*2) = 0.9092974268256817
 

交易请求检查结果的结构(MqlTradeCheckResult)。

领域描述

场地

描述

平衡

执行交易操作后的余额值

股权

股权的价值,这将是执行交易后的价值

边缘

所需的交易操作所需的保证金

无保证金

在执行所需的交易后,将剩下的股本数额

margin_level

在执行所需的交易操作后,将设置的保证金水平。

这些字段对应于贸易标签中的一行


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
 
fxsaber:

这些字段对应于贸易标签中的一行


同样的数值显示了当前的状态,但结构不是返回交易 执行计算值 吗?

 
阿尔乔姆-特里什金

同样的值显示了当前的状态,但结构不是返回交易 执行计算值 吗?

显示如果交易指令被执行,这一行中的计算值。

 

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

通用类库 - 错误、描述、问题、使用的特殊性和建议

Renat Fatkhullin, 2017.12.08 23:34

我们没有MqlDeal结构,因为交易记录格式是浮动的,并且定期扩展。没有这一点,就不可能扩展平台的功能。

因此,唯一的选择是通过Get函数访问它们。而对以前受影响的记录的其他字段的访问比第一次访问快很多倍,因为该记录被缓存 了。

在上面的测试中,交易号码每次都是新的,这就不断地抛出了之前选择的交易 的缓存。

 

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

MT5与MT4。填充数组的速度。

Renat Fatkhullin, 2017.12.12 12:19

1) 这个想法是错误的,本地数组的填充速度并不快(大致上,没有下降到微观层面)。

2) 数组需要通过正常的初始化函数快速填充

3) 为了最大限度地提高速度,最好将数组保持为一个向量(一维),这样你就有更多的机会来优化访问。因为多维性严格限制了你的强制性框架,并迫使编译器对多维指数进行额外的恒定计算。

4) 用于快速访问的数组应保持静态,这大大减少了对异常值的检查量。

 

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

在mql5中打开卖出头寸

fxsaber, 2017.12.12 21:56

// true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
  return(!(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) & (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)));
}

void OnTick()
{
  if (IsBadFilling(_Symbol))
  {
    Print("Change symbol " + _Symbol + " or server " + AccountInfoString(ACCOUNT_SERVER) + " for trade by market!");
    
    ExpertRemove();    
  }
}


结果

2017.12.05 00:00:00   Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

允许你快速找出市场在测试器中无法打开的原因。也许是测试人员的行为不当,让市场订单被这样禁止,而挂单却没有。


我建议,当SYMBOL_FILLING_MODE为零时,测试人员应该用(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK) 来代替这个值。即当经纪人未能指定适当的符号字段时,允许全额交易。

 
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
  return(!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & (0x7F ^ (TICK_FLAG_ASK | TICK_FLAG_BID))) != 0));
}

#define  DEFINE_FIELD(A)             \
  if (!Ticks[i].##A)                \
    Ticks[i].##A = Ticks[i - 1].##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
  const int Size = ArraySize(Ticks);
  
  for (int i = 1; i < Size; i++)
    if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0;
      Ticks[i].volume = 0;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
    }
}
我建议每次在CopyTicks(COPY_TICKS_INFO)之后做这样的事情,这样TS就不会意外地耗尽账户