KimIVの便利な機能 - ページ 110

 
分かりやすい説明ありがとうございます、これで次に進みます))))。
 

関数 WritingLineInFile()。

この関数を書き直し、パラメータfsを 追加しました。このパラメータは、テーブルヘッダなど、他の行とは異なるファイルの最初の行を書き込むことができます。行の長さが0より大きく、かつファイルサイズが0であるという2つの条件が同時に満たされた場合のみ、1行目がファイルに書き込まれます。また、旧バージョンとの互換性を保つため、新しいパラメータはオプションとしました。

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

ZZY 機能をテストするためのスクリプトを添付します。

ファイル:
 
イゴールさん、こんばんは! 機能で立ち止まりました
DateBeginQuarter

まずセリフの理解に努めています。

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

MathMod(nq/4)式の結果は常に0となり、何を得るのかが不明です。

 

ナターシャさん、ご質問ありがとうございます。おかげさまで、機能を再確認し、エラーを見つけることができました。ライン内

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

マイナス記号をプラス記号に置き換えたいのですが。

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

そして、質問の本質に迫ります。nqは 常に0に等しいとは限りません。負の値も含め、任意の整数値が存在しうる。これらの行は、nqが 4の倍数のとき、つまり、4四半期(年)を足したり引いたりする必要があるときに機能します。

 
KimIV:

ナターシャさん、ご質問ありがとうございます。おかげさまで、機能を再確認し、エラーを見つけることができました。ライン内

マイナス記号をプラス記号に置き換えたいのですが。

そして、質問の本質に迫ります。nqは 常に0に等しいとは限りません。負の値も含め、任意の整数値が存在しうる。指定した行は、nqが 4の倍数の場合、つまり4四半期(年)を足したり引いたりする必要がある場合に機能します。

イゴールさん、お返事ありがとうございます...。を扱うのにいつもより時間がかかりましたが、それでもわかりました)))))))))))))))))))))))))))))同じ関数では、式中の年を減らす必要はないようです。

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

であれば、正しく表示されます。

 
Lisi4ka330:

...同じ関数で、式中の年を減らす必要はないと思うのですが...。

ジャスティファイ、ナターシャ、なぜダメなの?逆に月の輪を閉じた後の年を減らすのが理にかなっているように思います。あなたの表現では、年を小さくすることは、分針を1周巻き戻した後に時針を1時間戻すことと同じです。あなたのバージョンの機能を教えてください、そして議論しましょう...。もしかしたら、あなたのバージョンは私のより成功するかもしれませんね。
 

GetDrawdownOpenPosInPoint()関数

さて、この機能の徹底的なテストは終了しました。必要な部分には広がりを考慮し、最適化を図り...。この関数は、現在開いているポジションの最大ドローダウンを pips 単位で返します。従来は、関数にパラメータを渡すことで、分析に必要なポジションをフィルタリングすることができました。

  • 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:
ジャスティファイ、ナターシャ、なぜダメなの?逆に月の輪を閉じた後の年を減らすのが理にかなっているように思います。先ほどの表現で年を縮めるというのは、分針を1周巻き戻した後に、時針を1時間戻すのと同じことです。あなたのバージョンの機能を教えてください、そして議論しましょう...。もしかしたら、あなたのバージョンは私のより成功するかもしれませんね。

過去と未来でQ7の開始を決める必要があるとすると、それぞれnq=-7、nq=7と推論しました。Mathfloorは 過去に対して-2、未来に対して+1を返すので(ドキュメントの関数説明から判断)、過去の状況に対して、未来に足す年よりも1年多く引くことになります...過去に対してさらに計算を続けると、また年を減らさなければならず、結局2009年になります..........。

残念ながら時間がないため(サイトページを読む時間がほとんどない)、正しいと思われるコードを提供することはできませんが、必要であれば、修正することは難しくないと思います。

 
Lisi4ka330:

過去と未来でQ7の開始を決める必要があるとすると、それぞれnq=-7、nq=7と推論しました。Mathfloorは過去に対して-2、未来に対して+1を返すので(ドキュメントの関数の説明から判断すると)、過去の状況に対して、未来に足すよりも1年多く引くことになります...過去に対してさらに計算を続けると、年をまた減らさなければならず、結局2009年になります......。

その理由には賛成ですが、操作に関わるデータ型を忘れていますね。MathFloor()は 完全に省略することができる。添付ファイルのスクリプトの結果をご覧ください。

ファイル:
test.mq4  1 kb
 
こんにちは、イゴールさん)))正直なところ、あなたの回答がよく理解できず、添付のスクリプトでも明確にならず、むしろ逆になってしまいました... )))) でも、そのうち理解できると思います))))
返り値StrToTime(ye+"."+mo+".01") の行にプラスがある理由を教えてください。