[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 479 1...472473474475476477478479480481482483484485486...631 新评论 Михаил 2012.10.30 18:52 #4781 SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 我不知道你的逻辑是什么,对我来说,这个设置会画出指标的最后30个柱子再一次,SetIndexDrawBegin()从图表的左端开始计算条形图辩前检查 Владимир Тезис 2012.10.30 19:03 #4782 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线拖到那里。就这样,任务就解决了。每次我们都可以请求任何线的价格,并与当前价格或当前蜡烛的高价进行比较。 Viktar Dzemikhau 2012.10.30 19:11 #4783 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) 开始。但这是我在屏幕上看到的情况 Михаил 2012.10.30 19:21 #4784 hoz:所以我没有争论。下面我们来看看。以标准的CCI指标为例。我在SetIndexDrawBegin 函数中用(Bars- CCIPeriod)替换了CCIPeriod。 我只改变了代码中突出显示的黄色...下面是代码。在逻辑上,如果CCIPeriod是14。那么SetIndexDrawBegin(0,Bars- CCIPeriod)应该只画最后的14条。它从值(Bar - 14) 开始。但这是我在屏幕上看到的情况 这是我在屏幕上看到的情况在顶部的本地指标,下面改为SetIndexDrawBegin(0,Bars-CCIPeriod)。 Viktar Dzemikhau 2012.10.30 19:29 #4785 midorum,我很抱歉。我的失误。MetaEditor 打开了另一个终端...现在开始工作了。谢谢你! Михаил 2012.10.30 19:33 #4786 hoz: midorum,我很抱歉。我的失误。MetaEditor 打开了另一个终端...现在开始工作了。谢谢你! 是的,这也是我一直在努力解决的问题--3个终端,而编辑器会把文件夹弄混。最好是通过终端中的按钮运行,并在其中手动打开文件。 [删除] 2012.10.31 05:26 #4787 大家好,请给我一个答案,如何确定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) PapaYozh 2012.10.31 05:31 #4788 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 Victor Nikolaev 2012.10.31 06:22 #4789 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 [删除] 2012.10.31 06:27 #4790 Vinin: 当M15上出现一个新条形图时,该函数返回true 非常感谢您! 1...472473474475476477478479480481482483484485486...631 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不知道你的逻辑是什么,对我来说,这个设置会画出指标的最后30个柱子
再一次,SetIndexDrawBegin()从图表的左端开始计算条形图
辩前检查
好的。我将尝试概述问题的本质,也许有人会建议或帮助以更简单的方式实现它。
我们正在制定一个分钟图。让我们把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线拖到那里。就这样,任务就解决了。每次我们都可以请求任何线的价格,并与当前价格或当前蜡烛的高价进行比较。
我不知道你的逻辑是什么,对我来说,这个设置会画出指标的最后30个柱子
再一次,SetIndexDrawBegin()从图表的左端开始计算条形图
在你争论之前,请检查它。
所以我没有争论。下面我们来看看。让我们来看看一个标准的CCI指标。我在SetIndexDrawBegin 函数中用(Bars- CCIPeriod)替换了CCIPeriod。我只改变了代码中突出显示的黄色...
下面是代码。
在逻辑上,如果CCIPeriod是14。那么SetIndexDrawBegin(0,Bars- CCIPeriod)应该只画最后的14条。它从值(Bar - 14) 开始。但这是我在屏幕上看到的情况
所以我没有争论。下面我们来看看。以标准的CCI指标为例。我在SetIndexDrawBegin 函数中用(Bars- CCIPeriod)替换了CCIPeriod。 我只改变了代码中突出显示的黄色...
下面是代码。
在逻辑上,如果CCIPeriod是14。那么SetIndexDrawBegin(0,Bars- CCIPeriod)应该只画最后的14条。它从值(Bar - 14) 开始。但这是我在屏幕上看到的情况
这是我在屏幕上看到的情况
在顶部的本地指标,下面改为SetIndexDrawBegin(0,Bars-CCIPeriod)。
midorum,我很抱歉。我的失误。MetaEditor 打开了另一个终端...现在开始工作了。谢谢你!
大家好,请给我一个答案,如何确定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)
大家好,请给我一个答案,如何确定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
大家好,请给我一个答案,如何确定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)
当M15上出现一个新条形图 时,该函数返回true
当M15上出现一个新条形图时,该函数返回true