[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 275

 

问题是。

如何得到一个没有减号的数字,如果结果是 Open[1]<Close[1], 当你减去 Open[1]-Close[1]时,我 得到的值是一个减号,如何使它总是一个正值,我需要计算 OpenClose 之间的距离,也许有别的方法?

谢谢你。

 
Martingeil >> :

问题是。

如何得到一个没有减号的数字,如果结果是Open[1]<Close[1],当你减去Open[1]-Close[1]时,我得到的值是一个减号,如何使它总是一个正值,我需要计算Open和Close之间的距离,也许有别的方法?

>> 谢谢你。

https://docs.mql4.com/ru/math/MathAbs

 

;)>> 谢谢你!

 

日安!

当为 MT4编写EA 时,需要以编程方式(即在EA本身的代码中)确定该EA的至少一个订单是否被打开。你能否告知是否有这样的功能?也许,如果有的话,它看起来会是这样的

Bool (是否有一个具有这个神奇数字的EA订单被打开)

{答案=真/假}

?

专家--请帮助--我们已经在绞尽脑汁了

P.S.- 试着用订单号的选项 - 没有用

 
waitra >> :

日安!

在为MT4编写EA时,需要以编程方式(即在EA本身的代码中)确定该EA的至少一个订单是否被打开。你知道是否有这样的功能吗?

这个功能能起作用吗?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                  |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}

使用实例:我们把这个函数放在代码的最后,当我们开仓时检查它。



if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1) {
// если нет окрытых OP_BUY позиций с заданным магиком, покупаем
ticket=OrderSend(Symbol(),0, Lots,Ask, Slippage,Bid- SL*Point,
                      Ask+ TP*Point, NULL, Magic ,0,Blue);
                                              }

如果我们不寻找头寸而是寻找挂单,我们可以使用这个函数

函数NumberOfOrders()。
该函数返回订单的数量。你可以用函数参数限制要检查的订单列表。
sy - 仪器的名称。如果我们设置这个参数,函数将只检查指定工具的订单。NULL表示当前的符号,而""(默认)表示任何符号。
op - 待定订单的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP或-1。默认值为-1意味着任何顺序。
mn - 订单标识符(MagicNumber)。默认值为-1意味着任何MagicNumber。

https://www.mql5.com/ru/forum/107476/page12

 

请解释这些文件提供了什么。

#include <stdlib.mqh>
#include <stderror.mqh>

如果可能的话,以一些简单的方式。

谢谢你。

 
Serbov писал(а)>>

请解释这些文件提供了什么。

如果可能的话,以一些简单的方式。

谢谢你。

它们是所谓的 "库文件"。这些文件存储了经常使用的函数。它们被用来避免加载源代码。如果库文件被 "声明",声明文件中的函数可以被使用,就像它们被包含在源代码中一样。

 
Serbov >> :

请解释一下这些文件给了我们什么。

如果可能,请保持简单。

谢谢你。

当使用(调用)这些文件中的函数时(最初已经内置到mt4中),在EA操作不正确的情况下,我们可以在日志中看到我们在代码中的错误编号。

例如,我们调用GetLastError()函数。

ticket= OrderSend(Symbol(),OP_BUY, lots,Ask,3, SL, TP,"Name_Expert", Magic,0, clOpenBuy );
   if( ticket < 0)
 {Print("Ошибка открытия ордера BUY #", GetLastError());  } 

在这种情况下,如果我们在代码中犯了错误或设置了不正确的外部参数,我们将在日志中看到这个错误的编号。

例如,130。

而这个数字的解码可以在-https://book.mql4.com/ru/appendix/errors。

而且我们不需要翻阅整个代码,因为我们已经知道错误出在哪里了。

 
rid писал(а)>>

这个功能能起作用吗?


使用实例:我们将该函数本身放在代码的最后(在START函数之外),然后在开仓时检查它。



如果我们不寻找头寸而寻找挂单,我们可以使用

函数NumberOfOrders()。
该函数返回订单的数量。你可以用函数参数限制要检查的订单列表。
sy - 仪器的名称。如果你指定这个参数,函数将只检查指定工具的订单。NULL表示当前的仪器,而""(默认)表示任何仪器。
op - 待定订单的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP或-1。默认值为-1表示任何顺序。
mn - 订单标识符(MagicNumber)。默认值-1表示任何MagicNumber。

https://www.mql5.com/ru/forum/107476/page12

非常感谢你的提示,我们尝试了一下,但没有成功,请检查一下代码中的某个地方是否有错误。

bool Open_Buy()

{

   bool res=false;    


if( условие_1)        { 

       if ( NumberOfPositions(NULL, Magic)< 1) // если нет открытых позиций с заданным магиком

          { res=true; }}

else  

   {

    if( условие_1) 

       { 

       if ( NumberOfPositions(NULL, Magic)> 1) // если советник уже открывал позиции

       {

          if ( условие_2)              { 

             res=true; }

           } 

}}

return( res);

}

如果我们想检查是否有卖出或买入条件,而我们没有开出或关闭订单,在这种情况下,只有第一个条件会起作用。 如果EA在过去已经开过单,那么,当一个订单被打开时,第一个+第二个条件应该触发。

我翻看了你提供的链接,也许ExistOrders(); 更合适?

(但说实话,我无法找到它,因为我显然暂时缺乏这种技能)。

 

你没有正确地调用该函数。

你的函数是这样调用的:如果(NumberOfPositions(NULL,Magic)>1)

它应该看起来像这样。

if( условие_1)        { 

       if ( NumberOfPositions(NULL,-1, Magic)< 1) 
// если нет открытых позиций с заданным магиком

          { res=true; }}

感受一下差异(你漏掉了"-1")!并获得你的代码。

为了控制它,你可以在图表上打印一个注释。例如,像这样(在START函数的开头)。

Comment ("Количество текущих открытых советником позций = ",
                                  NumberOfPositions(NULL,-1,Magic)  );
Magic_2=Magic*3;
至于你的第二个条件,我会("不假思索")设置一个不同的魔术师和单独的函数Open_Buy_2(),通过第二个条件开仓

第二个条件的代码将看起来像这样

 if ( условие_2)                          { 
  if ( NumberOfPositions(NULL,-1, Magic)== 1)   {
    if ( NumberOfPositions(NULL,-1, Magic_2)< 1) { 
..... ..... 
原因: