初学者的问题 MQL4 MT4 MetaTrader 4 - 页 116

 
novichok2018:

谢谢你。休息似乎有帮助。让我们看看接下来会发生什么。

不,它并没有真正的帮助。只有在开出一种仓位的情况下才有效。例如,如果一个卖出头寸被打开但尚未关闭,同时一个买入头寸被打开并关闭,那么卖出头寸就不能看到自己的关闭条件,直到另一个卖出头寸打开并关闭(根据自己的条件)。而如果BAY再次开盘和收盘,它又一次错过了收盘条件。我试图用I.Kim的函数ExistPositions()来确定关闭BAY后是否存在未结头寸,但我不明白在哪里插入,在哪里放置Print来控制执行。任何线索。

 
novichok2018:

不,它并没有真正的帮助。只有在开出相同类型的头寸时才有效。例如,如果首先打开一个卖出头寸,但尚未关闭,同时打开并关闭一个买入头寸,那么卖出头寸不会看到其关闭条件,直到另一个卖出头寸打开并关闭(根据其条件)。而如果BAY再次开盘和收盘,它又一次错过了收盘条件。我试图用I.Kim的函数ExistPositions()来确定关闭BAY后是否存在未结头寸,但我不明白在哪里插入,在哪里放置Print来控制执行。你能给我一个提示吗?

难道没有人知道解决办法吗?我不知道。

 
novichok2018: 难道没有人知道解决办法吗?我不知道。

我登录了论坛--我看到你在自言自语......。你的谈话在哪里开始,它是关于什么的--很难理解。要调试一个程序,使用Alert 而不是Print要方便得多--它一次就能显示在屏幕上。这些警报是在检查if条件之前放置的。另一种用铅笔调试的方法--按照程序应该执行的样子去看,并写下变量的值。当它发生变化时--划掉旧值并写上新值。这就是以前的做法。现在,MetaEditor有一个调试器,可以监控变量的值。最简单的结构应该通过编写脚本来单独检查

 
novichok2018:

难道没有人知道解决办法吗?我不知道。

这样试试吧。

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
iCustom的数据是从哪里来的?
 
Igor Makanu:

这样试试吧。

谢谢,试过了--即使经过一些调整,也没有关闭任何位置,所以编译器并没有发誓。

 
STARIJ:

我登录了论坛--我看到你在自言自语......。很难理解你从哪里开始,你在说什么。对于程序调试来说,使用Alert 而不是Print更方便--它可以在屏幕上一次性显示出来。这些Alert被放置在if条件被检查之前。另一种用铅笔调试的方法--按照程序应该执行的样子去看,并写下变量的值。当它发生变化时--划掉旧值并写上新值。这就是以前的做法。现在,MetaEditor有一个调试器,可以监控变量的值。最简单的结构必须通过编写脚本来单独检查

谢谢你的建议,但对于我的情况来说,这些建议并不十分正确。只是为了澄清,下面是一个自定义关闭函数的代码

 

它不能正常工作--平仓在第一个开仓的条件下发生的也就是说,如果先用条件1开了一个买入或卖出头寸,然后用条件2开了第二个头寸,那么平仓条件就会被忽略,第二个头寸也会用条件1平仓,尽管魔法数字不同。

我在订单关闭后申请了中断,但解决方案一直是半信半疑:只有在同一类型的一个仓位被打开的情况下例如,如果一个BOY头寸先被打开,还没有被关闭,而一个BAY头寸正在被打开和关闭,只要另一个BAY头寸打开和关闭(按照其条件),BAY头寸就不会看到任何关闭的条件。而如果BAY再次开盘和收盘,它又一次错过了收盘条件。那么该怎么做呢?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
iCustom的数据是从哪里来的?

自定义指标的 缓冲区,实践中,例如在MA

novichok2018

我在关闭订单后应用了断裂法,但解决方案是半途而废:只有在同一类型的一个头寸被打开的情况下例如,如果一个BOY头寸被打开,还没有被关闭,而一个BAY头寸正在被打开和关闭,BAY头寸看不到任何关闭的条件,直到另一个BAY头寸被打开和关闭(在它自己的条件下)。而如果BAY再次开盘和收盘,它又一次错过了收盘条件。那么该怎么做呢?

试着用 "继续 "代替 "中断"。

很奇怪,我的代码例子没有关闭任何东西,也许是关于价格规范化的问题。

 
Igor Makanu:


试着用 "继续 "代替 "中断"。


被替换。受诅咒的错误138(重新报价)。然后我又给打破了,又是138。很奇怪,也许我以前没有注意到这一点。

 
Igor Makanu:

自定义指标的 缓冲区,用MA进行练习,例如


这是来自终端数据窗口中出现的字段吗?