KimIV的有用功能 - 页 110

 
谢谢你的澄清,我现在将继续前进)))))。
 

函数WritingLineInFile()。

前几天我重写了这个函数,增加了参数fs,它负责写文件的第一行,这与其他行不同,比如说表头。只有在同时满足两个条件时,第一行才会被写入文件:该行的长度大于0,文件大小为0。而为了保持与上一版本的兼容性,新的参数已被定为可选项。

WritingLineInFile()函数的参数。

  • fn- 文件名称
  • st- 要写进文件的字符串
  • fs- 第一行(表头)。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.04.2012                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Запись строки в файл                                           |
//|  Параметры:                                                                |
//|    fn - имя файла                                                          |
//|    st - строка                                                             |
//|    fs - первая строка (шапка таблицы)                                      |
//+----------------------------------------------------------------------------+
void WritingLineInFile(string fn, string st, string fs="") {
  int fh=FileOpen(fn, FILE_READ|FILE_WRITE, " ");

  if (fh>0) {
    if (FileSize(fh)==0 && StringLen(fs)>0) FileWrite(fh, fs);
    FileSeek (fh, 0, SEEK_END);
    FileWrite(fh, st);
    FileClose(fh);
  }
}

附上一个测试功能的脚本。

附加的文件:
 
晚上好,伊戈尔!在功能区停了下来
DateBeginQuarter

首先,我试图理解这些线条。

int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);

默认情况下nq=0,所以我们从MathMod(nq/4)表达式中得到什么并不清楚,因为结果总是0。 另外第二行也不清楚,因为0/4没有余数,请澄清。

 

谢谢你,娜塔莎,谢谢你的问题。谢谢你,我重新检查了这个功能,发现了这个错误。在行

int ye=Year()-MathFloor(nq/4);

我需要把减号换成加号。

int ye=Year()+MathFloor(nq/4);

现在谈谈你的问题的实质。nq 并不总是等于零。可以有任何整数值,包括负数。当nq 是4的倍数时,即当你需要加减4个季度(年)时,这些线条就能发挥作用。

 
KimIV:

谢谢你,娜塔莎,谢谢你的问题。谢谢你,我重新检查了这个功能,发现了这个错误。在行

我需要把减号换成加号。

现在谈谈你的问题的实质。nq 并不总是等于零。可以有任何整数值,包括负数。你指定的行数在nq 是4的倍数的情况下起作用,即当你需要增加或减少4个季度(年)时。

谢谢你的回答,Igor....我花了比平时更长的时间来处理这个函数,但我还是想明白了))))))),在同一个函数中,我似乎不需要在表达式中减少年份。

 if (mo<1) {
    mo+=12;
    ye--;

那么它将是正确的。

 
Lisi4ka330:

...在同一个函数中,我认为你不需要减少表达式中的年份...

辩解,娜塔莎,为什么不呢?相反,在我看来,以相反的方向关闭月圆后减少一年是合乎逻辑的。在你的表达中,使年份变小相当于在分针回绕一圈后将时针向后移动一小时。给我们提供你的功能版本,我们将讨论它...也许你的版本会比我的更成功。
 

GetDrawdownOpenPosInPoint()函数

好了,我已经完成了对这个功能的彻底测试。我在必要时考虑到了传播,试图优化它...该函数以点为单位返回当前所开仓位的最大缩水。传统上,你可以向函数传递参数,从而过滤出你需要分析的位置。

  • sy- 仪器的名称。如果这个参数被传递,函数将只检查指定仪器的位置。NULL 表示当前的仪器,""(默认)表示任何仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符(MagicNumber)。默认值为-1 意味着任何MagicNumber。
  • tf- 图表的时间框架,在此框架内查看高点和低点的数值。默认值是0--当前的时间框架。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.05.2012                                                     |
//|  Описание : Возвращает максимальную просадку в пунктах текущих открытых    |
//|             позиций.                                                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
int GetDrawdownOpenPosInPoint(string sy="", int op=-1, int mn=-1, int tf=0) {
  if (sy=="0") sy=Symbol();
  if (tf==0) tf=Period();

  datetime to=TimeOpenFirstPos(sy, op, mn); // Время открытия первой позиции
  datetime tb=GetTimeOpenBar(sy, tf, to);
  int      dd, md=0;                        // Просадка
  double   po, sp;                          // Пункт, спрэд
  int      i, k=OrdersTotal();              // Номера позиций
  int      nb;                              // Номер бара

  if (tb>0) {
    while (tb<TimeCurrent()) {
      dd=0;
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
            if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
              if (tb>OrderOpenTime()) {
                nb=iBarShift(OrderSymbol(), tf, tb, True);
                if (nb>=0) {
                  po=MarketInfo(OrderSymbol(), MODE_POINT);
                  if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
                  else {
                    if (OrderType()==OP_BUY) {
                      dd+=(OrderOpenPrice()-iLow(OrderSymbol(), tf, nb)+po)/po;
                    }
                    if (OrderType()==OP_SELL) {
                      sp=po*MarketInfo(OrderSymbol(), MODE_SPREAD);
                      dd+=(iHigh(OrderSymbol(), tf, nb)-OrderOpenPrice()+sp)/po;
                    }
                  }
                }
              }
            }
          }
        }
      }
      if (md<dd) md=dd;
      tb+=60*tf;
    }
  }
  return(md);
}

HH.附件包含一个测试函数GetDrawdownOpenPosInPoint()的脚本。

附加的文件:
 
KimIV:
辩解,娜塔莎,为什么不呢?相反,在我看来,以相反的方向关闭月圆后减少一年是合乎逻辑的。在你刚才提到的表达方式中减少年份,就相当于在分针回绕一圈后,将时针向后移动一个小时。给我们提供你的功能版本,我们将讨论它...也许你的版本会比我的更成功。

我是这样推理的:假设我们需要确定Q7在过去和未来的起点,那么nq=-7和nq=7。Mathfloor 对过去会返回-2,对未来会返回+1(从文档中的函数描述来看),因此对于过去的情况,我们会比未来多减一年.....,如果我们继续对过去进行进一步计算,我们将不得不再次减少年份,最终我们会得到2009年.....。

不幸的是,由于缺乏时间(我几乎没有时间阅读网站页面),我无法提供我认为正确的代码,但我认为如果有必要,纠正它并不困难。

 
Lisi4ka330:

我是这样推理的:假设我们需要确定Q7在过去和未来的起点,那么nq=-7和nq=7。Mathfloor将返回过去的-2和未来的+1(从文档中对该函数的描述来看),因此对于过去的情况,我们将比未来多减一年.....,如果我们继续对过去进行进一步的计算,我们将不得不再次减少年份,最后我们将到2009年......

我同意你的推理,但你忘记了操作中涉及的数据类型。MathFloor() 可以完全省略。请看附件中的脚本结果。

附加的文件:
test.mq4  1 kb
 
下午好,Igor))))说实话,我不太理解你的答案,甚至所附的脚本也没有带来清晰的答案,而是相反。)))),但我想我会及时弄明白的))))。 请告诉我为什么在return(StrToTime(ye+"."+mo+".01") 行中有加号。