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

 
Seric29:
可以使用什么运算符,从中可以返回2个结果?我使用if 语句来寻找这个条件,但它不能返回多个结果,在这种情况下,我必须写2次相同的条件,这就是为什么我写这个问题。

不太清楚检查的是什么条件,但也许开关 会对你有用。并用TRUE指定你需要的值。

 
是否有一个函数用于交换两个变量的值?
 
pivomoe:
是否有一个函数用于交换两个变量的值?

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

mql5语言的特点、微妙之处以及技巧

fxsaber, 2018.08.26 19:02

论坛的英文部分显示
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }

 
Artyom Trishkin:

谢谢你。我必须要掌握这些定义。

 
你好!为什么从指标和专家那里调用Bars()函数 时有不同的值,如何使之匹配?
 
Tango_X:
你好!为什么从指标和专家顾问中调用Bars()函数 时有不同的值,如何使之匹配?

显示EA和指标的代码。

 
Alexey Viktorov:

显示EA和指标的代码。

只要调用函数 Bars(_Symbol,_Period)

 
Tango_X:

只要调用 Bars(_Symbol,_Period)函数 即可。

我是否必须要求单独打印出结果?

我没有得到任何区别。虽然在测试器中不排除这种变体的存在,因为我对其历史了解甚少,只是模糊地记得我前段时间读到的内容。毕竟,它变成了可用的酒吧的总数。但如果你不时地问,不可能有任何区别。

 
Alexey Viktorov:
if语句不返回任何值。

在一个单独的函数中,有两种为某些变量赋值的选择。

1.变量必须在程序的所有部分都是可见的。也就是说,它们必须在全局变量 级别(在代码的开头)声明。

2.通过引用将本地声明的变量传递给用户函数。就是说,在变量名称前加上&。

这意味着,如果一个条件为真,必须执行两个相同的动作,例如

        if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);
}

我已经声明了一些变量,但除了这个动作外,什么也没做Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ?Bar_Cl[iHgCL]:Bar_Op[iHgOP]; 或者这个动作Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ?Bar_Cl[iLwCL]:Bar_Op[iLwOP]; 如何让它执行2个相同的动作,按条件执行上下两层。谁能告诉我如何写得更短?

 
Konstantin Nikitin:

不太清楚检查的是什么条件,但也许开关 会对你有用。并在TRUE处指定你想要的值。

 if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);

你需要执行Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ?Bar_Cl[iHgCL]:Bar_Op[iHgOP]; andPrice_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ?Bar_Cl[iLwCL]:Bar_Op[iLwOP]; 。