//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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であるという2つの条件が同時に満たされた場合のみ、1行目がファイルに書き込まれます。また、旧バージョンとの互換性を保つため、新しいパラメータはオプションとしました。
WritingLineInFile()関数のパラメータ。
ZZY 機能をテストするためのスクリプトを添付します。
DateBeginQuarter
まずセリフの理解に努めています。
MathMod(nq/4)式の結果は常に0となり、何を得るのかが不明です。
ナターシャさん、ご質問ありがとうございます。おかげさまで、機能を再確認し、エラーを見つけることができました。ライン内
マイナス記号をプラス記号に置き換えたいのですが。
そして、質問の本質に迫ります。nqは 常に0に等しいとは限りません。負の値も含め、任意の整数値が存在しうる。これらの行は、nqが 4の倍数のとき、つまり、4四半期(年)を足したり引いたりする必要があるときに機能します。
ナターシャさん、ご質問ありがとうございます。おかげさまで、機能を再確認し、エラーを見つけることができました。ライン内
マイナス記号をプラス記号に置き換えたいのですが。
そして、質問の本質に迫ります。nqは 常に0に等しいとは限りません。負の値も含め、任意の整数値が存在しうる。指定した行は、nqが 4の倍数の場合、つまり4四半期(年)を足したり引いたりする必要がある場合に機能します。
イゴールさん、お返事ありがとうございます...。を扱うのにいつもより時間がかかりましたが、それでもわかりました)))))))))))))))))))))))))))))同じ関数では、式中の年を減らす必要はないようです。
であれば、正しく表示されます。
...同じ関数で、式中の年を減らす必要はないと思うのですが...。
GetDrawdownOpenPosInPoint()関数
さて、この機能の徹底的なテストは終了しました。必要な部分には広がりを考慮し、最適化を図り...。この関数は、現在開いているポジションの最大ドローダウンを pips 単位で返します。従来は、関数にパラメータを渡すことで、分析に必要なポジションをフィルタリングすることができました。
HH. 関数 GetDrawdownOpenPosInPoint() をテストするためのスクリプトが添付されています。
ジャスティファイ、ナターシャ、なぜダメなの?逆に月の輪を閉じた後の年を減らすのが理にかなっているように思います。先ほどの表現で年を縮めるというのは、分針を1周巻き戻した後に、時針を1時間戻すのと同じことです。あなたのバージョンの機能を教えてください、そして議論しましょう...。もしかしたら、あなたのバージョンは私のより成功するかもしれませんね。
過去と未来でQ7の開始を決める必要があるとすると、それぞれnq=-7、nq=7と推論しました。Mathfloorは 過去に対して-2、未来に対して+1を返すので(ドキュメントの関数説明から判断)、過去の状況に対して、未来に足す年よりも1年多く引くことになります...過去に対してさらに計算を続けると、また年を減らさなければならず、結局2009年になります..........。
残念ながら時間がないため(サイトページを読む時間がほとんどない)、正しいと思われるコードを提供することはできませんが、必要であれば、修正することは難しくないと思います。
過去と未来でQ7の開始を決める必要があるとすると、それぞれnq=-7、nq=7と推論しました。Mathfloorは過去に対して-2、未来に対して+1を返すので(ドキュメントの関数の説明から判断すると)、過去の状況に対して、未来に足すよりも1年多く引くことになります...過去に対してさらに計算を続けると、年をまた減らさなければならず、結局2009年になります......。
その理由には賛成ですが、操作に関わるデータ型を忘れていますね。MathFloor()は 完全に省略することができる。添付ファイルのスクリプトの結果をご覧ください。
返り値(StrToTime(ye+"."+mo+".01") の行にプラスがある理由を教えてください。