Ea正在创建多个相同的待定/限价订单 [请帮助]

 

嗨,我做了一个Ea,但当我做回测时,它在每个tick上创建了许多相同的挂单。如何停止这种情况。我每次只需要一个订单,我不需要它的副本。

如果我在小时图上以"仅开盘价"运行这个EA,那么它就不会创建副本。

另外,我的EA有反转交易的选项,如果买入限制失败,它就会开启卖出交易。也请让我知道我的设置是否正确。任何帮助都会被感激。

谢谢你的时间。

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0)
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: 如何阻止这一点。
你是怎么想的?你在打开一个新的之前检查 一个已经退出的。
 
WHRoeder:
现金立方 。如何阻止这种情况。
你是怎么想的?你在打开一个新的之前检查已经退出的。

那该怎么做?删除 buyticket == 0和sellticket == 0代码?
 
EA的编码必须能够恢复。如果电源故障,操作系统崩溃,终端或图表被意外关闭,在下一个tick上,任何静态/全局票据变量将被丢失。你将有一个开放的订单,但不知道它,所以EA将永远不会尝试关闭它,跟踪SL,等等。你打算如何恢复?使用OrderSelect 循环来恢复,或持久性存储(GV/文件)所需的票据号码。
 
WHRoeder:
EA的编码必须能够恢复。如果电源故障、操作系统崩溃、终端或图表被意外关闭,在下一个交易日,任何静态/全局票据变量都将丢失。你将有一个开放的订单,但不知道它,所以EA将永远不会尝试关闭它,跟踪SL,等等。你打算如何恢复?使用OrderSelect 循环来恢复,或持久性存储(GV/文件)所需的票据号码。

你好,我按以下方式添加了它,改变了代码。

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

它仍然在每一个刻度上多次接受相同的订单。

另外,如果我去掉"!"符号,它就不会进行任何交易。

最后,我是否必须从我的主函数中删除buyticket和sellticket的检查?

谢谢你

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. 不要粘贴代码
    播放视频
    编辑 你的帖子。
    对于大量的代码,请附上。

  2. 你永远不会写if( (2+2 == 4) == true) 对吗?if(2+2 == 4) 已经足够了。所以不要写if(bool == true),只要使用if(bool)if(! bool)。当你使用有意义的变量名时,代码就会变得自成体系,比如bool isLongEnabled。Long_Entry听起来像是一个触发价格或一个票号,"如果长线进入 "是一个不完整的句子。
  3. 你在哪里检查BuyTicket 是否已经关闭?通过票据选择永远是真的(给定一个有效的票据号码),订单可能是待定、开放、关闭或删除中的任何一个。
  4. 你完全忽略了我关于OrderSelect 循环的建议。
 

你好,WHReder 谢谢你的回答。

是的,我在SRC代码中加入了这些内容。但是当我编辑时,它没有显示出来。

我按照你的建议删除了==true条款。

请不要误会我的意思,我对这个orderselect循环的理解有一个弱点。我并没有忽略。我试着添加它,但它太复杂了,运行时显示16个错误和2个警告。 在那段代码中,MN.Count是什么?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

关于检查买票关闭。我没有检查,因为,我检查了当前价格是否低于买入止损,然后买入交易被关闭。

 Bid < BuyStopLoss 

谢谢

 

我是这样安排代码的......但现在显示2个错误。"Myselect "和 "MyOrdersTotal "只能在全局范围内被清除。

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
你不能在另一个函数中声明一个函数
 
GumRai:
你不能在另一个函数中声明一个函数

那么我怎样才能做到这一点。我的意思是我有很多条件要单独检查,以打开一个买入/卖出订单

这就是为什么我做了一个buycall/sellcall函数,使代码更容易。

只是EA做了这么多相同的交易。我不知道如何阻止它。

 
GumRai:
你不能在另一个函数中声明一个函数

cashcube:

那么我怎样才能做到这一点。我的意思是我有很多条件要单独检查,以打开一个买入/卖出订单。

这就是为什么我做了一个buycall/sellcall函数,使代码更容易。

只是EA做了这么多相同的交易。我不知道如何阻止它。

首先,不要试图在另一个函数中声明一个函数

我无法通过查看你所发布的代码来了解你的意图。所以我无法帮助你。