[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 479

 
SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 

我不知道你的逻辑是什么,对我来说,这个设置会画出指标的最后30个柱子

再一次,SetIndexDrawBegin()从图表的左端开始计算条形图

辩前检查

 
merkulov.artem:

好的。我将尝试概述问题的本质,也许有人会建议或帮助以更简单的方式实现它。

我们正在制定一个分钟图。让我们把29/10/12图表上00:00的一分钟柱子(高+低/2-柱子的平均值)--它将是一个参考点。

然后我们检查与此价格向上的偏差10个点(每个正确的偏差是+1)。

当我们达到与起点的10点偏差时--+1计数器;我们开始检查进一步的偏差,但从我们达到10点偏差的地方开始,并等待价格的下一个10点上涨。

例如,我们得到。

如果(起始点)+10点<=价格(我们使用从起始点开始的所有条形的后续价格。)我们得到一个计数器=计数器+1;并且我们已经从这个点-(起始点+10点) 开始起始点。

如果 起始点+10)+10点<=价格(使用从参考点开始的所有后续条形价格),我们得到counter=Counter+1;并且我们从这个点开始-起始点+10)+10点。

如果(起始点+10+10)+10点<=价格(我们使用从参考点开始的所有条形的后续价格。)我们得到counter=Counter+1;并且我们从这个点开始-(起始点+10+ 10点)+10点。

等等...

直到我们达到一个10的计数器(计数器==10)。

每一个新形成的1分钟条形图(高+低/2-条形图的平均值),我们都要检查这个条件,并 等到计数器达到10(计数器==10假设两天过去了,每形成一个新的柱状物,我们就检查并转移,如果条件正确的话.....。

当我们达到counter =10时 - 我们输出 "Counter == 10 "的信息。我们将起点比用户最初定义的点提前2天,即从29/10/12的00:00移动到31/10/12的00:00,并重复循环

重复这个循环,就这样在时间表中移动。

也就是说,我们应该把新形成的条形图画出来(高+低/2-条形图的平均价值)。并检查条件,如果是正确的,就按上述方法移位。

我曾试图通过一个数组来实现它,但它非常混乱,并给出了错误的值请帮助我,如何实现这种算法?


你在这里根本不需要数组。这甚至是一个专家顾问,一个脚本,还是一个指标?问题是,专家顾问的代码将与执行这项任务的指标的代码不同。

而且这里有一个显著的缺点。看,我们已经标记了起点,它就在上升趋势的峰值上。假设我们在进一步获取10个点时不考虑这支蜡烛的读数--让我们称它为起始蜡烛。所以,下一个蜡烛图是向下的,我们没有抓住任何一个水平=起点+10点:价格就会下跌。因此,我们可以说,我们被卡住了很长时间--价格下跌了,而且无论如何都可能上下波动--无论如何都不会达到起点的水平--熊市已经把它压得很紧。但是,假设我们很幸运,在5000根蜡烛之后,价格回到了起点的水平,甚至上升了10点。我们已经浪费了很多时间,但现在我们可以把等于起点+10点的价格放入变量中,等待价格达到=变量水平+10点的水平......。简而言之,我们不需要这些--从你的描述来看,我们正在捕捉的水平=起点+10*10=起点+100点。一旦抓到这个水平,我们就把开始日期移到未来2天,并计算出一个新的起点。这很复杂--有一个更简单的方法。

我们在自定义变量中设置开始日期(代码中前面是extern)。声明一个数据时间类型的变量。假设它是变量dt_StartDate(开始日期),然后在初始化块中,我们给它分配存储在自定义变量中的值。然后我们寻找与此日期相匹配的蜡烛图,用你的公式计算出起点。然而,这不是起点,而是起点的价格水平。声明一个双倍类型的变量,例如d_StartLevel(起始水平),并在该变量中输入计算水平的值。或者可以更简单--不声明变量,而是通过计算的起始价格画一条水平线。让我们称它为StartLevel。现在让我们在图表上画出第二条线,距离=100点,从起始水平往上--让我们称它为OtlovLevel。此外,我们不需要任何数组--在每个tick上,我们将简单地观察价格是否高于OtlovLevel。只要是这样,我们就把dt_StartDate变量的值增加2天,再次计算起始水平,并把起始线移到那里。之后,我们再次从起跑线上取100个点,把OtlovLevel线拖到那里。就这样,任务就解决了。每次我们都可以请求任何线的价格,并与当前价格或当前蜡烛的高价进行比较。

 
midorum:

我不知道你的逻辑是什么,对我来说,这个设置会画出指标的最后30个柱子

再一次,SetIndexDrawBegin()从图表的左端开始计算条形图

在你争论之前,请检查它。

所以我没有争论。下面我们来看看。让我们来看看一个标准的CCI指标。我在SetIndexDrawBegin 函数中用Bars- CCIPeriod)替换了CCIPeriod。我只改变了代码中突出显示的黄色...

下面是代码。

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

在逻辑上,如果CCIPeriod是14。那么SetIndexDrawBegin(0,Bars- CCIPeriod)应该只画最后的14条。它从值(Bar - 14) 开始。但这是我在屏幕上看到的情况

 
hoz:

所以我没有争论。下面我们来看看。以标准的CCI指标为例。我在SetIndexDrawBegin 函数中用Bars- CCIPeriod)替换了CCIPeriod 我只改变了代码中突出显示的黄色...

下面是代码。

在逻辑上,如果CCIPeriod是14。那么SetIndexDrawBegin(0,Bars- CCIPeriod)应该只画最后的14条。它从值(Bar - 14) 开始。但这是我在屏幕上看到的情况

这是我在屏幕上看到的情况

在顶部的本地指标,下面改为SetIndexDrawBegin(0,Bars-CCIPeriod)。

 
midorum,我很抱歉。我的失误。MetaEditor 打开了另一个终端...现在开始工作了。谢谢你!
 
hoz:
midorum,我很抱歉。我的失误。MetaEditor 打开了另一个终端...现在开始工作了。谢谢你!
是的,这也是我一直在努力解决的问题--3个终端,而编辑器会把文件夹弄混。最好是通过终端中的按钮运行,并在其中手动打开文件
 

大家好,请给我一个答案,如何确定15分钟的蜡烛开盘,我用了一个令人匪夷所思的字符串,但事实证明,并不总是蜡烛按时间开盘......我认为有一个更简单的方法来找出蜡烛开盘......但我不明白......

如果((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)| (TimeMinute(TimeCurrent())==15 &&)TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 &&TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 &&TimeSeconds(TimeCurrent())==0)

 
stater:

大家好,请给我一个答案,如何确定15分钟的蜡烛开盘,我用了一个令人匪夷所思的字符串,但事实证明,并不总是蜡烛按时间开盘......我认为有一个更简单的方法来找出蜡烛开盘......但我不明白......

如果((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)| (TimeMinute(TimeCurrent())==15 &&)TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 &&TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 &&TimeSeconds(TimeCurrent())==0)


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater:

大家好,请给我一个答案,如何确定15分钟的蜡烛开盘,我用了一个令人匪夷所思的字符串,但事实证明,并不总是蜡烛按时间开盘......我认为有一个更简单的方法来找出蜡烛开盘......但我不明白......

如果((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)| (TimeMinute(TimeCurrent())==15 &&)TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 &&TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 &&TimeSeconds(TimeCurrent())==0)


bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
当M15上出现一个新条形图 时,该函数返回true
 
Vinin:

当M15上出现一个新条形图时,该函数返回true
非常感谢您!