初学者的问题 MQL5 MT5 MetaTrader 5 - 页 441

 

你能告诉我我做错了什么吗?

我需要计算自价格最后一次穿越MA以来已经过去了多少个柱子 - 不包括零柱。

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i!=1000 || Stop!=1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

 
-Aleks-:

你能告诉我我做错了什么吗?

你需要--计算自价格最后一次越过MA以来已经过去了多少个柱子--不包括零柱。

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i<1000 || Stop==1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

据我所知,一旦你确定了交叉点并设置了stop=1,就会立即退出循环。好的,那么你需要更进一步,记住发生交叉的蜡烛的编号。I.e.

自己写比较容易。

for( int i = 1; i < 1000; i++ )
{
 iMaValue = ...;   // Значение МА на i свече
 if( iMaValue < High[ i ] && iMaValue > low[ i ] )
 {
  num = i;   // Запоминаем номер свечи, на котором произошло пересечение
  break;     // Выходим из цикла
 }
}

这是你已经确定了蜡烛的数量。如果这个数字=2,并且不考虑当前的,那么自交叉的一个蜡烛就形成了(或者随你的意思解释)。

 
Tapochun:

据我所知,一旦你确定了交叉点并设置了止损=1,就会有一个立即退出的周期。好的,那么你需要更进一步,记住发生交叉的那根蜡烛的编号。I.e.

自己写比较容易。

这是你已经确定了蜡烛的数量。如果数字=2并忽略当前的数字,那么自交叉点以来已经形成了一根蜡烛(好吧,或者随你怎么解释)。

谢谢你,这就是我的工作方式。


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

 
alph:
你能告诉我这是否是一个现实的试验品数字?而一年下来,3000元的去势,结果是好是坏呢?
答案很简单:如果你在测试一个EA,测试者的表现并不真实。策略测试仪 被交易者用来检查ATC的性能,或在线测试手动策略。
 
-Aleks-:

谢谢你,我就是这么做的。


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

你不应该这样写,因为如果在最后1000个小节期间没有交叉,首先,循环将继续,其次,它可能会循环/出错,因为如果故事结束,没有交叉,将没有循环的出口,因为停止=0。按照我上面提到的方式写会更好。

 
Tapochun:

你不应该这样写,因为如果在最后1000个柱子期间没有交叉,首先,循环将继续,其次,它可能会循环/出错,因为如果故事结束,没有交叉发生,将没有循环的出口,因为停止=0。按照我上面提到的方式写会更好。

or "符号不起作用--根据表达式,循环要么结束1000条,要么在找到所需结果后立即终止。还是在1000个柱子之前就结束了,如果出现所需的结果,即MA交叉?
 
-Aleks-:
"或 "字符号不起作用吗--条件中说,要么达到1000条,要么在找到所需结果后立即结束。还是在1000条之前就结束了,如果达到预期的结果,即穿越MA?
||意味着如果括号中的至少一个条件为真,循环将重复进行。 因此,即使当i>=1000,但stop=0时,循环将继续进行,i将不断增加,这将导致不正确的MA值(万一它超出历史值)。而break操作符 则负责在找到所需结果时终止循环。
 
Tapochun:
||意味着如果括号内的条件中至少有一个为真,循环将被重复,因此,即使当i>=1000,但stop=0时,循环将继续,i将继续递增,这将导致错误的MA值(如果历史上有一个异常值)。而break操作符 负责在找到所需结果时终止循环。
明白了,谢谢你的澄清!我以为其中一个条件会出错,然后循环就会停止......。
 

你好2015.09.19_02:13AM MSC。反正在ArrayResize()函数 中,编译器写道

与数组的大小相反 -- 无论你是否写int,都要用逗号。如果你不写int,它就会说:"-。

我已经改变了它,没有类型。我删除了&参考和方括号--它成功了!
警告:当它被正常写入时,--编译器写道:隐藏标识符

全局级别的声明。而当我在全局层面上删除标识符声明时,--写道

它写道:"错误,未声明的标识符。而我把数组High[]和Low[]改为HighP[]和LowP[]。不是

帮助。编译器写的是同样的东西。02:27 MSC.我附上一个屏幕截图文件。

附加的文件:
 
Николай Никитюк:

你好2015.09.19_02:13AM MSC。反正在ArrayResize()函数 中,编译器写道

与数组的大小相反 -- 无论你是否写int,都要用逗号。如果你不写int,它就会说:"-。

"没有类型。我还删除了&参考和方括号--这很有帮助!
警告:当它被正常写入时,--编译器写道:隐藏标识符

全局级别的声明。而当我在全局层面上删除标识符声明时,--写道

它写道:"错误,未声明的标识符。而我把数组High[]和Low[]改为HighP[]和LowP[]。不是

帮助。编译器写的是同样的东西。02:27 MSC.我将截图文件附在后面。

  1. 图片应该像这样插入:论坛:如何插入图片
  2. 你根本不看你被建议的内容吗?

    关于交易、自动交易系统和策略测试的论坛

    初学者的问题

    Karputov Vladimir, 2015.09.17 18:46

    1. ArrayResize 的拼写错误。应该是这样。
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. 而为数组设置时间序列标志会是这样的。
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);