任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 501

 

大家好。

请对新建筑中的指标的开头进行评论。我对循环启动感兴趣(如何正确操作)。这里是BolingerBands的代码。对有问题的地方进行评论//它是什么意思,有什么用?

在迄今为止的教程中,一切都是老一套,https://book.mql4.com/ru/samples/icustom

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,pos;
//---
   if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)    //что это значит ?
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMovingBuffer,false);                //что это значит ?
   ArraySetAsSeries(ExtUpperBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtLowerBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtStdDevBuffer,false);                //что это значит ?
   ArraySetAsSeries(close,false);
//--- initial zero
   if(prev_calculated<1)                                  //что это значит ?
     {
      for(i=0; i<InpBandsPeriod; i++)                      //что это значит ?
        {
         ExtMovingBuffer[i]=EMPTY_VALUE;                   //что это значит ?
         ExtUpperBuffer[i]=EMPTY_VALUE;                    //что это значит ?
         ExtLowerBuffer[i]=EMPTY_VALUE;                    //что это значит ?
        }
     }
//--- starting calculation
   if(prev_calculated>1)                                   //что это значит ?
      pos=prev_calculated-1;                               //что это значит ?
   else                                                    //что это значит ?
      pos=0;//что это значит ?
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)          //что это значит ?
     {
      //--- 
      
      //код индикатора в цикле
      
      //---
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
 

并阅读文件?踩着难以理解的表达方式,按下神奇的F1键或在网站上阅读。

https://docs.mql4.com/ru/array/arraysetasseries

https://docs.mql4.com/ru/basis/function/events#oncalculate

 

大家好。请帮助,我搞不清楚状况。

在我的代码中,我需要buf0 在屏幕上被画出来,而buf1 不被画出来,而是被算作进一步的数组处理并输出到另一个缓冲区(例如在buf2)。 我把buf1 隐藏在一个字符串中。

SetIndexBuffer(0,Buf0)。

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1)。

SetIndexBuffer(1,Buf1)。

SetIndexStyle (1,DRAW_NONE); //我想 隐藏 ,这个 行。

但当我设置指标时,由于计算方式不同,我得到了一个偏移...

问题: 有什么方法可以消除这种差异,使buf0 正常绘制?
附加的文件:
testbuf.mq4  2 kb
 
clubsmi:

大家好。请帮助,我搞不清楚状况。

在我的代码中,我需要buf0 在屏幕上被画出来,而buf1 不被画出来,而是被算作进一步的数组处理并输出到另一个缓冲区(例如在buf2)。 我把buf1 隐藏在一个字符串中。

SetIndexBuffer(0,Buf0)。

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1)。

SetIndexBuffer(1,Buf1)。

SetIndexStyle (1,DRAW_NONE); //我想 隐藏 ,这个 行。

但当我设置指标时,由于计算方式不同,我得到了一个偏移...

问题: 有什么方法可以消除这种差异,使buf0 正常绘制?

阅读关于 INDICATOR_DATA 和 INDICATOR_CALCULATIONS

在这之前,请阅读#property indicator_buffers and IndicatorBuffers(10); 10是来自我的指标,我没有删除它,以显示不受限制的缓冲区数量,如在ME 509构建中。

 
我经常按F1,但对于一个弱小的程序员来说,事情并不总是很清楚。例子 -ArraySetAsSeries -> 为指定的动态数组对象 设置AS_SERIES标志,数组元素将被作为时间序列 的索引。

参数

阵列[]

[in][out] 要设置的数字阵列。

旗帜

[in] 阵列的索引方向。

返回的值

如果成功返回true,否则返回false。

但是,什么给和它将是for(i=0; i<InpBandsPeriod; i++) 和for(i=InpBandsPeriod; i<0; i--) .真和假是否会反映在循环中。这在Build 5xx中是不存在的。也许没有 ArraySetAsSeries也是可以的 但那样的话默认会是什么也可能你不知道。

 

感谢AlexeyVik,解决了这个问题......。

谁能告诉我509版本的旧mql4语言能持续多久?有必要从新版本中匆忙学习语言吗?

 
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

kim的功能不工作...

if(IsNewBar()==true)
{
if(ExistPositions(NULL,-1,44444,-1)==false)
           {
       
                  trade=true;
                         
            if(trade!=false)
              {
                    
                        OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point,44444);

                        trade=false;
                       }
                   
      }
  }            
       }   

如果没有更多带有向导..... 的头寸,该头寸 就应该打开,但它们在每一个新的条形图上都会以我......。

 
Zver4991:


kim的功能不工作...

如果没有更多带有向导..... 的头寸,该头寸就应该打开,但它们在每一个新的条形图上都会以我......。


看看这个 OT-开放时间(0-任何开放时间),你呢?

 
gince:


看看这个 OT-开放时间(0-任何开放时间),你呢?

以及为什么

trade=true;if(trade!=false) .......
                          

如果没有打开,就打开

 
gince:


看看这个 OT--开放时间(0--任何开放时间),你呢?


因此,它应该检查是否 这样的魔法,无论什么时候打开.....,对魔法的简单限制....toest。

如果(ExistPositions(NULL,-1,44444,-1)==false)//如果没有这个神奇数字的未结头寸,则检查......

....,也许我不明白....,我有-1,因为我不关心头寸何时开仓.....,反正它只在新的交易栏和旧的交易栏关闭时开仓,因为条件规定,只有在没有这个神奇数字的开仓头寸时才能开仓。

让它变得更简单:开仓并等待,直到它关闭....。当它关闭,然后再次打开,当然不应该在每个酒吧打开一个与这个魔术师....,它是再次检查的条件,看看是否有这个魔术师的开放位置。