文章 "交易机器人的原型" - 页 2 123 新评论 Alexey Klenov 2010.08.30 13:10 #11 我建议避免这种设计//------------------------------------------------------------------ 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: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций www.mql5.com Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5 Maximillion Propheet 2010.08.30 20:00 #12 在今后的文章中讨论这个问题:*稳健*(服务器端)的每笔交易不同级别的止损和止盈订单;这些是*必须的,以避免与网络和客户端程序中断相关的问题(长时间的网络断开、网络滞后引起的滑点(和重新报价)、客户端程序或操作系统退出、重启、崩溃(客户端软件的长时间缺失)等);所谓的 "虚拟 "订单不适用,非 OCO 替代品也不适用(不,这**没得商量,如果对稳健性有要求,止损和止盈订单**必须是服务器端的,如果其中一个被击中,另一个**必须同时被服务器**移除)。在系统崩溃的情况下,*稳健*地恢复每笔交易的状态;换句话说,如果客户端/操作系统崩溃(并自动重启),我希望 EA 能清楚地知道在此期间未完成的单笔交易和订单发生了什么:已成交、已平仓、仍处于活动状态、哪些相关的 s/l 和 t/p 订单属于哪笔交易/订单等(不,将状态写入磁盘**并不**有效,因为在开仓交易和将状态写入磁盘之间存在竞赛条件,客户端程序可能会在不恰当的时间崩溃;服务器端订单注释**可能有效,如果它们**可以修改的话)。据我所知,MT5 只支持 *1*(一个)服务器端 s/l 和 t/p 订单 *每个工具*(而不是每笔交易),不支持 OCO 订单(OCO 订单可用于模拟每笔交易的 s/l 和 t/p 订单,但也存在竞争条件)。除非上述问题得到解决,否则我不会投入超过 100 美元通过 MT5 进行交易(简单的单订单单时间框架单向 MA 十字型 EA)。我甚至不确定是否需要 100 美元。 Дмитрий Александрович 2010.09.04 12:05 #13 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); } } Prival 2010.09.04 12:21 #14 https://www.mql5.com/zh/code/107 isNewBar 投票: 72010.05.07Privalwww.mql5.com Функция анализа появления нового бара на заданном таймфрейме. ORIONIS 2010.09.06 23:54 #15 编译但调试器失败。 加载 C:\Program Files\MetaTrader 5\MQL5\Experts\Examples\eMyEA.ex5 失败 echostate 2010.09.16 00:38 #16 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)的买入价/卖出价。谢谢! --- 2010.09.16 11:01 #17 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. echostate 2010.09.17 03:22 #18 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"。谢谢! NFTrader 2011.04.10 16:18 #19 万分感谢。 Haitao Jiang 2011.04.10 17:41 #20 非常有用的文章。非常感谢! 123 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我建议避免这种设计
因为处理前一个刻度线可能需要足够的时间,以至于错过新条形图第一个刻度线的到来。
此外,还有可能错过开盘时间。
最好是绑定到条形图的开盘时间,但为此您需要保存零条形图的前一个时间,例如,将其与零条形图的当前时间进行比较。
如果相同,则没有新的条形图
如果不同,则至少要打开一个新的(下一个)条形图,然后我们将存储的零条形图时间初始化为当前的零条形图时间。
这种结构更为可靠。
在今后的文章中讨论这个问题:
据我所知,MT5 只支持 *1*(一个)服务器端 s/l 和 t/p 订单 *每个工具*(而不是每笔交易),不支持 OCO 订单(OCO 订单可用于模拟每笔交易的 s/l 和 t/p 订单,但也存在竞争条件)。除非上述问题得到解决,否则我不会投入超过 100 美元通过 MT5 进行交易(简单的单订单单时间框架单向 MA 十字型 EA)。我甚至不确定是否需要 100 美元。
我建议避免这种设计
因为处理前一个刻度线可能需要足够的时间,以至于错过新条形图第一个刻度线的到来。
此外,还有可能错过开盘时间。
最好是绑定到条形图的开盘时间,但为此您需要保存零条形图的前一个时间,例如,将其与零条形图的当前时间进行比较。
如果相同,则没有新的条形图
如果不同,则至少要打开一个新的(下一个)条形图,然后将存储的零条形图时间与当前的零条形图时间初始化。
这种设计更可靠。
我是这样做的:
编译但调试器失败。
加载 C:\Program Files\MetaTrader 5\MQL5\Experts\Examples\eMyEA.ex5 失败
新文章《贸易机器人原型》出版:
作者:Алексей СергеевАлексей Сергеев
感谢您的精彩文章!我是一名新手,但我有一个关于代码的问题。
在函数 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)的买入价/卖出价。
谢谢!
在函数 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。
因为 tral 是根据平仓价格计算的。 买入的 Bid 和卖出的 Ask 函数是正确的。
应从 "反向 "方向计算 。在这种情况下,apr.感谢您的快速回复!我想我一定是弄错了。
我还想知道
为什么在返回值中,"dist "和 "m_smbinf.TickValue() "之间有一个 "10"?我猜 "dist "是止损(以点为单位),而 "m_smbinf.TickValue() "是货币对 每手每点的美元价值。所以我不知道为什么要在它们之间再乘以 "10"。
谢谢!
非常有用的文章。非常感谢!