[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 323

 

这就是所发生的事情。

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                           // Счётчик идущих друг за другом свечей с..
       cntDn,                                                                           // .. требуемыми признаками
       t;                                                                               // Счётчик всех просчитанных баров
       
   for (int i=i_AnyBarsToHistory; i>=1; i--, t++)
   {
      if (directionMA == CROSS_UP)                                                      // Если машки направлены вверх
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                   // .. прибавим 1 к счётчику
         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                 // .. счётчик обнуляем
                                                                                        
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);

         if (t == i_AnyBarsToHistory)
         {
             if (cntDn == i_sequentBarsСount)                                                // Если cnt баров в подряд медвежьи..
                 return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                     // .. Выходим из функции
         }
      }

      if (directionMA == CROSS_DN)                                                      // Если машки направлены вниз
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                   // .. прибавим 1 к счётчику
         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                 // .. счётчик обнуляем
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

         if (t == i_AnyBarsToHistory)
         {
             if (cntUp == i_sequentBarsСount)                                                // Если cnt баров в подряд бычьи..
                 return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                     // .. Выходим из функции
         }
      }
      return (REQUIRED_SEQUENTIAL_MISS);
   }
}

事实上,甚至连一行都没有打印。

Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

因此,上述情况可能存在某种错误。

最有趣的是,一旦我在这里添加了一个默认的返回,它就不知不觉地一直在工作。我是说那根绳子。

return (REQUIRED_SEQUENTIAL_MISS);

虽然很明显,代码是基本的,那里不可能有任何错误。

 

向大家问好!亲爱的大师们,您能告诉我为什么当利润增加和减少时,存款货币 的v_s会增加和减少?

value_profit()是以存款货币计算的利润。

double value_stop,value_step;
value_stop=((AccountBalance()/100)*1)。
value_step=((AccountBalance()/100)*4)。
双重v_s。
如果(value_profit()>=(value_step+value_stop))
for (int v=1;v<=100;v++)
{
如果(value_profit()>=(value_step+(value_stop*v))
{
v_s=value_stop*v;
}
否则
{
如果(value_profit()<=v_s)
close_all()。
}
}
 
hoz:

事实上,甚至连一行都没有打印。

1.为什么要一次完全做模块化?当然,每个人都有自己的风格,但我首先会打磨紧凑的版本,然后,当它像时钟一样工作时,再把它转移到模块化。紧凑型变体(没有插入函数Trade、LastCandlesType、GetStateOfMA、GetGeneralSignal)在上一页作为start()内部的变体显示。它是如何为你工作的?如果可行,那就把它拆成模块。

2.在我看来,这段代码与之前的代码完全相同,因为t计数器的变化与i计数器绝对平行。如果你能与i比较,为什么还要与t比较呢?而且,按照逻辑进一步发展,那么如果我们的代码没有工作,为什么要与i进行比较?

3.抱歉打扰了,但这种将输出从循环中取出的变体如何运作?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

我明白这可能也不行,不管怎样,但我需要确定一下,以便进一步弄清楚。

4.纯粹是我的个人改编:不在元编辑器中输入代码,而是在其他任何有编号的编辑器中输入代码,并在同一行中(最后一个分号之后),在任何变量的每一个变化和每一个if或switch检查中打印。在行号中打印 - 要检查的值。在 if(tracing) {Print(StringConcatenate("line_number: variable_name=", variable_name));}后打印,并在页眉处声明一个变量,如: bool tracing=false;//enable tracing。在这种情况下,你将有一个完整的跟踪,因此也有完整的调试。但你必须更经常地清理日志,当然。如果你打算直接使用元编辑器,你可以先做一个空的模板,如

/*001*/

...

/*999*/

在行的开头(并且它是有效的),然后在这个模板的副本中输入代码。但这只是我的想法,在实践中我是这样尝试的,但我的尝试并不一致。

 
rajak:

向大家问好!亲爱的大师们,您能告诉我为什么当利润增加和减少时,存款货币的v_s会增加和减少?

value_profit()是以存款货币计算的利润。

double value_stop,value_step;
value_stop=((AccountBalance()/100)*1)。
value_step=((AccountBalance()/100)*4)。
双重v_s。
如果(value_profit()>=(value_step+value_stop))
for (int v=1;v<=100;v++)
{
如果(value_profit()>=(value_step+(value_stop*v))
{
v_s=value_stop*v;
}
否则
{
如果(value_profit()<=v_s)
close_all()。
}
}
在快速查看之后,我立即看到了一个倒装逗号的错误。教授如何使用if 语句。
 
gyfto:

3.对不起,我想打听一下,但你毕竟是如何把输出从循环中取出来的?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

嗯,成功了。我在视觉上运行了几个 "屏幕",在这个区间一切都很清楚。我仍然需要了解为什么上次没能成功。这对避免将来被绊倒很有帮助。
 
hoz:

嗯,它正在工作。


Glad))))

