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

 

基本上我在一个特定的时间设置了两个挂单,具体是23:00 GMT+2我想。其中一个挂单是卖出止损,另一个是买入止损,两个订单离23:00蜡烛图的开盘点位有相同的距离,在这种情况下是14点。两个订单都有28点的获利空间(在这种情况下)和55点的止损空间。

现在,当两个订单都完成时(基本上在订单到期前,从23:00蜡烛的开盘价开始上涨和下跌14点),我希望两个订单的获利 增加,例如,20点。因此,在这种情况下,他们的新获利是58点。但是止损应该始终保持不变。从本质上讲,我想做的是某种对冲的事情。

如果有两笔交易,那么价格很可能会朝一个方向走,如果两笔交易的获利增加,就足以抵消任何损失。为了获得任何利润,只有一个交易开仓并达到止盈,或者两个交易都开仓并达到止盈,而不向一个方向走得太远。

我希望这很清楚,如果不清楚,我将提供一张图片,应该会更清楚。

 
WHRoeder:

我指的是你之前的帖子

madmax3 2012.03.09 14:52
这里是整个EA的修订代码。
这仍然显示了我所说的 问题
我相信这部分代码是针对EA的另一部分,即打开挂单的部分,这对我试图修复的部分有任何影响吗?对不起,我想我混淆了部分代码,特别是在原帖中。不过,我已经对我特别需要的那部分代码做了你所说的。
 
madmax3:

我希望这很清楚,如果不清楚,我会提供一张图片,应该更清楚。

很清楚,谢谢你。

所以你只是想修改一次这些订单......那么答案很简单。你需要检查 23:00栏,确定订单应该在哪个TP开仓 ... ...如果订单在同一个TP,那么它们需要修改,如果它们不在同一个TP,那么它们已经被修改过了,不需要再修改 ... ...很简单。

 
RaptorUK:

这很清楚,谢谢你。

所以你只想修改一次这些订单 ......那么答案很简单。你需要检查23:00栏,并确定订单应该在哪个TP开仓 . . . 如果订单在同一个TP,那么它们需要修改,如果它们不在同一个TP,那么它们已经被修改了,不需要再修改 . . . 很简单。

修改和检查应该只发生在有两笔交易的时候,我应该如何做呢?我应该在我已经有的代码上添加还是重新开始?

因此,从本质上讲,如果有两笔交易(相同的符号和神奇的数字),EA应该检查未平仓交易的获利 与先前存在的挂单(现在已经执行)相比,然后如果它们是相同的,它应该被改变,一旦它循环,它将再次检查,发现它们不相同,因此不会进一步修改交易?
 
madmax3:
1. 1.修改和检查应该只在有两笔交易的情况下发生,我应该如何做呢?我应该在我已经有的代码上添加还是重新开始?

2. 因此,从本质上讲,如果有两笔交易(相同的符号和神奇的数字),EA应该检查未平仓交易的获利与先前存在的挂单(现在已经执行)进行比较,然后如果它们相同,应该进行修改,一旦循环,它将再次检查并发现它们不相同,因此不会进一步修改交易?

1. 循环检查未平仓订单,检查符号和神奇数字,当你有一个不是挂单类型 的匹配时,增加一个计数器 ... ...当你通过检查订单,如果你有2个,那么你有2个正确的符号和神奇数字的未平仓订单 ... ...所以现在你可以修改它们 ...见2。

2. 不,如果挂单已经被激活,现在不再是挂单,你就不能看到挂单的TP。 EA应该检查23:00条,并计算出原来的TP 多少 ... ...然后将其与2个未结订单的TP进行比较 ... ...根据这些信息,可以决定是否进行修改。

 
RaptorUK:

1. 循环检查未平仓订单,检查符号和神奇数字,当你有一个不是挂单类型的匹配时,增加一个计数器 ... ...当你通过检查订单,如果你有2个,那么你有2个正确的符号和神奇数字的未平仓订单 ... ...所以现在你可以修改它们 ...见2。

