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

 
GumRai:

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

我无法通过查看你所发布的代码来了解你想要做什么。所以我不能帮助你。

感谢GumRai的及时回复。 我的程序有很多条件,如以下。我检查了到P12的情况。它就像一个支点。如果条件满足,那么它就会在这些水平P1, P2,....,其数量为12,开启限价交易。我不想在每个实例上都写上买入/卖出代码。这就是为什么做了单独的买入/卖出函数。下面是我卖出的旧代码。

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

这是一个例子。同样的交易放置在每个tick上。我需要在每个小时内放置这个。因为它是一个小时的中枢。

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

当你打开一个卖出限制 时,你把BuyTicket设置为0。

接下来你检查BuyTicket是否==0,当然它是的,你刚刚设置了它。

然后你把SellTicket设置为0。

下一个勾选,Sellticket==0,所以你打开一个卖出限制,再次将BuyTicket设置为0。

等等,等等............

 
GumRai:

当你打开一个卖出限制时,你把BuyTicket设置为0。

接下来你检查BuyTicket是否==0,当然它是的,你刚刚设置了它。

然后你把SellTicket设置为0。

下一个勾选,Sellticket==0,所以你打开一个卖出限制,再次将BuyTicket设置为0。

等等,等等............

那么我是否应该删除你强调的那两行。我这样做了。现在只显示2个月数据回测的一小时结果。

我注意到另一件事,在我的卖出看涨期权中,我有一个反向的买入交易。如果卖出交易被止损,那么买入交易将打开。现在,卖出交易功能 返回(Selltickets),这样做可以吗?

谢谢你

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

我现在明白了,在这段代码中,首先它检查sellticket==0是的,很明显,然后下了卖单,接下来buyticket==0是的,接下来下了买单...但是当返回时...再次检查sellticket==0,现在没有了...所以这就是为什么Ea在取完一组后就停止了。但如何消除这个问题。在我的EA中,不活跃的挂单在开始时间的每59分钟被删除。我是这样设置的。

 

现在我以如下方式改变了代码,它读取了所有的支撑和阻力。

我在一个小时内最多有6个支持和6个阻力。在这6个支撑和阻力中,如果有一个符合条件,它就会对这6个支撑和阻力开出限价单。这就是算法。

因此,我将代码设置为以下方式的函数调用

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
    
   }   
return(0);
}

int SellCall(double SC)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);
  
   } 
   return(0);
}

现在它运行了一个小时,每次买入/卖出都要检查6个级别。但只运行了一个小时。怎样才能使它完美地运行于全部数据集呢?

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

这只在策略测试器中起 作用,一旦前6个订单被打开,将不再有任何作用。

你不能以这种方式为测试使用票号。

 
GumRai:

这只在策略测试器中起作用,一旦前6个订单被打开,将不再有任何作用。

你不能以这种方式为测试使用票号。

谢谢你的回答。

那么我应该怎么做。如果我删除BuyTicket =>0或任何BuyTicket条件。那么EA就会在每个tick.....,给我带来148的订单结束错误。

 
cashcube: 那么我应该怎么做。
以前回答过。
 
cashcube:

谢谢你的答复。

那我应该怎么做。如果我删除BuyTicket =>0或任何BuyTicket条件。那么EA就会在每个tick.....,给我带来148的订单结束错误。

我们不知道你想做什么。

如果你一次只想做一笔交易,那么在发送新的订单之前,请检查 是否有未结订单。

如果你只想每个柱子有一笔交易,那么每个柱子只测试一次

如果你想要一个组合条件,就测试这个组合。