追踪器EA无法工作 - 页 3

 
FMIC: 一些建议;不要使用 "Ask "或 "Bid"-使用 "OrderClosePrice() "代替。这是一个实时值,无论它是买入还是卖出订单。
不是实时的。
  1. 对于AskBid,你必须在延迟后刷新Rates(),即在多次服务器调用之间,在睡眠 或长时间计算之后。
  2. 对于OrderClosePrice,它OrderSelect 时被更新。因此,在睡眠或长时间计算后(或在OnTick 调用之间保持订单选择),你必须重新选择。
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
不是实时的。
  1. 对于AskBid,你必须在延迟后刷新Rates(),即在多次服务器调用之间,在睡眠 或长时间计算之后。
  2. 对于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中使用了)。
 
FMIC: 然而,你是否同意 "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

extern 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);
}
//+------------------------------------------------------------------+



 

大家好,感谢大家的帮助。 我发现了错误,问题已经解决了。 由于我没有使用止损,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))
 
Trader3000 该票据号码属于我为欧元兑美元所做的交易。
在你的OrderSelect 循环中没有过滤功能。当另一种货币被添加到另一个单独的图表中时,符号不等于Ordersymbol。-MQL4论坛
 
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);
}
//+------------------------------------------------------------------+



 
Trader3000:

是的,OrderSelect肯定有问题,因为它只在某些图表上起作用。 另一个问题是,我不能包括MagicNumber,因为交易是手动进行的。 我使用了我认为相关的那部分代码,但我不能让它编译。

我给了你一个很好的骨架代码,在此基础上解决了你的问题,甚至在此之前还列出了这些问题,但你却选择忽视它,继续挣扎着想知道为什么你的代码不能做你想做的事情

为什么?你想让你的代码不工作吗?用这个例子,自己测试一下吧

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