求一段在某条件下开仓后出现亏损,价格亏损至X时补仓,再跌再补,补10次,当价格比平均值盈利N时,将所有持仓平掉的代码。千恩万谢。跪求啊!!!哪位神仙帮帮忙?
这个论坛里就没有见在的高手了吗?!
可以使用OrderSend()中的magic、comment参数解决问题。
在开仓时,magic设置特定值(例如:当天的日期20090928),comment设置特定值(例如:20090928_i_j,T日的第i次开单的第j次补仓)。
平仓时,首先检查magic值,然后检查comment值。符合T日第i次开单要求的,全部平仓。
开仓部分:
#include <stdlib.mqh> #include <stderror.mqh> int OpenOrder(int flag) { int ticket, magic, i, j, count, err; double op, sl, tp, lots; string comment, str; datetime curr; str = TimeToStr(TimeCurrent(), TIME_DATE); magic = StrToInteger(StringSubstr(str, 0, 4) + StringSubstr(str, 5, 2) + StringSubstr(str, 8, 2)); for (i=0, count=0; i<OrdersTotal(); i++) if (OrderSelect(i, SELECT_BY_POS) == true) if (OrderMagicNumber() == magic) { str = OrderComment(); j = StringFind(str, "_", 0); if (j < 0) continue; str = StringSubstr(str, 0, j-1); j = StrToInteger(str); if (j > count) count = j; } count++; comment = count + "_0"; if (flag == OP_BUY) op = Ask; else if (flag == OP_SELL) op = Bid; sl = 0.0; tp = 0.0; lots = 0.1; curr = TimeCurrent(); ticket = OrderSend(Symbol(), flag, lots, op, sl, tp, comment, magic, 0, CLR_NONE); err = GetLastError(); if (ticket < 0) { str = TimeToStr(curr) + "OrderSend fail! #" + err + " " + ErrorDescription(err); Debug(-1, str); } else if (OrderSelect(ticket, SELECT_BY_TICKET) == true) OrderPrint(); else { str = TimeToStr(curr) + "OrderSelect fail! #" + err + " " + ErrorDescription(err); Debug(-1, str); } str = "OpenOrder(): "; if (flag == OP_BUY) str = str + "buy "; else if (flag == OP_SELL) str = "sell "; str = str + Symbol() + " OK!"; Debug(0, str); } void Debug(int flag, string str) { if (flag != 0) Print(str); }
在你的ea中,需要记录当天的日期magic、当天的i值(条件指标发出的第i次信号)、当天的j值(第i次信号的第j次补仓)。
这样就不会发生记录冲突。
非常感谢,我发了信息给你。请查阅。不胜感激。
消息看到了,过2天做好后发到你的e_mail。
我看到了你给我的MESSAGE,但我并没有受到你的email,我也给你回复了你给我的MESSAGE。假期事情多,没有及时回复你,还望海涵!
邮件已经给你回复了。谢谢你!我真的没有想到,想实现补仓和获利同时平仓的功能竟然如此之难。真的麻烦你了。