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

 
KimIV:

しかし、ツールバーの「Expert Advisors」ボタンを押すことで、Expert Advisorを停止させることができます。

EAから離脱するためのパラメータはそれほど多くないので、難しくはないでしょう。

 

ClosePosBySizeProfitInCurrency()関数の使用例です。

特にClosePosBySizeProfitInCurrency()関数のデモを行うために、Expert Advisorを書きました。
e-CloseByProfitPosInCurrency は、預入通貨での利益がある指定値を超えたポジションのみを決済するものです。Expert Advisorは、1つのチャートにのみインストールすることも、複数のチャートにインストールすることも可能です。Expert Advisor の外部パラメータを使用して、クローズするポジションのリストを指定することができます。

  • symbol="0" - 取引商品。以下の値が使用可能である。「0" - あらゆる取引商品、"" - 現在の商品と市場概要からの任意の値(EURUSD、GBPUSDなど)のみです。
  • Operation=-1- 貿易業務。有効な値: -1 - 任意の取引、0 - OP_BUY、1 - OP_SELL。
  • 利益=50- 預けた通貨での利益。
  • MagicNumber=0- 位置の識別子です。
 

皆さん、こんにちは。

イゴールさんは、ClosePosBySizeProfitInCurrency()と同じように、指定した損切りになったら損切りのポジションをクローズする関数はありますか?(または、おそらく、利益と損失の決算を指定することができる複合的なもの)。

私の理解では、OrderProfit() のパラメータprに マイナス 記号を設定するだけで、求めているものが得られると思います。

入金通貨ではなく、ポイントで基準値を設定することは可能ですか?もしそうなら、どのように?(TakeProfitとStopLossは提案されていません)

 
rid писал (а):
イゴールさんは、ClosePosBySizeProfitInCurrency()と同じように、指定した損切りになったら損切りのポジションをクローズする関数はありますか?(あるいは、利益時と損失時の決算を指定できる、複合的なもの)。

いいえ、まだそのような機能はありません。ただし、ClosePosBySizeProfitInCurrency()はやり直せます。


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

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}

プラス(損失)とマイナス(マイナス記号付きの利益)の数値で渡せるようにしました。

rid wrote:
私の理解では、OrderProfit() のパラメータprに マイナス 記号を設定するだけで、求めているものが得られると思います。

入金通貨ではなく、ポイントで基準値を設定することは可能ですか?もしそうなら、どのように?(テイクプロフィット、ストップロスはオプションではありません。)

e-CloseByProfitの コードを見てください。

 
ありがとうございます。
 

ClosePositions()関数です。

パラメータが指定した値を満たすポジションをクローズする機能です。

  • sy- 楽器の名称。このパラメータを設定すると、指定した楽器の位置だけをチェックする機能になります。NULLは現在の楽器、""(デフォルト)は任意の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUY、OP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子(MagicNumber).デフォルト値 -1 - 任意のMagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
助けてください!!一見簡単そうに見える作業に4日前から頭を悩ませています。CCIが100より高くなったら、-100より低くなるまで買い、-100より低くなったら、100より高くなるまで売りのポジションを 持つというように規定しなければならない。
 

ClosePosFirstProfit()関数です。

この機能は、収益性の高いポジションを先に、それ以外のポジションを順にクローズします。閉じるべきポジションをより正確に選択するために、外部パラメータで定義します。

  • sy- 楽器の名称。このパラメータが設定されている場合、この機能は指定された計器の位置のみをチェックします。NULLは現在の計測器、""(デフォルト)は任意の計測器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUY、OP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子(MagicNumber).デフォルト値 -1 - 任意のMagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 

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

この機能は、入金した通貨で最大限のプラスの利益を得たポジションを1つ決済します。つまり、それぞれ-34、15、73、-90、41の利益を持つ5つのポジションのうち、預金通貨で73単位の利益を持つポジションが決済されることになるのです。閉じるべき位置をより正確に選択するために、外部パラメータを使用して指定します。

  • sy- 楽器名。このパラメータを設定すると、この関数は指定された楽器の位置だけをチェックします。NULLは現在の計測器、""(デフォルト)は任意の計測器を意味します。
  • op-貿易業務、ポジションタイプ。有効な値:OP_BUY、OP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子(MagicNumber).デフォルト値 -1 - 任意のMagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие одной позиции с максимальным положительным профитом   |
//|             в валюте депозита                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  }
}
 
B_Dima:
CCIの値が100を超えたら、-100以下になるまで買いポジションを建て、-100以下になったら、100を超えるまで売りポジションを建てます。

デミには、こんな機能を提案します。

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

この関数は、買い時には1を、売り時には-1を返します。売買条件は思いのままです。あとは、刻み目ごとに次のことをするだけです。

1.GetTradeSignal()の値を取得します。

2.受信値=0 の場合は何もしない。

受信値 >0 ならば、すべての販売を終了し、購入する。

4.得られた値が<0であれば、すべての買い付けを終了し、売り物をする。