#property strict;
externstring Label_TrailingStart="Pip threshold to activate TrailingStop";
externint TrailingStart=10;
externstring Label_TrailingStop="Pips trailing behind";
externint TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int init(){
if(TS<stoplevel){
MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
"\nby your broker. Please reload the EA and either increase the value of the"+
"\nTrailingStart and/or decrease the value of the TrailingStop so that "+
"\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
}
return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+int deinit(){
return(0);
}
//+------------------------------------------------------------------+//| Expert start function |//+------------------------------------------------------------------+int start(){
if(UseTrailingStop) Trailing();
if(UseAutotrading) Autotrading();
return(0);
}
//+------------------------------------------------------------------+void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY)
if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
if(OrderStopLoss()<Bid-(TrailingStop*Pip))
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
}
for(int s=OrdersTotal()-1; s>=0; s--){
if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
if(OrderType()==OP_SELL)
if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
}
}
void Autotrading(){
if(!IsTradeAllowed()){
MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
"\nthe chart to bring up the inputs window. Under the common tab check the box to"+
"\nallow live trading");
Sleep(50000);
}
if(!IsExpertEnabled()){
MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
Sleep(50000);
}
}
int start(){ for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue; // Everything below is executed if NO order is selected or a selected order is symbol double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip; if(OrderType()==OP_BUY) && Bid-OrderOpenPrice()>TSTP) && OrderStopLoss()<Bid-Trail){ if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange)) Print("Error Buy TrailingStop: ",GetLastError()); } :
我真的很感谢你和其他人提供的帮助。 在过去的几天里,我尝试了所有的方法来得到这个编译,我很抱歉我没有问。 你们中的大多数人都建议我推迟使用自己的代码,使用别人的代码,但是如果我不明白我做错了什么,我就不会去学习。对我来说,我的代码看起来很好。 我要求它按头寸计算订单,只选择那些符合我的标准的订单,然后修改那个特定的交易。 到目前为止,在4页纸之后,没有人指出我的代码中哪一行有问题。除非我首先看到并理解我做错了什么,否则使用别人的代码对我的学习没有任何帮助。 我现在的目标不是要有一个能用的追踪止损EA,因为外面有很多,而是让我学会如何编码,这样我才能继续前进。事实上,我的代码与Jimdandy在他的Youtube上发布的关于追踪止损的教程中的代码几乎一样,由于与他的代码几乎一样,我几乎逐字逐句地复制了代码(除了我想手动交易),但他的代码也只是有时能用。
我已经打印了一些东西。 这个交易几乎超过了我指定的追踪止损启动的点位300点(当时是150点)。
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderModify = false
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Ask = 1.45926
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbypos = 0
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbyticket = 1
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: ticket = 0
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSelect = true
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrdersTotal = 16
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSymbol = EURUSD
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828
2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15: OrderModify = false
这个EA只放在EURAUD上,你可以看到在其他9个图表上有16个订单。 为这个货币对选择的票号是完全错误的,OrderSymbol也是完全错误的。 两者都是为一个开放的EURUSD订单。 基于上述,我的for循环在这种情况下选择了位置 0,而它应该选择的EURAUD是在位置14(15-1)。 为什么? 我告诉它忽略这个。
在上面提到的视频中,Jim实际上是在讨论这个问题,他说他用下面的代码来克服我的问题,然而,这是一个正确发送订单的计数器,而不是一个过滤订单的函数。 我试图把它作为一个过滤器,但没有成功。
我的代码现在看起来是这样的。 谁能批评一下我的代码,让我从中吸取教训,并告诉我为什么它在多个图表上不起作用。我知道它不可能那么糟糕,因为它实际上有时工作得很好。 谢谢你
到目前为止,在4页纸之后,没有人指出我的代码中哪一行是坏的。
不是这样的!我们已经描述了你的错误,并为它们提供了多种形式的解决方案。但你却无视它们,继续用你的方式去做。不仅如此,你现在甚至通过增加更多的错误使情况变得更糟。
当一个画家学习绘画时,他首先是通过模仿别人的技术来完成的,而别人已经掌握了这些技术。只有当他适应了这些技术,他才开始创造自己的绘画方式。
以下是 "我的批评 "的简短清单。
还有更多的事情,我可以列出来,但至少要解决这些问题,一劳永逸
编码就像任何其他语言一样。是的,你可以只把单词串起来,但这并不能使你成为一个诗人。在编码中,你也必须有节奏和结构,以使其可读性和功能性。
以下是 "我的批评 "的简短清单。
好的,非常感谢你的建议。 实际上,我最初在所有的'if'语句中都用了括号,就像我早些时候在这里发布的代码一样,但由于那段代码不起作用,我尝试了其他各种方法,其中包括复制我在前一篇帖子中粘贴的代码。正如我提到的,这实际上甚至不是我的代码,但它也不是对所有的交易对都有效。 然而,我将再次替换括号,并遵循其他建议。 同时,我了解到OrderSelect将在终端打印第一个订单的符号,而不是EA所在的订单,所以这实际上没有错。
编辑:谢谢你的建议#3!!!!!!!,我想这就是问题所在,因为必须先通过符号选择订单,然后再存储数值。所以我把变量移到这些函数 下面,如下所示,现在似乎可以工作了(但在我确定之前还需要更多的测试
好的,非常感谢你的建议,其实我一开始是按照我之前发布的代码,在所有的 "if "语句上加了括号,但是因为那个代码没有用,所以我尝试了各种其他的方法,其中包括复制我在之前的帖子中粘贴的代码。正如我提到的,这实际上甚至不是我的代码,但它也不是对所有的交易对都有效。 然而,我将再次替换括号,并遵循其他建议。 同时,我了解到OrderSelect将在终端打印第一个订单的符号,而不是EA所在的订单,所以这实际上没有错。
编辑:谢谢你的建议#3!!!!!!!,我想这就是问题所在,因为必须先通过符号选择订单,然后再存储数值。所以我把变量移到这些函数下面,如下所示,现在似乎可以工作了(但在我确定之前还需要更多的测试
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()!= Symbol()) continue;
double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
if(OrderType()==OP_BUY){
if(Bid-OrderOpenPrice()>TSTP){
if(OrderStopLoss()<Bid-Trail){
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
Print("Error Buy TrailingStop: ",GetLastError());
}
}
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
if(OrderType()==OP_BUY)
&& Bid-OrderOpenPrice()>TSTP)
&& OrderStopLoss()<Bid-Trail){
if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
Print("Error Buy TrailingStop: ",GetLastError());
}
:
现在也许你能理解当他们浪费大家的时间时我的"严厉批评"。虽然我理解他们认为浪费大家的时间是可以接受的 "简单的事情",但我不理解。
是的!不幸的是,看来你是正确的!
谢谢你的回答。所以,我把代码改回了早期的版本,如下图所示。 在这样的情况下,它似乎在所有止损点为50点的货币对上都能完美工作,但在止损点更高的货币对上却不能,例如,欧元兑美元,即使外部变量高于止损点。 所以这很奇怪。
我还找到了另一个与我的代码非常相似的EA,并比较了代码。 我强调了主要的差异。
1.增量而不是减量
2.用Point乘以一切,而不是Point*10
3.他把跟踪止损和跟踪止盈加在一起,然后减去一个,用跟踪止盈修改订单。 如果我理解正确,跟踪止盈将在移动15点(150点)后被激活。在我的EA中,价格将落后5点,如果价格再次下跌并达到这个5点水平,就会被阻止。 在他的EA中,它也将在15点后被激活,但它落后的点数是19(15+5-1),所以价格必须下跌19点才能被阻止。举个例子:OrderOpenPrice是1.50000,价格上涨150点到1.50150,激活了Trailingstop。 如果价格回落到1.50100,它将被阻止,获得5点利润。在他的EA中,移动止损点也在1.50150被激活,但跟踪点在1.49960,我认为这将导致错误130,因为止损点离止损点太近了。 或者我对此有误解吗?
我的问题会不会是这些中的一个或多个?
我还找到了另一个与我的代码非常相似的EA,并比较了代码。
让我们看看我是否能理解你的这种逻辑!你愿意从别人那里找到另一个EA,并愿意将该代码纳入你的EA,但你却不愿意接受专门为帮助你解决问题而编写的代码!!!!!。
呜呼!你是多么合乎逻辑啊!当你需要他的时候,SPOCK在哪里?
斯波克,愿你安息!我们都想念你!
让我看看我是否能理解你的这个逻辑!你愿意从别人那里找到另一个EA,并愿意将该代码纳入你的代码中,但你却不愿意采用专门为帮助你解决问题而编写的代码!!!!。
呜呼!你是多么合乎逻辑啊!当你需要他的时候,SPOCK在哪里?
斯波克,愿你安息!我们都想念你!