文章 "交易机器人的原型" - 页 2

 

我建议避免这种设计

//------------------------------------------------------------------ CheckNewBar
bool CExpertAdvisor::CheckNewBar()          // 检查是否出现新栏的功能
  {
   MqlRates rt[2];
   if(CopyRates(m_smb,m_tf,0,2,rt)!=2)      // 复制条形图
     { Print("CopyRates of ",m_smb," failed, no history"); return(false); }
   if(rt[1].tick_volume>1) return(false);   // 检查音量 
   return(true);
  }

因为处理前一个刻度线可能需要足够的时间,以至于错过新条形图第一个刻度线的到来。

此外,还有可能错过开盘时间。

最好是绑定到条形图的开盘时间,但为此您需要保存零条形图的前一个时间,例如,将其与零条形图的当前时间进行比较。

如果相同,则没有新的条形图

如果不同,则至少要打开一个新的(下一个)条形图,然后我们将存储的零条形图时间初始化为当前的零条形图时间。

这种结构更为可靠。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 

在今后的文章中讨论这个问题:

  • *稳健*(服务器端)的每笔交易不同级别的止损和止盈订单;这些是*必须的,以避免与网络和客户端程序中断相关的问题(长时间的网络断开、网络滞后引起的滑点(和重新报价)、客户端程序或操作系统退出、重启、崩溃(客户端软件的长时间缺失)等);所谓的 "虚拟 "订单不适用,非 OCO 替代品也不适用(不,这**没得商量,如果对稳健性有要求,止损和止盈订单**必须是服务器端的,如果其中一个被击中,另一个**必须同时被服务器**移除)。
  • 在系统崩溃的情况下,*稳健*地恢复每笔交易的状态;换句话说,如果客户端/操作系统崩溃(并自动重启),我希望 EA 能清楚地知道在此期间未完成的单笔交易和订单发生了什么:已成交、已平仓、仍处于活动状态、哪些相关的 s/l 和 t/p 订单属于哪笔交易/订单等(不,将状态写入磁盘**并不**有效,因为在开仓交易和将状态写入磁盘之间存在竞赛条件,客户端程序可能会在不恰当的时间崩溃;服务器端订单注释**可能有效,如果它们**可以修改的话)。

据我所知,MT5 只支持 *1*(一个)服务器端 s/l 和 t/p 订单 *每个工具*(而不是每笔交易),不支持 OCO 订单(OCO 订单可用于模拟每笔交易的 s/l 和 t/p 订单,但也存在竞争条件)。除非上述问题得到解决,否则我不会投入超过 100 美元通过 MT5 进行交易(简单的单订单单时间框架单向 MA 十字型 EA)。我甚至不确定是否需要 100 美元。

 
olyakish:

我建议避免这种设计

因为处理前一个刻度线可能需要足够的时间,以至于错过新条形图第一个刻度线的到来。

此外,还有可能错过开盘时间。

最好是绑定到条形图的开盘时间,但为此您需要保存零条形图的前一个时间,例如,将其与零条形图的当前时间进行比较。

如果相同,则没有新的条形图

如果不同,则至少要打开一个新的(下一个)条形图,然后将存储的零条形图时间与当前的零条形图时间初始化。

这种设计更可靠。

我是这样做的:

bool CUniexp::checkNewBar(void)
{
   static datetime prevTime[1];
   datetime currentTime[0];
   CopyTime(_Symbol,_Period,0,1,currentTime);
   if (currentTime[0]==prevTime[0])
   {return (false);}
   else
   {
      prevTime[0] = currentTime[0];
      return (true);
   }
}
 
isNewBar
isNewBar
  • 投票: 7
  • 2010.05.07
  • Prival
  • www.mql5.com
Функция анализа появления нового бара на заданном таймфрейме.
 

编译但调试器失败。

加载 C:\Program Files\MetaTrader 5\MQL5\Experts\Examples\eMyEA.ex5 失败

 
Rosh:

新文章《贸易机器人原型》出版:

作者:Алексей СергеевАлексей Сергеев


感谢您的精彩文章!我是一名新手,但我有一个关于代码的问题。


在函数 void CExpertAdvisor::TrailingPosition(long dir,int TS) 中,有一行是这样的

sl=NormalSL(dir,apr,apr,TS,StopLvl); // 计算止损。


在调用 NormalSL 时,第二个和第三个参数是否都应使用 apr?我认为应该是

sl=NormalSL(dir,op,apr,TS,StopLvl);

因为第二个参数应该是 "指定 "方向(即变量 op)的买入价/卖出价,而不是 "反向 "方向(即变量 apr)的买入价/卖出价。


谢谢!

 
echostate:


在函数 void CExpertAdvisor::TrailingPosition(long dir,int TS) 中,有一行:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // 计算止损值


在调用 NormalSL 时,第二个和第三个参数是否都应使用 apr?我认为应该是

sl=NormalSL(dir,op,apr,TS,StopLvl);


,第二个和第三个参数必须是 apr。

因为 tral 的计算是根据平仓价格得出的。 买入的 Bid 和卖出的 Ask函数 是正确的。

因为第二个参数应该是 "指定 "方向(即变量 op)的买入价/卖出价,而不是 "反向 "方向(即变量 apr)的买入价/卖出价。

应从 "反向 "方向计算 在这种情况下,apr.
 
sergeev:


,第二个和第三个参数必须为 apr。

因为 tral 是根据平仓价格计算的。 买入的 Bid 和卖出的 Ask 函数是正确的。

应从 "反向 "方向计算 在这种情况下,apr.


感谢您的快速回复!我想我一定是弄错了。


我还想知道

double CExpertAdvisor::CountLotByRisk(int dist,double risk,double lot) // 按风险大小计算批量
  {
   if(dist==0 || risk==0) return(lot);
   m_smbinf.Refresh();
   return(NormalLot(AccountInfoDouble(ACCOUNT_BALANCE)*risk/(dist*10*m_smbinf.TickValue())));
  }

为什么在返回值中,"dist "和 "m_smbinf.TickValue() "之间有一个 "10"?我猜 "dist "是止损(以点为单位),而 "m_smbinf.TickValue() "是货币对 每手每点的美元价值。所以我不知道为什么要在它们之间再乘以 "10"。

谢谢!

 
万分感谢。
 

非常有用的文章。非常感谢!