检查蜡烛是否打开

 

嗨,伙计们。

我是在mql4中编码的新手,并且一直试图让我的第一个EA工作。老实说,我希望得到以下方面的帮助。这只是一个基本的交叉交易,但不是移动平均线交叉,而是价格越过移动平均线。

我需要一个订单在蜡烛开盘 时被触发,如果。(当前蜡烛开盘价 大于移动平均线),并且如果(前一根蜡烛收盘价低于移动平均线)。

到目前为止,我在主区域有以下代码。


//+------------------------------------------------------------------+

int start()

{

//---

double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);

double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);

double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);

double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);

double PreviousPriceClose= iClose(NULL, 0, 1);

double CurrentCandleOpen= iOpen(NULL,0,0);

//----------------------,主要计算从这里开始


如果(PreviousPriceClose<PreviousSlow && (CurrentCandleOpen>(CurrentSlow)))

如果(OrdersTotal() == 0)

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0, clrLimeGreen);

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

return(0);

return(0);

}

//+------------------------------------------------------------------+

无论我做什么,我似乎都不能工作,我认为我在这里做的事情不对。再次,我真的很感谢你的帮助

 
    

  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);   

这个值在当前的蜡烛中是变化的

double CurrentCandleOpen= iOpen(NULL,0,0);

这不是

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);

CurrentCandleOpen不太可能是许多点的有效入场价格

如果你必须使用这个逻辑,只在一个新条形图打开时计算一次。

如果OrderSend失败,检查 返回值

 
GumRai:

这个值在当前的蜡烛中是变化的

这不是

CurrentCandleOpen不太可能是许多点的有效入场价格

如果你必须使用这个逻辑,只在一个新条形图打开时计算一次。

如果OrderSend失败,请检查返回值


谢谢你的快速回复让我看看我的理解是否正确。

  1. CurrentSlow不会真正发挥作用,因为它仍在形成。好的,这很好,我可以使用为前一根蜡烛形成的移动平均线 的值。这不应该是个问题。
  2. 既然CurrentCandleOpen不是一个移动值......那么我假设代码的这一部分是正确的?
  3. 我怎样才能使其工作,使其与CandleOpen足够接近?--你提到只在新条形图打开时计算一次。能否请你详细说明一下?我不太知道该怎么做。
再次感谢GumRai。

 
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      //Code to process the signal
     }

   
大括号 内的代码将只在新条形图的第一个刻度处执行
 
GumRai:
大括号内的代码只在新条形图的第一个刻度处执行。

谢谢你的代码!我按照之前的讨论更新了以下内容。

  1. 将MA的当前慢速改为先前慢速。
  2. 删除了 CurrentCandleOpen与Ask。每当我使用CurrentCandleOpen,而不是Ask时,它没有进行任何交易。然而,当我用Ask代替它时,它起作用了,但当然是在Ask越过MA时进行交易,而不是在Candle Open时。

但是在这之后,当我把它放在你的代码中,如下所示,它又没有进行任何交易。我是否正确地插入了这个?

int start()
  {
//---
    
  double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);     //1 at the end signifies that we want it on candle close

  double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);     //1 at the end signifies that we want it on candle close
   
  double PreviousPriceClose= iClose(NULL, 0, 1);
  double CurrentPriceClose= iOpen(NULL, 0, 0);
  
//----------------------Main calculation starts here

 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
   if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow)
      if(OrdersTotal () == 0)
         BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
   }
//--------------
   return(0);
   return(0);
  }
 

为什么把iMA调用放在新的条形码之外?这意味着在不需要的情况下,它们每一次都 被调用,效率很低。

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if(PreviousPriceClose<PreviousSlow && Bid>PreviousSlow)
         if(OrdersTotal()==0)
            {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
            if(BuyTicket==-1)
               {
               //Error checking code
               }
     }

不要使用Ask来比较MT4图表上的数值,它们是基于Bid价格的。

如果OrderSend失败,检查是否有错误。

你可能不会得到很多新条形图的第一个刻度在MA之上的情况,而前一个条形图的最后一个刻度是在MA之下。

 

非常感谢你,GumRai。我真诚地 感谢你的帮助。

你的代码工作得非常好。我仍在努力学习这里的绳索,并看到iMA被单独放在它自己的位置上。我将按照你的方法来做。

***打自己的头***。

我将重新编写我的代码。你的最后一句话指出了我想要的东西和我实际编码中的缺陷。

我实际需要做的是。

  • 第一步:蜡烛收于MA下方。
  • 第2步:烛光穿过并收于MA之上
  • 第三步:在新的蜡烛开盘时进入交易。

最后一个问题,我想我已经知道了......

对于上面的步骤1,iMA,SlowMaShift将是2,对吗?因为它是后面的2个柱子? 而iClose 将是:iClose(NULL,0,2),以进行比较,对吗?

 

似乎你有这个想法。

修改并发布你的代码,我或其他人会对它进行评论。

 
GumRai:

似乎你有这个想法。

修改并发布你的代码,我或其他人会对它进行评论。

我能够使它工作!谢谢GumRai。
现在我正在做同样的事情,但使用相反的规则来做空。独立运行时很好,但我不知道如何使用OrderCloseBy函数,以便如果多头未平仓,而空头触发时,它主要关闭多头,因为我不知道如何找到订单票。我尝试通过以下方式绕过OrderCloseBy。

int start()
  {
//---
 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1);
      double PreviousSlow2 = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL, 0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
         if(OrdersTotal()==0)
            {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if(OrdersTotal()==1)
         {
            OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink) && OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
                  }
         if(OrdersTotal()==0)
         {
            OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
            }
     }
//--------------
   return(0);
   return(0);
  }
  return(0);
  }
 
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if(OrdersTotal()==1)

不能被满足,因为它是在条件块内。

         if(OrdersTotal()==0)

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
        }
      else
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
        {
         if(OrdersTotal()==1)
           {
            OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink);
            OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
           }
         else
         if(OrdersTotal()==0)
           {
            OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
           }
        }
     }

我认为上面的方法更像你的意图

你应该检查 错误的返回代码

 
GumRai:

我认为上述情况更像你的意图

你应该检查错误的返回代码

谢谢你的代码......不幸的是,并没有真正发挥作用,因为它现在不止一次地进入空头。以下是我尝试做的事情--我把它分开--长线进入和退出,然后我将为短线进入和退出创建相反的方法。这对我来说更容易管理,而且更容易调整。我正在努力先把长线进场和出场部分做好。但不知何故,当蜡烛收于移动平均线以下时,这并没有关闭交易。知道我做错了什么吗?它给出了一个错误。应该检查'OrderClose'的返回值。我在网上搜索了一上午的解决方案,但似乎并不奏效。

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
        }
      else
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow)
        {
          OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink);
          
        }
     

更新:我已经摆脱了错误代码,但关闭票据似乎仍然不工作。我所希望的是,一旦蜡烛越过并收于MA下方,它就关闭买入。