检查蜡烛是否打开 - 页 4

 
GumRai:

这是个小变化,因为它正在检查关闭一个没有的订单。

根据代码,没有理由在买入结束后立即打开卖出。

退出买入的条件与打开卖出的条件是不一样的。

请记住,由于你只检查蜡烛的开盘情况,Close[0]将是该蜡烛的第一个刻度的买入值。

嘿,GumRai。

我想知道你是否能够/愿意在我的代码上多帮我一点?如果你能告诉我,我应该研究哪些代码,我会先自己尝试编码,然后有什么问题再来找你。

我想要的是,一旦进行交易,它将止损 放在,比如,50点(这是它现在做的)。然而,一旦价格向交易方向移动60点,它就会将止损移到收支平衡点,再往后就会变成距离交易70点的拖曳止损。

我怎样才能做到这一点呢?像往常一样,我们将非常感谢任何帮助。

 

对于收支平衡,我总是把SL移到至少收支平衡+1点。这就避免了在以后的检查中可能出现的比较双倍的问题。

这只是一个检查2个条件的案例(对于买入)。

OrderOpenPrice()>OrderStopLoss()

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

然后修改订单,使止损点为开盘价+1点或你可能决定锁定的任何金额。

对于卖出来说,它是相反的条件,但你也应该编写代码,以考虑到如果SL最初是0。

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0 
 
GumRai:

对于收支平衡,我总是把SL移到至少收支平衡+1点。这就避免了在以后的检查中可能出现的比较双倍的问题。

这只是一个检查2个条件的案例(对于买入)。

然后修改订单,使止损点为开盘价+1点或你可能决定锁定的任何金额。

对于卖出来说,它是相反的条件,但你也应该编写代码,以考虑到如果SL最初是0。

非常感谢。事实上,我所要做的是增加足够的点数,以便它刚好(大致)覆盖交易的经纪费用。

对于第二行......我为什么要使用Orderclose价格-OrderOpenPrice?我不太理解这段代码。我不是应该使用 "买入价-订单开盘价 "吗,因为这样可以跟踪价格的变化情况?

我在这里做的事和下面的事接近吗?

 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

我已经把上面的佣金作为一个外部声明。而且我用Bid代替了。

编辑。

所以我猜(根据我在下面发现的),我在上面发布的代码是不正确的?我在MQL4的书/帮助中发现了以下内容......它似乎只是一个追踪止损,而我需要的是首先是一个平衡止损,然后是追踪止损。我怎样才能修改这个?

 int TrailingStop = 50;
               //--- modifies Stop Loss price for buy order 
            if(TrailingStop>0)
               {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  bool res =OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrNONE);
                   if(!res)
                        Print("Error in OrderModify. Error code=",GetLastError());
                     else
                        Print("Order modified successfully.");
                    }
                 }
                 }
 
 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

你的整个代码块是以BuyTicket==-为条件的。

如果订单被打开,那么BuyTicket不会=-1,所以在交易打开的时候,不会对移动到BE进行检查

if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))

票号与价格有什么关系?

必须 在使用OrderOpenPrice()之前选择一个订单

OrderClosePrice()是选择买入订单时的买入价,卖出订单时的卖出价(当订单仍处于开放状态)。

 
SharkWaters:

所以我猜(根据我发现的以下情况),我上面发布的代码是不正确的?我在MQL4的书/帮助中发现了以下内容......它似乎只是一个追踪止损,而我需要的是首先是一个平衡止损,然后是追踪止损。我怎样才能修改这个?

  int BreakEvenPoints=50;
  double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order 
  if(BreakEvenPoints>0)
  {
   OrderSelect(BuyTicket,SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>BE_Decimal)
     {
      if(OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
                              OrderTakeProfit(),0,clrNONE);
         if(!res)
            Print("Error in OrderModify to BE. Error code=",GetLastError());
         else
            Print("Order modified to BE successfully.");
        }
     }
  }
试试这个
 
GumRai:
试试这个

谢谢你的点拨!我已经做了必要的修改。当我编译时,它显示了一个警告:"应检查'OrderSelect'的返回值。奇怪的是,这意味着只有一个买入被触发,其余的又是一个4108错误代码。卖出工作正常(我没有对其进行任何修改)。

这是买入代码的整个部分,以防我做错了什么--但这部分不应该是,因为我所添加的只是中间的这段代码。其余部分和以前一样,工作得非常好。我在这里犯了什么错?

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(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                 }
              }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }
        

更新。

我又在网上搜索了一下,把它改成了以下内容。

int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
               {
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                  }  
                 }
              }


这消除了我点击编译时产生的错误。但它仍然在日志中产生OrderModify错误4108。

 

你所有的代码都包含在if条件中

 if(bar_time!=Time[0])  

所以它只在每个新条形图上执行一次。

 

当BuyTicket == -1时,你是想选择票号为-1的订单,当然它不存在。

在尝试选择订单之前,请检查 BuyTicket是否>0

 
GumRai:

你所有的代码都包含在if条件中

所以它只在每个新柱子上执行一次。


谢谢你指出这一点。

因此,我在顶部创建了一个额外的括号,就在Start之后,像这样。

int start() 
{
{

然后关闭了一个括号(它结束了整个if(bar_time!=Time[0]) 部分,然后将代码放在最后,后面是一个回车(0);和结束括号来结束start()。

无论是代码还是回测 日志都没有错误,但它只进行了一次买入交易,仅此而已--那也是在开盘时关闭的,尽管价格没有比开盘时高多少--更不用说移动50点了。

我想这可能与你提到的BuyTicket == -1有关。但说实话,我不知道如何去改变它。我根据你对初始代码的建议把-1的东西放进去了--这非常有效。但我如何在选择订单前检查BuyTicket是否为0?

 
SharkWaters:

但我如何在选择订单之前检查BuyTicket>0?

很抱歉,如果你非要问这个问题,那么你想写的代码对你的知识水平来说太复杂了。

我不能为你一次写一点的代码。