2. 不,如果挂单已经被激活,现在不再是挂单,你就不能看到挂单的TP。 EA应该检查23:00条,并计算出原来的TP 多少 ... ...然后将其与2个未结订单的TP进行比较 ... ...根据这些信息,可以决定是否进行修改。

啊,我明白了,我相信这就是我一直以来想做的事情。到目前为止,有一个订单被修改了(特别是买入订单,在我的测试中是订单2),但它一直在被修改,我是否要用'中断'来阻止它的重复出现?另外,我如何计算并只修改未结订单,当且仅有两个订单未结时?我一直想用OrdersTotal()来做这个,但是没有成功,我想我不需要为每个订单做两段独立的代码,对吗?
只有偶数的未结订单被修改,就像我说的,它们反复被修改,我已经尝试了OrderSelect()的各种组合,但我还是想不通,就像我说的,我在MQL方面完全是个新手,这个EA已经非常接近完成,所以我想完成它。我读过这个https://book.mql4.com/trading/ordermodify,这与我的情况有什么关系吗?它是用来止损的,但我需要它来获取利润。

我在这里做错了什么?

     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_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    return(0);
    
  if (
        OrderSelect(iPos-1, SELECT_BY_POS-1)                    
    &&  OrderMagicNumber()  == MagicNumber                
    &&  OrderSymbol()       == "EURUSD"                
    && (OrderType() == OP_SELL)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
return(0);
  }

我如何去检查TP是否与23:00的蜡烛相同?有必要这样吗,因为只要在有2个未平仓的订单时进行修改,就能达到同样的效果?或者这只是为了阻止订单不断被修改,是的,我已经检查了文件。

谢谢。

madmax3

 

你的return(0)是在第二个订单被修改之前把你带出start()。

你所做的是通过位置选择订单,检查它有正确的魔法号码,检查它是正确的符号,检查它是OP_BUY ... ...然后你修改它,你在哪里确定它是否已经被修改?

你的EA必须能够从中断中恢复 ......如果你的订单被放置,MT4崩溃,它必须能够在重新启动时从它离开的地方恢复。

这就是为什么你需要确定订单是否已经被修改或需要被修改 ......如何?

"我在一个特定的时间设置了两个挂单,具体是23:00 GMT+2我想。其中一个挂单是卖出止损,另一个是买入止损,两个订单离23:00蜡烛的开盘点位有相等的距离,在这种情况下是14点。两者的止盈都是28点(在这种情况下),止损是55点"

你可以通过参考23:00的蜡烛来计算原始TP的位置,检查订单,看看它是否仍然设置为原始TP,如果是,那么它可以被修改 ...如果不是,那么它已经被修改,所以不要再修改它。

还有其他方法可以记录订单被修改的情况,跟踪票据号,当它被修改时将信息写入文件,当你要再次修改它时,打开文件并检查票据号,等等。 我认为检查与原始TP相比,要简单得多。

 

到目前为止,我有这个。

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

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
  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.

上文中包含的文件编写代码是。

//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
          	 FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

但我得到了这些错误。

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: FileOpen - too manyopened files

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: invalid handle -1 in FileWrite

这是怎么回事?

 

你到底为什么要选择这两个选项中最难的一个?

当你完成对文件的写入后,你需要关闭它 ......如果它已经打开了,你不需要再打开它。

//---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name="check.csv";        // File name
   
Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening    File opened here, outside the loop
   

FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
   {       
   OrderSelect(iPos,SELECT_BY_POS);
   FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime() )  //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose(Handle);      //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

你的for循环是错误的 ......最后的顺序位置是0 而不是1

 
RaptorUK:

你到底为什么要选择这两个选项中最难的一个?

这不是使用文件进行修改和检查的 方法吗?还是我需要把这两个代码结合起来,修改(我在最后一个帖子之前的帖子)和文件代码(这只是为了确保没有进一步的修改发生)?