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

 
Viachaslau Baiko:

这里是我变得有点棘手的地方:我采取了这个代码(感谢Alekseu Fedotov)。

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

这里有一个问题,因为最初NumberOfBarCloseLastPos将被设置为"-1"。因此,第一笔订单将永远不会打开。

在这种情况下,我们能做什么?还是我误解了什么?

在这种情况下,我们可以尝试if(CONTROL &&NumberOfBarCloseLastPos()>-2),或者认为
 
Viachaslau Baiko:

这里有一点细微的差别:我取了这个代码(感谢Alekseu Fedotov)。

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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) {
...
  return(iBarShift(sy, tf, t, True));
}
if( УСЛОВИЕ && (NumberOfBarCloseLastPos()>0 || NumberOfBarCloseLastPos()==-1) )
 
Vitaly Muzichenko:
好了,你去吧。而我建议考虑一下。
 
Алексей Тарабанов:
在这种情况下,你可以尝试if(CONDITION &&NumberOfBarCloseLastPos()>-2),或者认为
但有了这个选项,也会有一个 "0 "的值。
 
Vitaly Muzichenko:
if( УСЛОВИЕ && (NumberOfBarCloseLastPos()>0 || NumberOfBarCloseLastPos()==-1) )
这一切都在起作用!谢谢你!
 
Viachaslau Baiko:

这里是我变得有点棘手的地方:我采取了这个代码(感谢Alekseu Fedotov)。

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

这里有一个问题,因为最初NumberOfBarCloseLastPos将被设置为"-1"。因此,第一笔订单将永远不会打开。

在这种情况下可以做什么?还是我误解了什么?

嗯,这就是我想做的。

//+------------------------------------------------------------------+
int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
   datetime time=0;
   int      j=-1;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if(OrderMagicNumber()!=magic_number)   continue;
         if(OrderSymbol()!=symbol_name)         continue;
         if(OrderType()!=type)                  continue;
         if(OrderCloseTime()>time) {
            time=OrderCloseTime();
            j=i;
            }
         }
      }
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time));
   return(EMPTY);
}
//+------------------------------------------------------------------+

...并检查。

if(BarCloseLastPos(Symbol(),PERIOD_CURRENT,OP_BUY,Magic)>0) {
   // Последняя позиция Buy была закрыта не на текущем баре
   }
 
Artyom Trishkin:

嗯,这就是我想做的。

//+------------------------------------------------------------------+
int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
   datetime time=0;
   int      j=-1;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if(OrderMagicNumber()!=magic_number)   continue;
         if(OrderSymbol()!=symbol_name)         continue;
         if(OrderType()!=type)                  continue;
         if(OrderCloseTime()>time) {
            time=OrderCloseTime();
            j=i;
            }
         }
      }
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time));
   return(EMPTY);
}
//+------------------------------------------------------------------+

...并检查。

if(BarCloseLastPos(Symbol(),PERIOD_CURRENT,OP_BUY,Magic)>0) {
   // Последняя позиция Buy была закрыта не на текущем баре
   }
那么,如果它,偷偷地,在当前的酒吧里关闭呢?
 
Алексей Тарабанов:
那么,如果它在当前的酒吧里偷偷地关闭呢?

这正是需要错过的东西。如果前一个仓位在此条线上关闭,它就不需要开仓--在零点。

而如果我们需要检查该位置在当前条形图上关闭的条件,我们需要检查零。

if(BarCloseLastPos(Symbol(),PERIOD_CURRENT,OP_BUY,Magic)==0) {
   // Последняя позиция Buy была закрыта на текущем баре
   }
 
Viachaslau Baiko:

这里是我变得有点棘手的地方:我采取了这个代码(感谢Alekseu Fedotov)。

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

这里有一个问题,因为最初NumberOfBarCloseLastPos将被设置为"-1"。因此,第一笔订单将永远不会打开。

在这种情况下,我们能做什么?还是我误解了什么?

if(УСЛОВИЕ && NumberOfBarCloseLastPos()!=0)
 
MT4论坛用户早上好我面临一个问题,我想要么是我不知道如何计算和很多计算器,要么是mt4编译器有自己的方式。 我写的代码print((1.1145-1.1123-0.0020)/0.0001) 应该得到2。我试着打印((OrdArr[i].buy-Ord[1,3]-PipStep)/Point) pinstep等于0.0020,所有变量都是双倍的,结果打印的结果比它应该的少十分之一。也许有人知道问题出在哪里!SPS。

原因: