Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 13

 
Viachaslau Baiko:

An dieser Stelle wurde es etwas knifflig: Ich habe diesen Code genommen (Dank an 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));
}

Und jetzt stelle ich den Scheck aus:

if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

Und hier liegt der Haken, denn zunächst wird NumberOfBarCloseLastPos auf "-1" gesetzt. Folglich wird die erste Bestellung nie geöffnet.

Was können wir in dieser Situation tun? Oder habe ich etwas missverstanden?

In dieser Situation könnten wir versuchen,if(CONTROL && NumberOfBarCloseLastPos()>-2), oder denken
 
Viachaslau Baiko:

Hier ist eine kleine Nuance: Ich habe diesen Code (dank 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:
Nun, da haben Sie es. Und ich habe vorgeschlagen, darüber nachzudenken.
 
Алексей Тарабанов:
In dieser Situation könnten Sie versuchen,if(CONDITION && NumberOfBarCloseLastPos()>-2), oder denken
Bei dieser Option wird jedoch auch der Wert "0" angegeben.
 
Vitaly Muzichenko:
if( УСЛОВИЕ && (NumberOfBarCloseLastPos()>0 || NumberOfBarCloseLastPos()==-1) )
Es klappt alles! Ich danke Ihnen!
 
Viachaslau Baiko:

An dieser Stelle wurde es etwas knifflig: Ich habe diesen Code genommen (Dank an 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));
}

Und jetzt stelle ich den Scheck aus:

if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

Und hier liegt der Haken, denn zunächst wird NumberOfBarCloseLastPos auf "-1" gesetzt. Folglich wird die erste Bestellung nie geöffnet.

Was kann in dieser Situation getan werden? Oder habe ich etwas missverstanden?

Nun, das würde ich auch tun:

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

... und prüfen:

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

Nun, das würde ich auch tun:

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

... und prüfen:

if(BarCloseLastPos(Symbol(),PERIOD_CURRENT,OP_BUY,Magic)>0) {
   // Последняя позиция Buy была закрыта не на текущем баре
   }
Was wäre, wenn sie heimlich auf dem aktuellen Balken geschlossen würde?
 
Алексей Тарабанов:
Nun, was wäre, wenn es heimlich auf der aktuellen Bar geschlossen?

Das ist genau das, was man vermissen muss. Es ist nicht notwendig, eine Position zu eröffnen, wenn die vorherige auf diesem Balken geschlossen wurde - auf Null.

Und wenn wir die Bedingung prüfen müssen, dass die Position auf dem aktuellen Balken geschlossen wurde, müssen wir Null prüfen:

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

An dieser Stelle wurde es etwas knifflig: Ich habe diesen Code genommen (Dank an 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));
}

Und jetzt stelle ich den Scheck aus:

if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

Und hier liegt der Haken, denn zunächst wird NumberOfBarCloseLastPos auf "-1" gesetzt. Folglich wird die erste Bestellung nie geöffnet.

Was können wir in dieser Situation tun? Oder habe ich etwas missverstanden?

if(УСЛОВИЕ && NumberOfBarCloseLastPos()!=0)
 
Guten Morgen, MT4-Forum-Benutzer! Ich stand vor einem Problem, und ich denke, entweder ich weiß nicht, wie zu berechnen und eine Menge von Rechnern oder mt4 Compiler hat seine eigene Art und Weise. Ich schreibe den Code print((1.1145-1.1123-0.0020)/0.0001) sollte 2 erhalten.Ich habe versucht zu drucken((OrdArr[i].buy-Ord[1,3]-PipStep)/Point) pinstep ist gleich 0,0020 alle Variablen double Ergebnis druckt ein Zehntel weniger als es sein sollte. Vielleicht weiß jemand, was das Problem ist! SPS.

Grund der Beschwerde: