新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 804

 
Andrey Sokolov:

你能告诉我条目中的意思吗?

int i,limit=prev_calculated==0 ?rates_total-1 : rates_total-prev_calculated;

"==" , "?", ": "

?

Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
  • www.mql5.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 
这实在是太可怕了!如果我还能追踪专家顾问中的逻辑,纠正一些东西,增加一些...我完全不明白指标的代码(
 
prom18:

谢谢你,伊戈尔。我没有正确地制定它。该指标的计算和绘制是以指定的条数(本例中为50)为单位,在一个单独的窗口中进行。它需要的不是开盘价,而是当天的第一根柱子来指示MA。但无论如何,谢谢你。

读取SetIndexDrawBegin() - 这是对绘制指标缓冲区的一个限制,从未使用过。

或者在我的例子中,你可以这样做。

input int BarCount = 50;
....

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,limit;
   static double dayopen=0.0;
   static int lastday=0;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      dayopen=0.0;
      lastday=0;
     }
   else limit=rates_total-prev_calculated;
   limit = fmin(BarCount,limit);
   for(i=limit; i>=0; i--)
     {
      if(TimeDay(time[i])!=lastday)
        {
         dayopen=open[i];
         lastday= TimeDay(time[i]);
        }
      Label1Buffer[i]=dayopen;
     }
   return(rates_total);
  }

也就是说,将指标缓冲区的计算限制在BarCount 设置上

 
Andrey Sokolov:

你能告诉我条目中的意思吗?

int i,limit=prev_calculated==0 ?rates_total-1 : rates_total-prev_calculated;

"==" , "?", ": "

?

https://docs.mql4.com/ru/basis/operators/ternary


我重写了我的例子,在第一个版本中,当切换TF时,它不能正确工作,你需要重置dayopen和lastday,它们是用修改器static描述的。

Условный оператор ?: - Операторы - Основы языка - Справочник MQL4
Условный оператор ?: - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 
Artyom Trishkin:

同时返回通过引用传递的函数参数中的索引

归还了。

double GetPatt5barsDN()
{
double low3 = 0;
int index = 0。
for(int i=1; i<20; i++)
{
如果
((Close[i] > Open[i]) &&
(Close[i+1] > Open[i+1]) &&
(Close[i+2] > Open[i+2]) && //Low[i+2] 在这根蜡烛上需要。
(Close[i+3] < Open[i+3]) &&
(Close[i+4] < Open[i+4])

low3 = Low[i+2];
index = i+2。
}

return(low3);
return(index)。
}


我接下来应该做什么?

 
Sfinks35:

归还了。

double GetPatt5barsDN()
{
double low3 = 0;
int index = 0。
for(int i=1; i<20; i++)
{
如果
((Close[i] > Open[i]) &&
(Close[i+1] > Open[i+1]) &&
(Close[i+2] > Open[i+2]) && //Low[i+2] 在这根蜡烛上需要。
(Close[i+3] < Open[i+3]) &&
(Close[i+4] < Open[i+4])

low3 = Low[i+2];
index = i+2。
}

return(low3);
return(index)。
}


我接下来应该做什么?

这是不可能拿回来的。


像这样。

int GetPatt5barsDN()
      {
       double low3 = 0;
       int index = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) &&  
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) &&  
            (Close[i+4] < Open[i+4]))
             
            low3 = Low[i+2];
            index = i+2;
          } 
           
          return(index);
      }


更多

double min = Low[GetPatt5barsDN()];
 
Sfinks35:

归还了。

double GetPatt5barsDN()
{
double low3 = 0;
int index = 0。
for(int i=1; i<20; i++)
{
如果
((Close[i] > Open[i]) &&
(Close[i+1] > Open[i+1]) &&
(Close[i+2] > Open[i+2]) && //Low[i+2] 在这根蜡烛上需要。
(Close[i+3] < Open[i+3]) &&
(Close[i+4] < Open[i+4])

low3 = Low[i+2];
index = i+2。
}

return(low3);
return(index)。
}


我接下来应该做什么?

通过参考参数返回的指数在哪里?

并请正确插入代码。


 
在MQL4中是否有一个功能可以检测出报价是小数点后5位还是4位,一个资产有多少个小数点,例如EURJPY有2位小数,EURUSD有4位小数?
 
Seric29:
在MQL4中是否有一个功能可以从账户类型中识别报价,比如小数点后5位或4位,有什么方法可以识别资产在小数点后有几个零,例如EURJPY有2个小数点,EURUSD有4个小数点?

https://docs.mql4.com/ru/predefined/digitsvar

Digits - Предопределенные переменные - Справочник MQL4
Digits - Предопределенные переменные - Справочник MQL4
  • docs.mql4.com
Digits - Предопределенные переменные - Справочник MQL4
 
Artyom Trishkin:

通过参考参数返回的指数在哪里?

并请正确插入代码。


下午好!
我现在似乎已经得到了它。
double GetPatt5barsDN(int &index)
      {
       double low3 = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) &&  
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) &&  
            (Close[i+4] < Open[i+4]))
             
            low3 = Low[i+2];
            index = i+2;
          }           
     return(low3);
     }

但在编译时,它产生了一个警告:由于行内的类型转换,可能会造成数据的丢失
index = GetPatt5barsDN(index);

double low3 = 0;
   int index = 0;
   low3 = GetPatt5barsDN(index);
   index = GetPatt5barsDN(index);
   Print("low3= ", low3);
   Print("index= ", index);

在编译过程中,函数头(或函数本身)中没有错误。

原因: