//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
函数WritingLineInFile()。
前几天我重写了这个函数,增加了参数fs,它负责写文件的第一行,这与其他行不同,比如说表头。只有在同时满足两个条件时,第一行才会被写入文件:该行的长度大于0,文件大小为0。而为了保持与上一版本的兼容性,新的参数已被定为可选项。
WritingLineInFile()函数的参数。
附上一个测试功能的脚本。
DateBeginQuarter
首先,我试图理解这些线条。
默认情况下nq=0,所以我们从MathMod(nq/4)表达式中得到什么并不清楚,因为结果总是0。 另外第二行也不清楚,因为0/4没有余数,请澄清。
谢谢你,娜塔莎,谢谢你的问题。谢谢你,我重新检查了这个功能,发现了这个错误。在行
我需要把减号换成加号。
现在谈谈你的问题的实质。nq 并不总是等于零。可以有任何整数值,包括负数。当nq 是4的倍数时,即当你需要加减4个季度(年)时,这些线条就能发挥作用。
谢谢你,娜塔莎,谢谢你的问题。谢谢你,我重新检查了这个功能,发现了这个错误。在行
我需要把减号换成加号。
现在谈谈你的问题的实质。nq 并不总是等于零。可以有任何整数值,包括负数。你指定的行数在nq 是4的倍数的情况下起作用,即当你需要增加或减少4个季度(年)时。
谢谢你的回答,Igor....我花了比平时更长的时间来处理这个函数,但我还是想明白了))))))),在同一个函数中,我似乎不需要在表达式中减少年份。
那么它将是正确的。
...在同一个函数中,我认为你不需要减少表达式中的年份...
GetDrawdownOpenPosInPoint()函数
好了,我已经完成了对这个功能的彻底测试。我在必要时考虑到了传播,试图优化它...该函数以点为单位返回当前所开仓位的最大缩水。传统上,你可以向函数传递参数,从而过滤出你需要分析的位置。
HH.附件包含一个测试函数GetDrawdownOpenPosInPoint()的脚本。
辩解,娜塔莎,为什么不呢?相反,在我看来,以相反的方向关闭月圆后减少一年是合乎逻辑的。在你刚才提到的表达方式中减少年份,就相当于在分针回绕一圈后,将时针向后移动一个小时。给我们提供你的功能版本,我们将讨论它...也许你的版本会比我的更成功。
我是这样推理的:假设我们需要确定Q7在过去和未来的起点,那么nq=-7和nq=7。Mathfloor 对过去会返回-2,对未来会返回+1(从文档中的函数描述来看),因此对于过去的情况,我们会比未来多减一年.....,如果我们继续对过去进行进一步计算,我们将不得不再次减少年份,最终我们会得到2009年.....。
不幸的是,由于缺乏时间(我几乎没有时间阅读网站页面),我无法提供我认为正确的代码,但我认为如果有必要,纠正它并不困难。
我是这样推理的:假设我们需要确定Q7在过去和未来的起点,那么nq=-7和nq=7。Mathfloor将返回过去的-2和未来的+1(从文档中对该函数的描述来看),因此对于过去的情况,我们将比未来多减一年.....,如果我们继续对过去进行进一步的计算,我们将不得不再次减少年份,最后我们将到2009年......
我同意你的推理,但你忘记了操作中涉及的数据类型。MathFloor() 可以完全省略。请看附件中的脚本结果。