追踪器EA无法工作 - 页 4

 
WHRoeder:
他认为他可以直接剪切和粘贴,不必学习代码。他甚至连这个简单的错误都不问就能解决。
'MySelect' - 函数只能在全局范围内声明 Trailing_v26.mq4 31 13


我真的很感谢你和其他人提供的帮助。 在过去的几天里,我尝试了所有的方法来得到这个编译,我很抱歉我没有问。 你们中的大多数人都建议我推迟使用自己的代码,使用别人的代码,但是如果我不明白我做错了什么,我就不会去学习。对我来说,我的代码看起来很好。 我要求它按头寸计算订单,只选择那些符合我的标准的订单,然后修改那个特定的交易。 到目前为止,在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实际上是在讨论这个问题,他说他用下面的代码来克服我的问题,然而,这是一个正确发送订单的计数器,而不是一个过滤订单的函数。 我试图把它作为一个过滤器,但没有成功。

int OpenOrdersThisPair(string pair){
   int total=0;
      for(int s= OrdersTotal()-1; s>= 0; s--){
         OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
           if(OrderSymbol()==pair) total++;
       }
   return(total);  
}

我的代码现在看起来是这样的。 谁能批评一下我的代码,让我从中吸取教训,并告诉我为什么它在多个图表上不起作用。我知道它不可能那么糟糕,因为它实际上有时工作得很好。 谢谢你

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=10;
extern string Label_TrailingStop="Pips trailing behind";
extern int 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);
     } 
}


 
Trader3000:

到目前为止,在4页纸之后,没有人指出我的代码中哪一行是坏的。

不是这样的!我们已经描述了你的错误,并为它们提供了多种形式的解决方案。但你却无视它们,继续用你的方式去做。不仅如此,你现在甚至通过增加更多的错误使情况变得更糟。

当一个画家学习绘画时,他首先是通过模仿别人的技术来完成的,而别人已经掌握了这些技术。只有当他适应了这些技术,他才开始创造自己的绘画方式。

以下是 "我的批评 "的简短清单。

  1. 使用你的大括号("大 "括号)。不要试图在他们身上吝啬和节省。在你的代码功能 完备并经过调试之前,即使只是在代码块中包含了一行,也要添加它们。也要把它们放在一个单独的行上。如果你有大量的空白空间,不要担心。你可以随时回去清理,但在开始时,你要确保所有的东西都在它们正确的代码块内,大括号和小括号是平衡的。在一个节奏中串联几个 "if "语句是灾难的根源,因为它很难调试,尤其是像这样的一个挑剔的编译器。
  2. 你原来的代码只有一个循环,现在你把它变成了两个,除了让你的代码变得更慢和重复出现bug时必须修复的地方外,没有任何明显的原因。
  3. 使用变量来存储表达式的结果!你把同样的表达式重复了好几次,使你的代码不仅变慢,而且更容易出错,更难阅读和修复,因为你必须在好几个地方改变它们。

还有更多的事情,我可以列出来,但至少要解决这些问题,一劳永逸

编码就像任何其他语言一样。是的,你可以只把单词串起来,但这并不能使你成为一个诗人。在编码中,你也必须有节奏和结构,以使其可读性和功能性。

 
FMIC:

以下是 "我的批评 "的简短清单。

好的,非常感谢你的建议。 实际上,我最初在所有的'if'语句中都用了括号,就像我早些时候在这里发布的代码一样,但由于那段代码不起作用,我尝试了其他各种方法,其中包括复制我在前一篇帖子中粘贴的代码。正如我提到的,这实际上甚至不是我的代码,但它也不是对所有的交易对都有效。 然而,我将再次替换括号,并遵循其他建议。 同时,我了解到OrderSelect将在终端打印第一个订单的符号,而不是EA所在的订单,所以这实际上没有错。

编辑:谢谢你的建议#3!!!!!!!,我想这就是问题所在,因为必须先通过符号选择订单,然后再存储数值。所以我把变量移到这些函数 下面,如下所示,现在似乎可以工作了(但在我确定之前还需要更多的测试

int start(){
      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());
            }
         }
 
Trader3000:

