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

 
GumRai:

我们不知道你想做什么

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

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

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

我在这里解释一下。

我在每个小时内最多有6个支持和6个阻力。它可以是2个支持和2个阻力或任何东西,但每小时最多有6个支持和6个阻力。

我想在每小时开始时在这些S/R水平上开限价单。

我创建了一个买入功能和一个卖出功能......这样我就不需要为总共12个S/R水平写下相同的买入/卖出代码。

现在,当我使用下面这段代码时。

int SellCall(double SC)
{
   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);
}

它创建了多个相同的订单。

使用了WHRoeder代码。在一个单独的函数中。因为我不能在一个函数中声明函数。

 

你的问题不在于你所发布的函数,你的问题在于调用函数的代码。

很明显,没有检查是否已经下了订单。

 
GumRai:

你的问题不在于你所发布的函数,你的问题在于调用函数的代码。

很明显,没有检查是否已经下了订单

调用函数 的代码(快照)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

如何检查订单是否已经下过了?用buyticket > 0的条件?

 
cashcube:

调用函数的代码(快照)

如何检查订单是否已经下过了?用buyticket > 0的条件?

很难给出建议,因为我不知道你在未触发的订单结束后在做什么,也不知道你是如何管理触发的订单的。

你可以创建一个全局声明的数组(或2个),并存储未结订单的票号。在打开一个新的订单之前,检查与水平相对应的数组元素 的值是否>0。

当然,你也需要检查票号,如果你删除了未触发的订单,将数组元素设置为0。你也可能需要检查订单是否已经关闭,根据你的逻辑,重新设置为0

 
GumRai:

我很难给出建议,因为我不知道你在结束时对未触发的订单做了什么,也不知道你是如何管理触发的订单的。

你可以创建一个全局声明的数组(或2个),并存储未结订单的票号。在打开一个新的订单之前,检查与水平相对应的数组元素的值是否>0。

当然,你也需要检查票号,如果你删除了未触发的订单,将数组元素设置为0。你可能还需要检查订单是否已经关闭,根据你的逻辑,重新设置为0

由于我设置了未触发订单的到期水平,它将在0:59或第59分钟到期。对于触发的订单,SL和TP被设置。

以前我设计的Ea在每个小时都有一个买入或卖出订单,代码很简单。但在这里,它似乎非常困难。

好的,我将尝试按照你说的进行编码。如果出现问题,我将在这里发布。另外,如果你能分享任何计算票数的简单代码例子,那就更好了。

谢谢你的建议。

 

我用下面的代码暂时解决了我的问题,并在小时图上运行它。简单

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Bars是不可靠的(刷新/重新连接可以改变图表上的条数)volume是不可靠的(错过ticks)总是使用时间。新蜡烛 - MQL4论坛
 
WHRoeder:
Bars是不可靠的(刷新/重新连接可以改变图表上的条数)volume是不可靠的(错过ticks)总是使用时间。新蜡烛 - MQL4论坛

谢谢你的代码。我把它加到了Tick功能上。但现在我的EA没有进行任何交易。因为我使用buycall/sell call函数来下挂单。我不能在函数中加入这个功能。

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              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)
{ 
   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);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

有什么想法吗?

 

另外,止损单上 的反向交易也不起作用。

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

在反向代码上有什么亮点吗? 为什么它不能工作?

谢谢你。