KimIV的有用功能 - 页 18

 
rid писал (а):
硕士。我将保留该帖子24小时--然后我将删除它!

你不需要删除它!让它留在...

 

Igor,首先感谢你的功能和这个分支,它们帮助了许多非专业程序员。但我想问你一个关于NumberOfOrders()函数的问题。我不能让它工作。我把它放到一个标准的MACD专家顾问中,以举例说明我如何使用它。我正在粘贴代码。

简要描述一下,那里已经改变了。

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
自然,这并不奏效。能否请你解释一下哪里出了问题?提前感谢。
附加的文件:
 
seifer писал (а):
你能解释一下哪里出了问题吗?提前感谢。

两条评论。

1.我会这样做的。

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2.函数NumberOfOrders()返回订单的数量 - 买入限价、买入止损、卖出限价和卖出止损类型的交易。你所修改的专家顾问并不能与订单一起工作。它以市场价格开仓,即进行买入和卖出交易。你需要使用NumberOfPositions() 函数,我将在下一篇文章中发布。
 

NumberOfPositions()函数。

该函数返回当前开放的职位数。更准确地选择计数位置是由外部参数指定的。

  • 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  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) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
附上一个测试NumberOfPositions()函数的脚本。
附加的文件:
 

哇!我以为这是一个设计。

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
将经过所有的头寸(包括OP_SELL和OP_BUY)。现在一切都在运作。再次感谢!
 

GetProfitFromDateInCurrency()函数。

该函数返回自某一日期以来关闭的头寸的货币总利润。使用外部参数指定要考虑的位置的更精确选择。

  • sy- 市场工具的名称。如果你指定这个参数,函数将只考虑这个乐器的位置。默认值"" 意味着任何市场工具。NULL 表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值-1 表示任何标识符。
  • dt- 自1970年以来的日期和时间,单位为秒。默认值--0 表示考虑到历史上所有可用的位置。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

HH. 附上一个测试函数GetProfitFromDateInCurrency()的脚本。

i-Profit 指标显示了不同时间段的绝对和百分比利润值,是学习如何使用这一功能的一个更实际的例子。

附加的文件:
 

你好,伊戈尔。

我想说谢谢你的相关小说。 我有一些选择,我只是想澄清它们)

我也有这样一个问题。我在测试实时模式下的专家顾问 时,经常遇到错误130 - 错误的停止。我不分析它,我不明白为什么它在这种或那种情况下发生。我已经开始使用这种结构

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

我已经开始使用这种结构来规范止损和TP,但它并没有解决这个问题。也许你也遇到过类似的情况,告诉我如何处理,有什么好的分析方法。

澄清一下:当我试图在开盘价的+1p处设置止损时,这种情况经常发生。

 
scorpionk писал (а):
遇到错误131--不正确的停止。

131- 体积不正确,体积造粒错误。这是被交易的手数的大小。

 
KimIV:
scorpionk 写道(a):
,我遇到了错误131--错误的停止。

131- 体积不正确,是体积造粒的错误。这是被交易的手数的大小。

错误的代码,不是131而是130

 
scorpionk:

错误的代码,不是131,是130。

我明白了...

试着按以下方式进行正常化。

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
我这样做了,我没有遇到错误130