好的,非常感谢你的建议,其实我一开始是按照我之前发布的代码,在所有的 "if "语句上加了括号,但是因为那个代码没有用,所以我尝试了各种其他的方法,其中包括复制我在之前的帖子中粘贴的代码。正如我提到的,这实际上甚至不是我的代码,但它也不是对所有的交易对都有效。 然而,我将再次替换括号,并遵循其他建议。 同时,我了解到OrderSelect将在终端打印第一个订单的符号,而不是EA所在的订单,所以这实际上没有错。

编辑:谢谢你的建议#3!!!!!!!,我想这就是问题所在,因为必须先通过符号选择订单,然后再存储数值。所以我把变量移到这些函数下面,如下所示,现在似乎可以工作了(但在我确定之前还需要更多的测试

看了一下你的最新代码,我想说的是--我放弃了!(你拒绝执行)。(你拒绝贯彻执行)!
 
FMIC: 看了一下你的最新代码,我要说的是--我放弃了!(你拒绝贯彻执行)!
现在也许你能理解当他们浪费大家的时间时我的"严厉批评"。虽然我理解"简单的事情",他们认为浪费大家的时间是可以接受的,但我不理解。

Trader3000:我认为这就是问题所在,...
int start(){
      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());
            }
         }
你的问题是,你不思考。
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());
      }
   :
 
WHRoeder:
现在也许你能理解当他们浪费大家的时间时我的"严厉批评"。虽然我理解他们认为浪费大家的时间是可以接受的 "简单的事情",但我不理解。

是的!不幸的是,看来你是正确的!

 

谢谢你的回答。所以,我把代码改回了早期的版本,如下图所示。 在这样的情况下,它似乎在所有止损点为50点的货币对上都能完美工作,但在止损点更高的货币对上却不能,例如,欧元兑美元,即使外部变量高于止损点。 所以这很奇怪。

extern int TrailingStart=15;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
           
   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 ticket=0,buy_ticket=0,sell_ticket=0;  
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()){
      ticket++;
      if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
      }
            if(OrderType()==OP_BUY){
               if(OrderSelect(buy_ticket,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(OrderType()==OP_SELL){
               if(OrderSelect(sell_ticket,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);
}
//+------------------------------------------------------------------+
 

我还找到了另一个与我的代码非常相似的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,因为止损点离止损点太近了。 或者我对此有误解吗?

我的问题会不会是这些中的一个或多个?

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Àâòîìàòè÷åñêèé Trailing Stop âñåõ îòêðûòûõ ïîçèöèé    |
//|            Âåøàòü òîëüêî íà îäèí ãðàôèê                          |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ------------------------------------------
extern bool   ProfitTrailing = True;  // Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 15;     // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 5;     // Øàã òðàëà
extern bool   UseSound       = True;  // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound  = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      TrailingPositions();
    }
  }
}

//+------------------------------------------------------------------+
//| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss                                          |
//| Ïàðàìåòðû:                                                       |
//|   ldStopLoss - óðîâåíü StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Trader3000:

我还找到了另一个与我的代码非常相似的EA,并比较了代码。

让我们看看我是否能理解你的这种逻辑!你愿意从别人那里找到另一个EA,并愿意将该代码纳入你的EA,但你却不愿意接受专门为帮助你解决问题而编写的代码!!!!!。

呜呼!你是多么合乎逻辑啊!当你需要他的时候,SPOCK在哪里?

斯波克,愿你安息!我们都想念你!

 
FMIC:

让我看看我是否能理解你的这个逻辑!你愿意从别人那里找到另一个EA,并愿意将该代码纳入你的代码中,但你却不愿意采用专门为帮助你解决问题而编写的代码!!!!。

呜呼!你是多么合乎逻辑啊!当你需要他的时候,SPOCK在哪里?

斯波克,愿你安息!我们都想念你!

我终于明白了,所以感谢大家的帮助(和批评)。 在回到你和Mike在第一页发布的代码后,我看到了我的错误。 我可能忽略了这一点,因为它是如此微妙,但主要是因为我没有正确理解代码的逻辑。 问题是,我认为TrailingStop的点数是它所追踪的点数。所以我的设置低于GBPJPY等货币对的止损点,因为我输入了15和5,因为5低于8的止损点。 通过简单地增加TrailingStop,它现在对所有货币对都有效。 谢谢你!!!!。