追踪器EA无法工作 - 页 3 1234 新评论 William Roeder 2016.04.16 11:15 #21 FMIC: 一些建议;不要使用 "Ask "或 "Bid"-使用 "OrderClosePrice() "代替。这是一个实时值,无论它是买入还是卖出订单。 不是实时的。对于Ask 和Bid,你必须在延迟后刷新Rates(),即在多次服务器调用之间,在睡眠 或长时间计算之后。对于OrderClosePrice,它只 在OrderSelect 时被更新。因此,在睡眠或长时间计算后(或在OnTick 调用之间保持订单选择),你必须重新选择。OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice Fernando Carreiro 2016.04.16 13:23 #22 WHRoeder: 不是实时的。对于Ask 和Bid,你必须在延迟后刷新Rates(),即在多次服务器调用之间,在睡眠 或长时间计算之后。对于OrderClosePrice,它只 在OrderSelect 时被更新。因此,在睡眠或长时间的计算后(或在OnTick 调用之间保持一个订单的选择),你必须重新选择。谢谢你提供的信息。我不知道 "OrderClosePrice() "是缓冲的。所以我猜测,无论是 "OrderClosePrice() "还是 "Ask"/"Bid "都不是理想的实时解决方案。然而,你是否同意 "OrderClosePrice() "是一个比在 "OrderSelect() "后使用 "Ask"/"Bid "更好的整体解决方案?而对于实时解决方案,如果确实需要,那么我想我们可以采用其他方法。用 "OrderSelect() "重新选择订单(编辑:在最初的帖子中忘记列出这个,尽管你指出了它)用 "Ask"/"Bid "的 "RefreshRate() "重新选择。带有 "MODE_ASK"/"MODE_BID "的 "MarketInfo()"(旧的MQL4风格)。带有 "SYMBOL_ASK"/"SYMBOL_BID "的 "SymbolInfoDouble()"(新式的MQL4+和MQL5)。"SymbolInfoTick()"(反正我已经在我的大多数EA中使用了)。 Trailingstop EA won't work 跨平台智能交易程序: 重用来自 MQL5 标准库的控件 交易者生活窍门: 利用 defines (#define) William Roeder 2016.04.16 16:47 #23 FMIC: 然而,你是否同意 "OrderClosePrice() "是一个比在 "OrderSelect() "后使用 "Ask"/"Bid "更好的整体解决方案? 绝对是。 Carl Schreiber 2016.04.17 06:18 #24 你为什么又想发明轮子呢?看看这里-- 你会找到你需要的一切。如果没有,就开始修改它的源代码。 trader3000 2016.04.18 16:58 #25 谢谢大家迄今为止的帮助。 我想我现在已经解决了错误130的问题,但我的OrderSelect功能 有严重的问题,这很可能是它有时只修改一些订单的原因。 以下是我打印的东西清单。OrderTicket#是完全错误的。 该票号属于我为欧元兑美元开立的交易。 虽然我没有包括所有的结果,但实际上有多个货币对的OrderTicket号码与交易终端中的货币对不对应。谁能看一下,让我知道OrderSelect的问题出在哪里?谢谢你2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 我认为ticket应该打印与OrdersTotal相同的值,所以看起来我的计数器不起作用。2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 112016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 02016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 12016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357extern int TrailingStart=12; extern int TrailingStop=5; double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; int TS=TrailingStart-TrailingStop; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init(){ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit(){ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start(){ double Pip=Point*10; int ticket=0; if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2; Print("OrdersTotal = ",OrdersTotal()); Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET)); Print("ticket = ",ticket); Print("OrderTicket = ",OrderTicket()); Print("Selectbyticket = ",SELECT_BY_TICKET); Print("Selectbypos = ",SELECT_BY_POS); {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{} if(OrderSelect(i,SELECT_BY_POS)){ ticket++;{ if(OrderSymbol()==_Symbol){ if(OrderType()==OP_BUY){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on. if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<' if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the ! return(0); //I replaced the Getlasterrror with a return value RefreshRates(); } } } } if(OrderType()==OP_SELL){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){ if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){ if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red)) return(0); RefreshRates(); } } } } } } } } return(0); } //+------------------------------------------------------------------+ Trailingstop EA won't work How to open 1 order open time sort trader3000 2016.04.20 07:59 #26 大家好,感谢大家的帮助。 我发现了错误,问题已经解决了。 由于我没有使用止损,OrderStopLoss()的值总是0。这在修改买入订单时不是问题,因为0总是小于Bid-TrailingStop*Pip。 但在卖出订单 时,0永远不能超过Ask+Trailingstop*Pip。 所以我不得不在这一行加入or(|| OrderStopLoss())。if(OrderType()==OP_SELL){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){ if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0 if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red)) William Roeder 2016.04.20 10:38 #27 Trader3000: 该票据号码属于我为欧元兑美元所做的交易。 在你的OrderSelect 循环中没有过滤功能。当另一种货币被添加到另一个单独的图表中时,符号不等于Ordersymbol。-MQL4论坛 trader3000 2016.04.20 14:35 #28 WHRoeder: Trader3000:该票据号码属于我为欧元兑美元开设的交易。 在你的OrderSelect 循环中没有过滤功能。当另一种货币被添加到另一个单独的图表中时,符号不等于Ordersymbol。- MQL4论坛非常感谢你的帮助。 是的,OrderSelect肯定有问题,因为它只在某些图表上起作用。 另一个问题是,我不能包括MagicNumber,因为交易是手动进行的。 我使用了我认为相关的那部分代码,但我无法让它编译。 它显示了这个错误。'MySelect' - 函数只能在全局范围内声明 Trailing_v26.mq4 31 13而第31行就是这个。bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){这里是整个EA。#property strict; extern int TrailingStart=10; extern int TrailingStop=5; double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; int TS=TrailingStart-TrailingStop; bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES); //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init(){ if(TS<stoplevel){ MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+ "\nbe less than the minimum levels required by your broker and the"+ "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips"); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit(){ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start(){ double Pip=Point*10; if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop; bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){ if (!OrderSelect(iWhat, eSelect, ePool)) return (false); if (OrderSymbol() != _Symbol) return (false); if (ePool != MODE_HISTORY) return (true); return(OrderType() <= OP_SELL); } for(int i = OrdersTotal()-1; i >= 0; i--) if (MySelect(i, SELECT_BY_POS)){ for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--) if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){ int nextTkt = OrderTicket(); if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ if(OrderStopLoss()<Bid-(TrailingStop*Pip)){ if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) Print("Buy = ",GetLastError()); return(0); RefreshRates(); } } } } if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){ if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red)) Print("Sell = ",GetLastError()); return(0); RefreshRates(); } } } } return(0); } //+------------------------------------------------------------------+ Fernando Carreiro 2016.04.20 15:58 #29 Trader3000:是的,OrderSelect肯定有问题,因为它只在某些图表上起作用。 另一个问题是,我不能包括MagicNumber,因为交易是手动进行的。 我使用了我认为相关的那部分代码,但我不能让它编译。我给了你一个很好的骨架代码,在此基础上解决了你的问题,甚至在此之前还列出了这些问题,但你却选择忽视它,继续挣扎着想知道为什么你的代码不能做你想做的事情为什么?你想让你的代码不工作吗?用这个例子,自己测试一下吧 William Roeder 2016.04.21 12:06 #30 他认为他可以直接剪切和粘贴,不必学习代码。他甚至连这个简单的错误都不问就能解决。'MySelect' - 函数只能在全局范围内声明 Trailing_v26.mq4 31 13 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
不是实时的。
谢谢你提供的信息。我不知道 "OrderClosePrice() "是缓冲的。所以我猜测,无论是 "OrderClosePrice() "还是 "Ask"/"Bid "都不是理想的实时解决方案。
然而,你是否同意 "OrderClosePrice() "是一个比在 "OrderSelect() "后使用 "Ask"/"Bid "更好的整体解决方案?
而对于实时解决方案,如果确实需要,那么我想我们可以采用其他方法。
你为什么又想发明轮子呢?
看看这里-- 你会找到你需要的一切。
如果没有,就开始修改它的源代码。
谢谢大家迄今为止的帮助。 我想我现在已经解决了错误130的问题,但我的OrderSelect功能 有严重的问题,这很可能是它有时只修改一些订单的原因。 以下是我打印的东西清单。OrderTicket#是完全错误的。 该票号属于我为欧元兑美元开立的交易。 虽然我没有包括所有的结果,但实际上有多个货币对的OrderTicket号码与交易终端中的货币对不对应。
谁能看一下,让我知道OrderSelect的问题出在哪里?谢谢你
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 我认为ticket应该打印与OrdersTotal相同的值,所以看起来我的计数器不起作用。
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357
大家好,感谢大家的帮助。 我发现了错误,问题已经解决了。 由于我没有使用止损,OrderStopLoss()的值总是0。这在修改买入订单时不是问题,因为0总是小于Bid-TrailingStop*Pip。 但在卖出订单 时,0永远不能超过Ask+Trailingstop*Pip。 所以我不得不在这一行加入or(|| OrderStopLoss())。
非常感谢你的帮助。 是的,OrderSelect肯定有问题,因为它只在某些图表上起作用。 另一个问题是,我不能包括MagicNumber,因为交易是手动进行的。 我使用了我认为相关的那部分代码,但我无法让它编译。 它显示了这个错误。
'MySelect' - 函数只能在全局范围内声明 Trailing_v26.mq4 31 13
而第31行就是这个。
这里是整个EA。
是的,OrderSelect肯定有问题,因为它只在某些图表上起作用。 另一个问题是,我不能包括MagicNumber,因为交易是手动进行的。 我使用了我认为相关的那部分代码,但我不能让它编译。
我给了你一个很好的骨架代码,在此基础上解决了你的问题,甚至在此之前还列出了这些问题,但你却选择忽视它,继续挣扎着想知道为什么你的代码不能做你想做的事情
为什么?你想让你的代码不工作吗?用这个例子,自己测试一下吧