EA的编码必须能够恢复。如果电源故障,操作系统崩溃,终端或图表被意外关闭,在下一个tick上,任何静态/全局票据变量将被丢失。你将有一个开放的订单,但不知道它,所以EA将永远不会尝试关闭它,跟踪SL,等等。你打算如何恢复?使用OrderSelect 循环来恢复,或持久性存储(GV/文件)所需的票据号码。
WHRoeder:
EA的编码必须能够恢复。如果电源故障、操作系统崩溃、终端或图表被意外关闭,在下一个交易日,任何静态/全局票据变量都将丢失。你将有一个开放的订单,但不知道它,所以EA将永远不会尝试关闭它,跟踪SL,等等。你打算如何恢复?使用OrderSelect 循环来恢复,或持久性存储(GV/文件)所需的票据号码。
EA的编码必须能够恢复。如果电源故障、操作系统崩溃、终端或图表被意外关闭,在下一个交易日,任何静态/全局票据变量都将丢失。你将有一个开放的订单,但不知道它,所以EA将永远不会尝试关闭它,跟踪SL,等等。你打算如何恢复?使用OrderSelect 循环来恢复,或持久性存储(GV/文件)所需的票据号码。
你好,我按以下方式添加了它,改变了代码。
//---------------------- Buy/Sell function (limit orders) int BuyCall( double BC) { if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } }
它仍然在每一个刻度上多次接受相同的订单。
另外,如果我去掉"!"符号,它就不会进行任何交易。
最后,我是否必须从我的主函数中删除buyticket和sellticket的检查?
谢谢你
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
-
播放视频请编辑 你的帖子。
对于大量的代码,请附上。
- 你永远不会写if( (2+2 == 4) == true) 对吗?if(2+2 == 4) 已经足够了。所以不要写if(bool == true),只要使用if(bool) 或if(! bool)。当你使用有意义的变量名时,代码就会变得自成体系,比如bool isLongEnabled。Long_Entry听起来像是一个触发价格或一个票号,"如果长线进入 "是一个不完整的句子。
- 你在哪里检查BuyTicket 是否已经关闭?通过票据选择永远是真的(给定一个有效的票据号码),订单可能是待定、开放、关闭或删除中的任何一个。
- 你完全忽略了我关于OrderSelect 循环的建议。
你好,WHReder 谢谢你的回答。
是的,我在SRC代码中加入了这些内容。但是当我编辑时,它没有显示出来。
我按照你的建议删除了==true条款。
请不要误会我的意思,我对这个orderselect循环的理解有一个弱点。我并没有忽略。我试着添加它,但它太复杂了,运行时显示16个错误和2个警告。 在那段代码中,MN.Count是什么?
// extern int Magic.Number.Base = ... // int magic.number.max; // Export to OpenOrder/MySelect // string market.pair; // Export to OpenOrder/MySelect // int init(){ // market.pair = Symbol(); // magic.number.max = Magic.Number.Base + MN.COUNT - 1;
关于检查买票关闭。我没有检查,因为,我检查了当前价格是否低于买入止损,然后买入交易被关闭。
Bid < BuyStopLoss
谢谢
我是这样安排代码的......但现在显示2个错误。"Myselect "和 "MyOrdersTotal "只能在全局范围内被清除。
int BuyCall( double BC) { //-----------code bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){ if(!OrderSelect(iWhat, eSelect, ePool) ) return (false); int mn = OrderMagicNumber(); if(mn < MNB1 ) return (false); if(mn > MNB2 ) return (false); if(OrderSymbol() != Pair ) return (false); if(ePool != MODE_HISTORY ) return (true); return(OrderType() <= OP_SELL); } int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){ #define OP_ALL -1 if(ePool == MODE_TRADES) iPos = OrdersTotal() - 1; else iPos = OrdersHistoryTotal() - 1; for(nOrders=0; iPos >= 0; iPos--) if( MySelect(iPos, SELECT_BY_POS, ePool)) if( op == OP_ALL || op == OrderType() ) nOrders++; return(nOrders); } if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET)) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } } return(BuyTicket); }
嗨,我做了一个Ea,但当我做回测时,它在每个tick上创建了许多相同的挂单。如何停止这种情况。我每次只需要一个订单,我不需要它的副本。
如果我在小时图上以"仅开盘价"运行这个EA,那么它就不会创建副本。
另外,我的EA有反转交易的选项,如果买入限制失败,它就会开启卖出交易。也请让我知道我的设置是否正确。任何帮助都会被感激。
谢谢你的时间。