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

 
阿列克谢-维克多罗夫

也许它能做到?尽管对于外汇来说,这并不总是正确的。

它显示错误的数值,例如SBRF-9.17交易时段 在周五的结束时间==23:45:00,根据分钟图,这个功能显示00:00:00,根据交易所的信息晚上交易时段结束时间为23:50。

我不认为主要的一点是可以在我们所在的地方创建检查,并使用常量,但也许有人已经实现了这个功能,我就不必再自己写火车了。
 
阿列克谢-维克多罗夫

没有依赖性,也不可能有依赖性。因此,不可能有什么特别的代码。

开发人员在这种情况下不使用LFO。算法是明确的--可重复的。

 
康斯坦丁

期货市场,如何确定前一天市场的收盘时间,以不同的变体寻找当前的时间区间。

1.我们在周六-周日的间隔时间,我们需要周五晚上交易时段 的收盘时间。
2.我们在周一至周五的封闭市场;我们需要周一至周四的晚间时段的收盘时间
3.周一至周五的交易区间;我们需要周五晚间交易 时段的关闭时间
4.在周二至周五的时间范围内,我们需要周一至周四晚间会议 的闭幕时间。

也许有人写了一个类似的功能,我不想重新发明轮子))

我不认为有比常数更多的灵活性。

/*!
   \brief   Расчет конечной даты запроса
*/
datetime CVolumeCluster::CalcStopDate(void) {
   MqlDateTime _date;
   datetime _time_t = TimeTradeServer(_date);

   if(_date.hour == 23 && _date.min >= 44) {          // определяем время окончания торговой сессии
      _date.hour = 23;
      _date.min  = 44;
      _date.sec  = 59;
      _time_t    = StructToTime(_date);
   } else {
      TimeToStruct(_time_t - 86400, _date);
      _date.hour = 23;
      _date.min  = 44;
      _date.sec  = 59;
      if(_date.day_of_week == 0 || _date.day_of_week == 6)
         _date.day_of_week = 5;
      _time_t = StructToTime(_date);
   }
//---
   return _time_t;
}
 

请教使用CCanvas类的人,如何使图形标记的 更新不那么耗费资源,例如,我们在图形标记中有几十万行,当调整大小时,我们必须重新绘制图形标记中的每一行,因为如果不重新绘制,仅仅通过调整大小,图表上的线条就无法显示,尽管图形标记的对象改变了其大小。

 
康斯坦丁

可能没有什么比常数更灵活的了。

这不是更容易吗?

/********************Script program start function*******************/
void OnStart()
{
 datetime timeArray[1], barArray[1];
 CopyTime(_Symbol, PERIOD_D1, 0, 1, timeArray);
 CopyTime(_Symbol, PERIOD_M1, timeArray[0]-1, 1, barArray);
 Print(barArray[0];
}/*******************************************************************/
 
阿列克谢-维克多罗夫

这不是更容易吗?

 CopyTime(_Symbol, PERIOD_D1, 0, 1, timeArray);              // время текущего дня 00:00:00
 CopyTime(_Symbol, PERIOD_M1, timeArray[0]-1, 1, barArray);  // время открытия - 1 секунду

结果基本上是正确的))谢谢

 
现在(1626)不工作了

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

mql5语言的特殊性、微妙性和技巧性

fxsaber, 2017.05.05 23:48

// Возвращает текущее количество объектов классов
int GetAmountObjects( void )
{
  const class CLASS_TMP {} Tmp;
  
  return((int)::StringFormat("%d", &Tmp) - 1);
}
应用实例
int OnInit()
{
  if (GetAmountObjects() > 0)
    Print("До " + __FUNCSIG__ + " были вызваны конструкторы!");

  return(INIT_SUCCEEDED);
}
 
// Советник возвращает полностью сформированные торговые запросы (включая ручные)
#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + 
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) + 
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

void OnTradeTransaction(   const MqlTradeTransaction&, const MqlTradeRequest& Request, const MqlTradeResult& )
{
  if (Request.action)
    Print(ToString(Request));
}

如果同样的Filling有问题,运行这个EA并手动创建你想要的订单(终端的F9)。生成的交易请求将由EA打印。

不幸的是,在真实账户上这样做是有问题的。开发商已经拒绝了这一建议

 
fxsaber:

如果同样的Filling有问题,运行这个EA并手动创建你想要的订单(终端的F9)。生成的交易请求将由EA打印。

唯一缺少的是一个关于如何工作的例子

 
拉希德-乌马罗夫

我们需要的是一个例子,说明它是如何工作的。

手动曝光


我们在日志中得到生成的交易请求

Request.action = TRADE_ACTION_PENDING (5)
Request.magic = 0
Request.order = 157092716
Request.symbol = EURUSD
Request.volume = 0.01
Request.price = 1.13941
Request.stoplimit = 0.0
Request.sl = 1.13926
Request.tp = 1.13955
Request.deviation = 0
Request.type = ORDER_TYPE_BUY_LIMIT (2)
Request.type_filling = ORDER_FILLING_RETURN (2)
Request.type_time = ORDER_TIME_SPECIFIED (2)
Request.expiration = 2017.07.11 12:08:00
Request.comment = 
Request.position = 0
Request.position_by = 0
不幸的是,对于真正的交易者来说,它是非常昂贵的。这就是为什么我提出了一个建议。