EA需要的简单代码(修改两个未结订单) - 页 2

 
kwng111:


对不起,在我看来,你的帖子不是madmax3的解决方案。

你不需要在一个名为void CloseAll()的函数中修改交易。
此外,你必须选择OrderSymbol()和OrderMagicNumber()。

而在这部分程序中

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

待定交易仍然会被修改

[删除]  

以下是整个EA的修改后的代码。

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        
    
}

     }
 
     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
  
  
  
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
   }





}

// the end.

CloseAll()函数的存在是为了在指定的时间关闭交易,如果它们持续了这么久。

这部分代码是我想弄清楚的修订部分。
(你可以看到MagicNumber和Symbol都在那里,但只有挂单 仍在被修改)

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int total=OrdersTotal();
 if(total>1)

你昨天被告知,选择将无法工作。 并说你必须测试返回代码和约总

如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心尝试帮助你。

[删除]  
WHRoeder:

昨天有人告诉,选择将不工作。 并说你必须测试返回代码和关于总

如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心去尝试帮助你。


我已经做了以上两件事,我想你是指错了人。我是最初的发帖人,而不是deVries,我已经把代码改成了这样(如之前发布的)。

   for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}

现在的问题是,它修改了挂单,而我希望它只修改未平仓的订单,而且只在同一符号的两个未平仓订单同时打开并运行时才修改。我已经尝试了不同的数字组合和OrderSelect数字,但我仍然对此感到困惑。

 
madmax3:


我已经做了以上两件事,我想你指的是错误的人。我是最初的发帖人,而不是deVries,我已经把代码改成了这样(如之前发布的)。

现在的问题是,它修改了挂单,而我希望它只修改未平仓的订单,而且只在同一符号的两个未平仓订单同时打开并运行时才修改。我已经尝试了不同的数字组合和OrderSelect数字,但我仍然对此感到困惑。

所以你需要循环浏览你的未平仓订单,像你上面那样检查符号和MagicNumber ... ...但你也需要检查OrderType() <=OP_SELL...计算匹配的订单,如果是2个 ... ...然后再次循环,OrderModify() 。

你要学习的唯一方法是阅读关于每个函数的文档,掌握它们的工作原理 ...... 例如 OrderType()

[删除]  

我已经尝试了各种不同的代码,但仍然无法准确地工作。当有两笔交易时,它修改了其中一笔交易,而且一直在修改,我只需要修改一次,我需要修改两笔交易。

     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() <= OP_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() <= OP_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

有什么建议,我应该怎么做?我已经阅读了相关的文件。

 
订单修改前和修改后的区别是什么? 什么变化?
[删除]  

首先设置了两个订单,然后其中一个(在这种情况下,当我测试具体日期时是卖出)被执行。在当天晚些时候,第二个订单(仍然存在)被执行,这个交易是买入。
卖出是订单1,买入是订单2。买入(订单2)的TakeProfit被修改了16.3点(我不知道为什么它没有增加20点),然后TakeProfit在同一分钟内增加了0.2点,这种情况一直在发生,TakeProfit在一天中不断被修改,有时增加,有时减少,不知道为什么会发生。

编辑:我认为16.3点和进一步的变化也是受点差的影响?

 
好吧,我们能不能回到开头......。 我知道你试图修改两个订单......但你到底想做什么?"尾随SL"?"其他"?"你想实现什么?
 
madmax3 2012.03.09 15:06
WHRoeder

昨天有人告诉你,选择将不工作。 并说你必须测试返回代码和约总

如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心去尝试帮助你。


我已经做了以上两件事,你应该是指错人了吧?

我指的是你之前的 直接帖子

madmax3 2012.03.09 14:52
这里是整个EA的修订代码。
   total=OrdersTotal();
   if(total<1) 
它仍然显示了我所说的 问题