KimIVの便利な機能 - ページ 21

 

isCloseLastPosByStop()関数です。

この関数は、ストップによる最後のポジションのクローズフラグを返します。フラグが立っている -True- StopLossが発動した。フラグを下げた -False- ポジションは別の理由で閉鎖されました。考慮すべき位置をより正確に選択するために、外部パラメータを使用して設定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
追伸:isCloseLastPosByStop()関数をテストするスクリプトを添付します。
ファイル:
 
Lukyanov:
KimIV:

オンライン用のOpenPosition()関数です。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
//-- skip --
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip -- 
リアルでEAにOpenPosition()関数を突っ込んだらエラー4059、NULLをSymbol()に変更したら消えた、その後メッセージが表示された。
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: エキスパートが停止しました。
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: エキスパート関数の呼び出しは許可されていません; 'stdlib'-'ErrorDescription'.
ベースラインに戻ると、すべてがうまくいく...(stdlib.mqh && stderror.mqhは、ベースMTの納品時のインクルードフォルダ内にあります)
 
teraptor2 писал (а):
Expert AdvisorのOpenPosition()関数をリアルで接続したところ、エラー4059。

4059エラーは、テストモードではその機能が使用できないことを意味します。エラー識別子は ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE である。以下の関数がエラーを発生させます。MarketInfo、MessageBox、SendFTP、SendMail、WindowIsVisible、WindowFind、WindowHandle。

teraptor2 wrote (a):
NULLをSymbol()に変更したら消えた、その後メッセージが表示された。
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: エキスパートが停止しました。
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: エキスパート関数の呼び出しは許可されていません; 'stdlib'-'ErrorDescription'.
 

isCloseLastPosByTake()関数です。

この関数は、最後のポジションを利益確定(Take Profit)するフラグを返します。フラグが立っている -True- TakeProfitが発動されました。フラグを下げた -False- ポジションは別の理由で閉鎖されました。より精度の高い検討位置の選定は、外部パラメータを用いて行う。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
HH. isCloseLastPosByTake()関数をテストするためのスクリプトを添付します。
ファイル:
 

isLossLastPos()関数です。

説明: 最後に閉じた位置の損失フラグを返す。フラグアップ -True- 最後のポジションは損失で決済されました。フラグダウン -False- 最後のポジションがゼロ、または利益で決済されました。本機能はスワップ、コミッションを考慮しない。ポジションの選択は、外部パラメータで定義されます。

  • sy- 市場商品の名前。このパラメータを指定すると、指定した楽器の位置のみを考慮するようになります。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
追伸:isLossLastPos()関数をテストするスクリプトを添付します。
ファイル:
 

isTradeToDay()関数を使用します。

説明: 今日の取引フラグを返す。フラグが立った -本当だ- 今日はオープンポジションがあったんだ。フラグダウン -False- 本日、ポジションはオープンしていません。考慮する位置の選択は、外部パラメータで設定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  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) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
ZZY. isTradeToDay()関数をテストするスクリプトが添付されています。
ファイル:
 
KimIV:

isCloseLastPosByStop()関数です。

この関数は、ストップによる最後のポジションのクローズフラグを返します。フラグが立っている -True- StopLossが発動した。フラグを下げた -False- ポジションは別の理由で閉鎖されました。考慮すべき位置をより正確に選択するために、外部パラメータを使用して設定します。

().

午後.この関数を使ったコードを実装する際、若干の混乱が生じました。この機能を応用して、こんな風にしました。

if (isCloseLastPosByStop(NULL,OP_BUY, MagicLong1))               {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
  for ( int rb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- )                {       
      if (OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES))                 { 
      //выбираем среди открытых и отложенных ордеров          
      if( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1))  {
         //закрываем все остальные позиции BUY
        OrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black );
       OrderDelete(OrderTicket());// и удаляем BUY-отложки   
        //  return(0); // выходим     
        }}}}

ここまではすべて問題なく動作します私が定義したように、すべての買いポジションはクローズされ、買いポジションは削除されます。しかし、その後、Expert Advisorは、エントリーのシグナルに従って、保留中の注文を再設定します。予想通りです。

しかし、その注文は即座に削除されるのですどうやら、その旗はまだそこに掲げられているようだ。しかし、なぜそこにあるのでしょうか?最後のポジションはストップロスではなく、強制的に決済されました。

このような場合、どのように対処すればよいのでしょうか。Expert Advisor が、このアルゴリズムを実行するコマンドを実行した後に閉じてしまった場合、どうすればよいですか?

 
rid писал (а):
このような場合、どうすればいいのでしょうか?そうすれば、EA は注文を閉じるコマンドの後に、次の注文を普通に出すことができるようになるのですか?

この問題は、一つの行動だけでなく、相互作用があり、一定の順序で行われるため、タスク全体の文脈で対処する必要があるのです。したがって、タスクを完全に記述する。コードは必要ありません。タスクを言葉で表現すればいい。

ウォーミングアップの質問です。なぜ注文を削除して元に戻す必要があるのですか?改造するのが望ましいと思います。

 

私の注文やポジションは、利益や損失、ストップやリミットオーダー、その他の理由によって配列にグループ化されています。

このケースでは、逆指値注文を使用して開設され、指定された利益を蓄積している買いポジションの配列を閉じているのです。そして、機能していない他のストップオーダーをすべて削除しています。

//---------------------------------------------------------------------------------------------

 

さて、コメント機能-Comment(isCloseLastPosByStop())を載せてみました。

見ている。初期状態では、関数 =0 です。ストップロス・コメント(isCloseLastPosByStop())の最初のクローズ後、1に変化し、その後、他のポジションの強制クローズの後、それはゼロに戻らず、1が継続されます。