组织订单周期 - 页 12 1...56789101112131415 新评论 elmucon 2017.10.06 14:10 #111 Artyom Trishkin:- 你需要一个煎锅来做什么?- 例如,煎鸡蛋。- 这不是炒蛋的问题,而是煎锅的问题......哦--有趣--两名前锋发生冲突......继续下去,越来越无聊了...... Alexey Viktorov 2017.10.06 15:39 #112 Artyom Trishkin:- 你需要一个煎锅来做什么?- 比如说煎鸡蛋。- 所以我们不是在谈论炒蛋,而是在谈论煎锅......你看到了吗?已经认为你和我被锁定在一个濒临死亡的体验中。我有点懒得继续这个讨论了。我不明白为什么每隔一毫秒 你都要去看一下订单。除非你想用它们来煎蛋......。 Artyom Trishkin 2017.10.06 16:23 #113 Alexey Viktorov:你看到了吗?已经认为你和我被锁定在一个濒临死亡的体验中。我对这个讨论有点懒了。我不明白为什么我们必须每隔一毫秒就 去看一下订单。除非你想用它们来煎鸡蛋......。 是的......在脚后跟处找到了它......:)我不是说每一次。但往往能及时发现环境的变化。 elmucon 2017.10.06 23:43 #114 我不喜欢这样玩............ 枯萎......失望的是......。 fxsaber 2017.10.18 12:29 #115 关于交易、自动交易系统和测试交易策略的论坛 组织一个订单循环 fxsaber, 2017.10.06 02:00 bool IsChange( const bool InitFlag = false ) { static int PrevTotal = 0; static int PrevHistoryTotal = 0; const int Total = OrdersTotal(); const int HistoryTotal = OrdersHistoryTotal(); if (InitFlag) { PrevTotal = Total; PrevHistoryTotal = HistoryTotal; } return(!InitFlag && ((Total != PrevTotal) || (HistoryTotal != PrevHistoryTotal))); }不参考历史的版本。struct HISTORY_UNIT { long Ticket; int Type; double Lots; HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots()) { } bool operator !=( const HISTORY_UNIT &Unit ) const { return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots)); } bool IsChange( void ) { const HISTORY_UNIT Tmp; const bool Res = (this != Tmp); if (Res) this = Tmp; return(Res); } }; // Возвращает true только в случае, если с последнего вызова произошли торговые изменения bool IsChange( void ) { static HISTORY_UNIT History[]; const int Total = OrdersTotal(); bool Res = (ArraySize(History) != Total); for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++) if (OrderSelect(i, SELECT_BY_POS)) { if (Res || (Res = History[j].IsChange())) ArrayResize(History, j + 1, Total); j++; } return(Res); }这个版本对VPS上的MT5特别有意义,因为MT5在历史上的工作非常缓慢,而且计算成本很高。 Sergey Chalyshev 2017.10.18 14:26 #116 fxsaber:没有历史参考的版本。这个版本特别适用于VPS上的MT5,因为MT5非常慢,计算量很大。在这种情况下,最好使用常规的OnTrade()。寰球贸易这个函数在交易事件 发生时被调用,在改变已下订单和未结头寸列表、订单历史和交易历史 时发生。当任何交易行为(挂单开仓、开仓/平仓、止损设置、挂单触发等),订单和交易的历史和/或头寸和当前订单的列表都会相应改变。 fxsaber 2017.10.18 14:41 #117 Sergey Chalyshev: 在这种情况下,最好使用常规的OnTrade()。不幸的是,你不能这样做。这就是该支部的工作内容。 fxsaber 2018.02.15 22:31 #118 很少有人会反驳这种说法 关于交易、自动交易系统和交易策略测试的论坛 虫子、虫子、问题 fxsaber, 2018.01.23 09:39 在OrderSend失败和OrderSend成功后,必须再次完全读取当前的交易环境。这一规则应始终适用。这是一个普遍的经验法则。但很少有人想到它在MT5中的实施。这就是为什么我写了一个最简单的TS模板(在kodobase中,几乎所有的TS都是这样的)。 // Шаблон большинства ТС #include <Trade/Trade.mqh> // Сигнал на покупку bool BuySignal( const string Symb ) { return(true); } // Сигнал на продажу bool SellSignal( const string Symb ) { return(false); } // Находит позицию соответствующего типа bool PositionsScan( const string Symb, const ENUM_POSITION_TYPE Type ) { for (int i = PositionsTotal() - 1; i >= 0; i--) if ((PositionGetSymbol(i) == Symb) && (PositionGetInteger(POSITION_TYPE) == Type)) return(true); return(false); } // Торговое действие на сигнал bool Action( const string Symb, const ENUM_POSITION_TYPE Type, const double Lots = 1 ) { static CTrade Trade; bool Res = true; // Закрыли противоположные сигналу позиции while ((PositionsScan(Symb, (ENUM_POSITION_TYPE)(1 - Type))) && (Res = Trade.PositionClose(PositionGetInteger(POSITION_TICKET)))); // Открыли позицию по сигналу return(Res && !PositionsScan(Symb, Type) && (Type ? Trade.Sell(Lots, Symb) : Trade.Buy(Lots, Symb))); } // Шаблон торговой стратегии void Strategy( const string Symb ) { if (BuySignal(Symb)) Action(Symb, POSITION_TYPE_BUY); else if (SellSignal(Symb)) Action(Symb, POSITION_TYPE_SELL); } void OnTick() { Strategy(_Symbol); } 由于某些原因,有些人为了同样的TS写了更多的代码。但事实上,这段代码做得同样好。大多数TC只需要写BuySignal和SellSignal。不需要其他任何东西。 该模板的例子是专门用SB写的。因此,向MT5专家提问,该代码是否正确? Artyom Trishkin 2018.02.15 22:39 #119 fxsaber: 几乎没有人会反驳这种说法这是一个普遍的规则。但没有多少人想到它在MT5中的实施。这就是为什么我写了一个最简单的TS模板(在kodobase中,几乎所有的TS都是这样的)。由于某些原因,有些人为了同样的TS写了更多的代码。但事实上,这段代码做得同样好。大多数TC只需要写BuySignal和SellSignal。不需要其他任何东西。这个例子的模板是专门用SB写的。因此,向MT5专家提问,该代码是否正确?关于这个说法。 在OrderSend失败 和OrderSend成功后,必须再次完全读取当前的交易环境。这一规则必须始终适用。 为什么我们要在失败后拉动一切?我们为什么要检查订单 和仓位历史?目前的订单和仓位也是如此?更新当下的价格和必要的数据是不够的? fxsaber 2018.02.15 22:45 #120 Artyom Trishkin:为什么在一个不好的情况下要撤掉所有的东西?为什么要为订单 和职位的历史 而烦恼?目前的订单和仓位也是如此?更新价格和我们目前需要的数据还不够吗?如果你从字面上理解,那么你可以从市场观察中阅读每个符号过去的tick历史。但我认为你实际上明白这句话的意思。 这段代码算是实现了这一说法。这就是为什么我有一个问题要问每个了解MT5的人:代码是否正确? 1...56789101112131415 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
- 你需要一个煎锅来做什么?
- 例如,煎鸡蛋。
- 这不是炒蛋的问题,而是煎锅的问题......
哦--有趣--两名前锋发生冲突......继续下去,越来越无聊了......
- 你需要一个煎锅来做什么?
- 比如说煎鸡蛋。
- 所以我们不是在谈论炒蛋,而是在谈论煎锅......
你看到了吗?已经认为你和我被锁定在一个濒临死亡的体验中。
我有点懒得继续这个讨论了。我不明白为什么每隔一毫秒 你都要去看一下订单。除非你想用它们来煎蛋......。
你看到了吗?已经认为你和我被锁定在一个濒临死亡的体验中。
我对这个讨论有点懒了。我不明白为什么我们必须每隔一毫秒就 去看一下订单。除非你想用它们来煎鸡蛋......。
关于交易、自动交易系统和测试交易策略的论坛
组织一个订单循环
fxsaber, 2017.10.06 02:00
不参考历史的版本。
这个版本对VPS上的MT5特别有意义,因为MT5在历史上的工作非常缓慢,而且计算成本很高。
没有历史参考的版本。
这个版本特别适用于VPS上的MT5,因为MT5非常慢,计算量很大。
在这种情况下,最好使用常规的OnTrade()。
寰球贸易
这个函数在交易事件 发生时被调用,在改变已下订单和未结头寸列表、订单历史和交易历史 时发生。当任何交易行为(挂单开仓、开仓/平仓、止损设置、挂单触发等),订单和交易的历史和/或头寸和当前订单的列表都会相应改变。
在这种情况下,最好使用常规的OnTrade()。
不幸的是,你不能这样做。这就是该支部的工作内容。
关于交易、自动交易系统和交易策略测试的论坛
虫子、虫子、问题
fxsaber, 2018.01.23 09:39
在OrderSend失败和OrderSend成功后,必须再次完全读取当前的交易环境。这一规则应始终适用。
这是一个普遍的经验法则。但很少有人想到它在MT5中的实施。这就是为什么我写了一个最简单的TS模板(在kodobase中,几乎所有的TS都是这样的)。
由于某些原因,有些人为了同样的TS写了更多的代码。但事实上,这段代码做得同样好。大多数TC只需要写BuySignal和SellSignal。不需要其他任何东西。
该模板的例子是专门用SB写的。因此,向MT5专家提问,该代码是否正确?
几乎没有人会反驳这种说法
这是一个普遍的规则。但没有多少人想到它在MT5中的实施。这就是为什么我写了一个最简单的TS模板(在kodobase中,几乎所有的TS都是这样的)。
由于某些原因,有些人为了同样的TS写了更多的代码。但事实上,这段代码做得同样好。大多数TC只需要写BuySignal和SellSignal。不需要其他任何东西。
这个例子的模板是专门用SB写的。因此,向MT5专家提问,该代码是否正确?
关于这个说法。
在OrderSend失败 和OrderSend成功后,必须再次完全读取当前的交易环境。这一规则必须始终适用。
为什么我们要在失败后拉动一切?我们为什么要检查订单 和仓位历史?目前的订单和仓位也是如此?更新当下的价格和必要的数据是不够的?
为什么在一个不好的情况下要撤掉所有的东西?为什么要为订单 和职位的历史 而烦恼?目前的订单和仓位也是如此?更新价格和我们目前需要的数据还不够吗?
如果你从字面上理解,那么你可以从市场观察中阅读每个符号过去的tick历史。但我认为你实际上明白这句话的意思。
这段代码算是实现了这一说法。这就是为什么我有一个问题要问每个了解MT5的人:代码是否正确?