KimIV的有用功能 - 页 14

 
KimIV:

但它允许按工具栏上的 "专家顾问 "按钮来停止专家顾问。

我想这是可以的,谢谢。 离开EA的参数不多,不会很困难。

 

使用ClosePosBySizeProfitInCurrency()函数的一个例子

特别是为了演示ClosePosBySizeProfitInCurrency()函数,我写了一个专家顾问。
e-CloseByProfitPosInCurrency,它只关闭那些存款货币的利润超过某个特定值的头寸。专家顾问可以只安装在一个图表上,也可以安装在几个图表上。您可以使用专家顾问的外部参数指定要关闭的头寸清单。

  • symbol="0" - 交易工具。允许使用以下值。"0" - 任何交易工具,"" - 只有当前工具和市场概览中的任何数值(EURUSD,GBPUSD,等等)。
  • 操作=-1- 贸易操作。有效值:-1 - 任何交易,0 - OP_BUY,1 - OP_SELL。
  • 利润=50- 以存款货币计算的利润。
  • MagicNumber=0- 位置的标识符。
 

大家下午好。

伊戈尔,你是否有一个函数,当达到指定的损失时,以类似于ClosePosBySizeProfitInCurrency()的方式关闭损失的头寸。(或者,也许是一个综合的,可以指定盈利和亏损时的关闭)。

根据我的理解,我们可以简单地在OrderProfit() 参数pr 中设置--带减号,我们就会得到我们 所要的东西。

是否可以用积分来设置门槛(而不是用存款货币)?如果是,那么如何?(不建议使用 "获利 "和 "止损"。)

 
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();
          }
        }
      }
    }
  }
}

我使它能够以正数(损失)和负数(带减号的利润)的形式传递损失。

写道
根据我的理解,我们只需在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()函数。

该功能以存款货币的最大正利润关闭一个头寸。也就是说,在五个仓位中,每个仓位的利润分别为-34、15、73、-90、41,利润为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,则关闭所有的购买并卖出。