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

 
rid >> :

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

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

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

例如,130。

而这个数字的解码可以在网页上找到 - https://book.mql4.com/ru/appendix/errors

我们不必搜索所有的代码,因为我们已经知道了这个数字--到底是哪里出错了!

让我纠正一下:GetLastError函数可以在没有头文件的情况下调用,但要在不浏览网站的情况下得到错误描述,你应该链接库。

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
 
rid писал(а)>>

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

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

它应该看起来像这样。


感受一下差异(你错过了"-1")!并改变你的代码。

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

至于你的第二个条件,我会("不假思索地巧妙")设置一个不同的魔术师和单独的函数Open_Buy_2(),通过第二个条件来开仓 !

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

摆脱。

我也明白为什么第二个条件不起作用,也许我对问题的解释不正确。

我希望我的EA能够检查订单是否被它打开,即使它们在很久以前就被关闭。NumberOfPositions可以工作,但它只计算未结头寸的数量。(这就是为什么它不起作用)

在我的EA代码中,有一个脚本,它在打开每一个下一个头寸时都会考虑到前一个头寸的数据,如果没有前一个头寸,那么第一个订单就应该在没有这个条件的情况下打开(否则,EA将不会启动)。 因此,应该有一个函数来了解这个EA的至少一个订单是否已经被打开(即使该订单随后被关闭)。如果还没有订单(在工作开始时),那么第一个订单被打开,不考虑第二个条件,所有随后的订单被打开,考虑第二个条件,即使用以前订单的数据。

有可能以这种方式修改函数吗?

 

请告诉我iTime 功能显示什么。

那10位数的胡言乱语是什么?秒钟?

如何转换为年-月-日-时-分?

 

我明白了。为了确定历史上是否有职位,你可以这样做。

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()== Magic)                            {
              позиции = true;
                                                             }}
                  



但这样你的代码就只能在测试器中工作。因为否则的话,你将不得不在每次打开EA在线时改变魔力。

很明显,你需要设置账户历史记录的时间。

也就是说,最后一次用给定的魔法进行交易是什么时候开/关的?是6个月前还是24小时前?

有一些函数可以返回最后一笔开仓或平仓交易的条数(从当前条数算到历史的后面)。


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

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

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

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift( sy, tf, t, True));}

给你举个例子。我在我的代码中是这样使用这些函数的。
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

或者像这样。
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
 
先生们!帮助!如何正确编写代码,以显示最后一根蜡烛的收盘是白色(上升)或黑色(下降)的信息。我知道这没有意义,但还是.....。

 

嗯......在同一个简单的问题上挣扎......开了很多仓位,但最多只需要1个,当买入结束后,有信号来开卖......。大要求提示并纠正以下代码中的错误......我在哪里需要开出一个魔力?如果你不介意的话,举个愚蠢的例子,当买入时向上交叉(不超过1个订单),卖出时向下也不超过1个。 我认为这将立即解决许多新手的问题。预先感谢你。

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

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);
}
 

另一个愚蠢的问题。

- 如何声明一个数组,其元素数由一个外部变量给出。

 
chaynik_1 >> :
先生们!帮助!如何正确地编写代码,以显示最后收盘的蜡烛是白色(上升)或黑色(下降)的信息。我知道这没有意义,但仍然.....。

它是这样的。

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
 
alderru >> :

另一个愚蠢的问题。

- 如何声明一个数组,其元素数由一个外部变量给出。

https://docs.mql4.com/ru/array/ArrayResize

 
morok >> :

嗯......在同一个简单的问题上挣扎......开了很多仓位,但最多只需要1个,当买入关闭,出现卖出的信号时......。大要求提示并纠正以下代码中的错误......我在哪里需要开出一个魔力?如果你不介意的话,举个愚蠢的例子,当买入时向上交叉(不超过1个订单),卖出时向下也不超过1个。 我认为这将立即解决许多新手的问题。提前感谢。

像这样试试吧。

(你必须对NumberOfPositions()更加注意,它被写在标题中是有原因的。

/|说明:|说明:返回位置的数量。
//| 参数 : |
//| sy - 仪器名称(""或NULL - 当前符号)|
|| op - 操作 ( -1 - 任何位置 ) ||
//| mn - MagicNumber ( -1 - any magic number) | |
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

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);
}
原因: