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이므로 결과가 항상 0이기 때문에 MathMod (nq/4) 표현식에서 무엇을 얻는지 명확하지 않습니다. 0/4에는 나머지가 없기 때문에 두 번째 줄도 명확하지 않습니다. 설명 부탁드립니다.

 

질문해 주셔서 감사합니다. 덕분에 기능을 다시 확인해보니 오류가 있네요. 인라인

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

빼기 기호를 더하기로 바꿔야 합니다.

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

그리고 이제 질문의 요점으로. nq 는 항상 0과 같지 않습니다. 음수를 포함하여 모든 정수 값이 있을 수 있습니다. 지정한 행은 nq 가 4의 배수인 경우, 즉 4분기(1년)를 더하거나 빼야 하는 경우에 작동합니다.

 
KimIV :

질문해 주셔서 감사합니다. 덕분에 기능을 다시 확인해보니 오류가 있네요. 인라인

빼기 기호를 더하기로 바꿔야 합니다.

그리고 이제 질문의 요점으로. nq 는 항상 0과 같지 않습니다. 음수를 포함하여 모든 정수 값이 있을 수 있습니다. 지정한 행은 nq 가 4의 배수인 경우, 즉 4분기(1년)를 더하거나 빼야 하는 경우에 작동합니다.

답변 감사합니다, Igor .... 평소보다 더 오래 기능을 알아 냈지만 여전히 알아 냈습니다))))))) 같은 기능에서 연도를 줄일 필요가없는 것 같습니다 표현식:

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

그러면 모든 것이 옳을 것입니다.

 
Lisi4ka330 :

...같은 함수에서 표현에서 연도를 줄일 필요는 없는 것 같습니다...

정당화해, 나타샤, 왜 안 돼? 반대로 월간 순환 종료 후 연도를 반대 방향으로 줄이는 것이 논리적으로 보입니다. 당신이 지적한 표현에서, 연도를 줄이는 것은 분을 완전히 되감고 한 시간 후에 시침을 뒤로 움직이는 것과 같습니다. 기능의 고유한 버전을 가져와서 논의할 것입니다. 아마도 귀하의 버전이 저보다 더 성공적일 것입니다.
 

GetDrawdownOpenPosInPoint() 함수

글쎄, 나는이 기능에 대한 철저한 테스트를 마친 것 같습니다. 필요한 경우 스프레드를 고려하여 최적화하려고 했습니다... 이 함수는 현재 열려 있는 포지션의 최대 손실을 포인트 단위로 반환합니다. 일반적으로 매개변수를 함수에 전달하여 분석에 필요한 위치를 필터링할 수 있습니다.

  • sy - 도구 이름. 이 매개변수를 설정하면 이 기능은 지정된 기기의 위치만 확인합니다. NULL 은 현재 도구를 의미하고 "" (기본값)은 모든 도구를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID(MagicNumber). 기본값은 -1 - 모든 마법입니다.
  • 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);
}

추신. GetDrawdownOpenPosInPoint() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.

 
KimIV :
정당화해, 나타샤, 왜 안 돼? 반대로 월간 순환 종료 후 연도를 반대 방향으로 줄이는 것이 논리적으로 보입니다. 당신이 지적한 표현에서, 연도를 줄이는 것은 분을 완전히 되감고 한 시간 후에 시침을 뒤로 움직이는 것과 같습니다. 기능의 고유한 버전을 가져와서 논의할 것입니다. 아마도 귀하의 버전이 저보다 더 성공적일 것입니다.

저는 이렇게 추론했습니다. 과거와 미래의 7분기 시작을 결정해야 한다고 가정해 보겠습니다. 그런 다음 각각 nq= -7 및 nq=7입니다. Mathfloor 는 과거에 대해 -2를 반환하고 미래에 대해 +1을 반환합니다(문서의 기능 설명에 따라). 따라서 과거 상황에 대해 미래에 추가하는 것보다 1년 더 뺍니다.... .. 과거에 대한 추가 계산을 계속하면 연도를 다시 줄여야 하고 2009년에 자신을 찾을 수 있습니다 .....

안타깝게도 시간이 부족하여(사이트 페이지를 읽을 시간이 거의 없음) 지금 제 생각에 정확한 코드를 제공할 수 없지만 필요한 경우 수정하는 것이 어렵지 않을 것이라고 생각합니다.

 
Lisi4ka330 :

저는 이렇게 추론했습니다. 과거와 미래의 7분기 시작을 결정해야 한다고 가정해 보겠습니다. 그런 다음 각각 nq= -7 및 nq=7입니다. Mathfloor는 과거에 대해 -2를 반환하고 미래에 대해 +1을 반환합니다(문서의 기능 설명에 따라). 따라서 과거 상황에 대해 미래에 추가하는 것보다 1년 더 뺍니다.... . 과거에 대한 추가 계산을 계속하면 연도를 다시 줄여야하고 2009 년에 자신을 찾을 수 있습니다 ...

나는 당신의 추론에 동의하지만 작업과 관련된 데이터 유형을 잊어 버렸습니다. MathFloor() 함수 는 완전히 생략할 수 있습니다. 첨부 파일에서 스크립트의 출력을 참조하십시오.

파일:
test.mq4  1 kb
 
안녕하세요, 이고르))))) 솔직히 말씀드리면 답변이 잘 이해가 안 되었고 첨부된 대본에서도 명확히 설명이 안되어 오히려 그 반대입니다...)))) 하지만 시간이 지나면 알게 되리라 생각합니다 )))) 리턴 라인 ( StrToTime ( ye + " . " + mo + " .01 " ))에 플러스가 있는 이유를 알려주세요.