hoz:

仍然需要弄清楚为什么上次没有成功。这对避免将来被绊倒很有帮助。

因为在未来,在你到达Close[0]或任何其他算法中的窗口边界之前,不要为退出。这不是同时。

 
gyfto:

1.为什么要一下子做模块化?当然,每个人都有自己的风格,但我首先会擦亮紧凑的版本,然后,当它像时钟一样工作时,把它切换到模块化。紧凑的变体(没有插入函数Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal)在最后一页作为start()内部的变体给出。它是如何为你工作的?如果可行,那就把它分成几个模块。

实际上,我已经习惯于这样写了。而且更容易寻找到错误。因为我一下子就知道,错误出在LastCandlesType() 函数中。但我还没有找到原因,虽然你的方法可行。

gyfto:

2.在我看来,这段代码与之前的代码完全相同,因为t计数器的变化与i计数器绝对平行。如果你能与i比较,为什么还要与t比较呢?而且,按照逻辑进一步发展,那么如果我们的代码没有工作,为什么要与i进行比较?

写得太晚了,......道德负担过重,我想。

gyfto:

我明白,它也可能不起作用,不管怎样,但我需要确保它起作用,以便进一步了解它。

它是有效的!尚待理解的是为什么那段代码没有发挥作用。引起我注意的第一件事是,当计数器达到i_seqqtBarstCounter这个值时,就退出这个函数。但是,我再次打印,计数器的值一直只显示1,当我把函数return(REQUIRED_SEQUENTIAL_MISS)默认退出时

在我放置它之前,一切都计算正确,但猫头鹰的交易并不正确。根本就没有什么事情发生。虽然从理论上讲,如果默认输出上面的条件没有一个起作用,这意味着没有一个条件被触发,即使我们把默认输出放在条件中,也不应该起作用。反过来说,如果条件成立,它就应该成立。


gyfto:

4.纯粹是我的个人改编:不在元编辑器中输入代码,而是在任何其他有行号的编辑器中输入,在任何变量的每一次变化和每一次if或switch检查时,在同一行(最后一个分号之后)打印。在行号中打印 - 要检查的值。在 if(tracing) {Print(StringConcatenate("line_number: variable_name=", variable_name));}后打印,并在页眉处声明一个变量,如: bool tracing=false;//enable tracing。在这种情况下,你将有一个完整的跟踪,因此也有完整的调试。但你必须更经常地清理日志,当然。如果你打算直接使用元编辑器,你可以先做一个空的模板,如

/*001*/

...

/*999*/

在行的开头(并且它是有效的),然后在这个模板的副本中输入代码。但这只是我的想法,在实践中我是这样尝试的,但我的尝试并不一致。


那么,我们是根据专家顾问的数据来打印的,而不是根据行数。为什么你需要行号?我个人使用它进行代码分析,因为那里有真正方便的时刻。但依靠行号来编写和调试代码对我来说是无稽之谈。
 
hoz:

这段代码为什么没有发挥作用,还有待观察。


我自己想出来的办法。我们读出了挡板的交叉点。更准确地说,在任何时刻交叉后的三个看涨或看跌的烛台。当条件得到满足时,我们进入市场。但从口头描述来看,这三个或更多的烛台一字排开,属于窗口的右边界。根据你的代码,他们可以指的是窗口的中间。因此,当达到条件(三个蜡烛图)时,专家顾问已经进入市场,而最后一个蜡烛图可以不是最后一个。
 
gyfto:

正如我自己想出来的那样。我们读到了熊的交集。更确切地说,三个看涨或看跌的烛台在任何时刻交叉后。当条件得到满足时,我们就进入市场。但从口头描述来看,这三个或更多的烛台一字排开,属于窗口的右边界。根据你的代码,它们可以指代窗口的中间。因此,EA将在条件(三根蜡烛)达到时进入市场,但最后一根蜡烛可能不是最后一根。


结论如下:知道了语法,我们还必须注意逻辑。这一点非常重要。我只是在那里犯了一个逻辑错误。

这似乎很简单,但我被一些东西挂住了,没有马上明白。呀。它发生了...:(

 

下午好!

我的问题会有点离题。

请告诉我,是否有可能在某处找到将TA的形状切成CSV文件的方法?我可以使用txt、xls或任何其他可以用程序处理的格式。

在各种TA文章、教科书中都有TA人物的例子,当然是作为普通图片。有没有人在H1-H4期间保存了或多或少的大套TA符号作为一些货币对的历史片段,例如?

我上网搜索了一下,没有找到。当然,我们可以手动浏览历史,标记形状,将这段历史导出为.csv;重复所需的次数,最后收集形状基础。但如果有人已经做过了,希望能节省时间。

提前感谢 :)