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が得られるはずです。print((OrdArr[i].buy-Ord[1,3]-PipStep)/Point) pinstep is equal to 0.0020 all variables double result print the one tenth less than should be.もしかしたら、誰か知っているかもしれませんねSPSです。