종료 문제, 도와주세요 - 페이지 5

 

안녕하세요 아이스
귀하의 응답은 기쁘게 생각합니다. 복잡성을 이해하는 데 도움이 되고 복잡성을 줄이는 데 도움이 된다는 말을 듣는 것은 제가 요청할 수 있는 것 이상이었습니다. 나는 당신의 관대함 앞에 겸손합니다. 고맙습니다.
귀하의 프로그램에서 주석 구조에 관해 질문이 있습니다. 진행한 생각의 기차에서 벗어나고 싶은 것이 아니라 형식이 어떻게 보이는지에 대한 질문이 나에게 익숙하지 않습니다.

예시:

// < 4개 도메인의 17개 요소 구조 > //< >
// < 1. 데이터 2개 도메인의 8개 요소 /> //< >
// < 2. 2개의 도메인에 9개의 요소를 코드화합니다. /> //< >
// </4개 도메인의 17개 요소 구조 > //< >
// //< >
// < 1. 데이터 8 = 5 i 3 d - s > //< >
// < 1.1. 입력 7 = 4 i 3 d - s /> //< >
// < 1.2. 버퍼 1 = 1 i - d - s /> //< >
// </1. 데이터 8 = 5 i 3 d - s > //< >
// //< >

댓글이 너무 정교하게 구성되어 있습니다. 제목과 하위 주석으로 내가 읽은 것을 설명하는 가장 좋은 방법이 될 것입니다. 주석이 코드 기계에 의해 개발되고 형식화되거나 구조화되는 것처럼?? 인상적이다. 제가 댓글을 다 이해한 것은 아닙니다. 조직에서 당신의 능력은 상쾌합니다.

다시 감사합니다. 나는 프로그램을 공부할 것이고 가까운 장래에 더 많은 질문을 할 것입니다.
건배

 

안녕하세요 허클베리

소식을 듣게 되어 기쁩니다.


1. 구조

구조는 내가 직접 개발하고 형식을 지정합니다.

 //                                                                //<          >
// < Structure             16 elements  in      4 domains       > //<          >
// < 1. Data                7 elements  in      2 domains      /> //<          >
// < 2. Code                9 elements  in      2 domains      /> //<          >
// </Structure             16 elements  in      4 domains       > //<          >
//                                                                //<          >
     

첫 번째 의도는 전역 데이터와 코드를 엄격하게 분리하는 것입니다.
저에게 컴퓨터 프로그램은 현실 세계의 모델입니다.
글로벌 데이터는 이 세상의 것입니다.
코드는 일련의 작업입니다.
그것들을 구분하고 나는 밑줄을 그어 그 차이점을 이해하고 있습니다.
요소 수를 세는 것은 프로그램 내부의 모든 것을 확인하고 제어하는 데 도움이 됩니다.


2. 서식

서식 지정은 간단한 HTML입니다.
다음 태그는 프로그램의 일부를 엽니다.

 // <                                                            > //<          >
      


다음 태그는 프로그램의 일부를 닫습니다.

 // </                                                           > //<          >
      


다음 태그는 한 줄의 프로그램 부분에 사용됩니다.

 // <                                                           /> //<          >
      

이제 태그의 끝 부분이 페이지 계산에 사용됩니다.
태그의 이 부분의 향후 사용은 확장될 수 있습니다.

                                                                   //<          >
      

페이지 구조는 프로그램을 쉽게 탐색하는 데 도움이 됩니다.
<Page Up>과 <Page Down>을 사용하면 항상 같은 위치에 같은 유형의 태그가 표시됩니다.


3. 요소

데이터 요소는 단일 전역 변수입니다.
배열도 단일 요소로 봅니다.
지역 변수는 코드 요소의 임시 엔티티일 뿐입니다.

코드 요소는 단일 기능 입니다.
또한 "방법"이라는 단어를 사용할 수 있습니다.
통합된 기능 집합에 대해 "인터페이스"라는 단어를 사용합니다.

복잡성을 줄이기 위해 논리적 도메인에서 데이터와 코드를 나눕니다.
도메인 수는 프로그램 구조에 따라 다릅니다.
데이터의 일반적인 도메인: "입력", "설정", "제어", "버퍼" ..
코드의 일반적인 도메인: 특수 기능 세트의 경우 "특수", 기타 기능 세트의 경우 "인터페이스".
큰 프로그램의 경우 다른 "인터페이스"로 "객체"를 만들 수 있습니다.

데이터 요소 및 코드 요소의 무결성을 제어하기 위해 계수가 사용됩니다.

 //                                                                //<          >
// < 1. Data                7 =       4 i       3 d       - s   > //<          >
// < 1.1. Input             7 =       4 i       3 d       - s  /> //<          >
// < 1.2. Buffer            - =       - i       - d       - s  /> //<          >
// </1. Data                7 =       4 i       3 d       - s   > //<          >
//                                                                //<          >
// < 2. Code                9 /       - i      82 l       4 o   > //<          >
// < 2.1. Interface         6 /       - i      71 l       4 o  /> //<          >
// < 2.2. Special           3 /       - i      11 l       - o  /> //<          >
// </2. Code                9 /       - i      82 l       4 o   > //<          >
//                                                                //<          >
     

여는 태그와 닫는 태그는 동일한 합계를 포함합니다.
보통 여는 태그의 합계를 계산합니다.
그런 다음 닫는 태그 대신 여는 태그를 복사하여 삽입한 다음 닫는 슬래시 "/"를 추가하기만 하면 됩니다.

데이터 무결성을 제어하기 위해 다음 표기법이 사용됩니다.
"정수"의 데이터 요소 수는 "i"로 표시됩니다.
"double"의 데이터 요소 수는 "d"로 표시됩니다.
"string"의 데이터 요소 수는 "s"로 표시됩니다.
왼쪽 열에는 "i" + "d" + "s" 줄의 합계가 포함됩니다.

코드의 무결성을 제어하기 위해 다음 표기법이 사용됩니다.
함수 입력의 수, 즉 함수 인수의 수는 "i"로 표시됩니다.
열린 코드 줄 수는 "l"로 표시됩니다.
기능 출력의 수는 "o"로 표시됩니다.
값을 반환하는 단일 함수의 경우 항상 "1"이고 다른 모든 경우에는 "-"입니다.
왼쪽 열에는 도메인의 기능 수가 포함됩니다.


4. 도메인

이들은 도메인의 헤더입니다.

 ////////////////////////////////////////////////////////////////////<         2>
// < 1.1. Data : Input >                                          //<          >
//                                                                //<          >
// < 1.1. Input             7 =       4 i       3 d       - s   > //<          >
// <      1. Strategy       4 =       2 i       2 d       - s  /> //<          >
// <      2. Trading        3 =       2 i       1 d       - s  /> //<          >
// </1.1. Input             7 =       4 i       3 d       - s   > //<          >
//                                                                //<          >
     
 ////////////////////////////////////////////////////////////////////<         3>
// < 1.2. Data : Buffer >                                         //<          >
//                                                                //<          >
// < 1.2. Buffer            - =       - i       - d       - s   > //<          >
// </1.2. Buffer            - =       - i       - d       - s   > //<          >
//                                                                //<          >
     
 ////////////////////////////////////////////////////////////////////<         4>
// < 2.1. Code : Interface >                                      //<          >
//                                                                //<          >
// < 2.1. Interface         6 /       - i      71 l       4 o   > //<          >
// <      1. iNewBar                  - i       4 l       1 o  /> //<          >
// <      2. iSignalOpen              - i      15 l       1 o  /> //<          >
// <      3. iSignalClose             - i      15 l       1 o  /> //<          >
// <      4. iGetTicket               - i       7 l       1 o  /> //<          >
// <      5. iTryOpen                 - i      15 l       - o  /> //<          >
// <      6. iTryClose                - i      15 l       - o  /> //<          >
// </2.1. Interface         6 /       - i      71 l       4 o   > //<          >
 //                                                                //<          >
     
 ////////////////////////////////////////////////////////////////////<        11>
// < 2.2. Code : Special >                                        //<          >
//                                                                //<          >
// < 2.2. Special           3 /       - i      11 l       - o   > //<          >
// <      1. init                     - i       1 l       - o  /> //<          >
// <      2. deinit                   - i       1 l       - o  /> //<          >
// <      3. start                    - i       9 l       - o  /> //<          >
// </2.2. Special           3 /       - i      11 l       - o   > //<          >
//                                                                //<          >
     


계산 규칙 및 표기법은 프로그램 헤더와 동일합니다.
도메인 헤더의 여는 태그를 프로그램 헤더에 복사하기만 하면 됩니다.

도메인의 각 페이지에는 여는 태그와 닫는 태그가 있습니다.
예를 들어:

 ////////////////////////////////////////////////////////////////////<        12>
// < 2.2.1. Code : Special : Init >                               //<          >
..
// </2.2.1. Code : Special : Init >                               //<          >
     

선행 번호는 구조 부분의 계산 및 탐색에 사용됩니다.
그런 다음 프로그램 "데이터" 또는 "코드" 부분에 대한 표기법을 따릅니다.
그런 다음 도메인 이름을 따릅니다.
그런 다음 도메인 요소의 이름을 따릅니다.


도움이 될 수 있기를 바랍니다.

지금은 안녕히 계세요. 답장을 기다리겠습니다.

 

하이 아이스
당신의 조직 감각은 ...... 어떻게 말할 수 있습니까 ..... 실천적이고 분별력이 있습니다.
HTML을 통합하면 쉽게 탐색할 수 있지만 현재로서는 불가능합니다.
매우 좋은.
이때 보내주신 프로그램을 한 문장씩 해부하고 있습니다. 개념
당신은 변수에 대해 이해할 수 있습니다. 다시 감사합니다.
나는 내가 확신하는 질문으로 대답할 것이다.
안녕히 계세요

 

안녕하세요 에이스,,,<수정되었습니다>
프로그램은 아직 흡수되지 않았습니다. 시간이 너무 많이 소요되는 점 죄송합니다. 놓쳤을 부분이 있는데,
한 가지 오류가 있기 때문입니다.
지금은 가야 하지만 내일 돌아올 것입니다.
당분간은 안녕

 

안녕하세요 허클베리
예를 들어 일부 기능이 추가되었으며 쉽게 변경하거나 제거 할 수 있습니다.
프로그램의 개선은 영원한 과정입니다.
당분간은 안녕
:)

 
Ais wrote >>

안녕하세요 허클베리
예를 들어 일부 기능이 추가되었으며 쉽게 변경하거나 제거할 수 있습니다.
프로그램의 개선은 영원한 과정입니다.
당분간은 안녕
:)


안녕하세요 아이스
당신이 한 모든 일에 감사드립니다.
어젯밤 나는 당신의 프로그램을 복사하는 동안 마침내 내 실수를 발견했습니다.
현재 저는 일부 변수가 무엇을 위한 것이며 어떻게 작동하는지 이해하려고 노력하고 있습니다.
iSignalClose는 OrderClosePrice를 설정하기 위해 다른 프로그램의 일부를 삽입하는 곳입니다. 와 함께
당신의 제안:

dDelta = OrderOpenPrice() - OrderClosePrice

프로그램이 더 유연합니다.
더 많은 질문으로 돌아오십시오. 그리고 코멘트.
건배
 

안녕하세요 아이스
질문이 생겼습니다. 귀하의 프로그램은 ..... iTryOpen()

 else if      ( iCommand       == OP_BUY )
   {          
string         sType           = "Buy"    ;   
int            iColor          =   Blue    ;               }
else          
   {          sType           = "Sell"   ;    
              iColor          =   Red     ;           

내 호기심에서

 else if      ( iCommand       == OP_BUY  )
   {          
string         sType           = "Buy"    ;   
int            iColor          =   Blue    ;               }
else if      ( iCommand       == OP_SELL )   // Was this ommitted     
   {          sType           = "Sell"   ;    
              iColor          =   Red     ;               }
더 나은 이해를 위한 또 다른 질문입니다.
 // < 2.1.1. Code : Interface : iNewBar >                          //<          >
int        iNewBar ()         //       - i       4 l       1 o     //<          >
{                                                                 //<          >
static      int        iTime_0 = 0                                  ; //<          >
//                                                                //<          >
if       ( iTime_0 < iTime   ( 0 , 0 , 0 ) )                       //<          >
        { iTime_0 = iTime   ( 0 , 0 , 0 ) ;   return ( TRUE  ) ; } //<          >
else     {                                     return ( EMPTY ) ; } //<          >
//                                                  
iNewBar가 TRUE이면 제어가 iSignalOpen에 전달됩니다. iNewBar가 TRUE(현재 막대와 같음??) 또는 iFirstRun ==1이면 iFirstBar = 0입니다. 이것은 iNewBar() 정의 및/또는 iFirstRun 정의를 이해하지 못하기 때문에 혼란스럽습니다. iFirstRun이 선언되고 초기화되는 위치를 볼 수 있지만 그것이 의미하는 바는 무엇입니까?
이런 간단한 질문으로 부담을 드려 죄송합니다. 함수 내에서 두 가지가 어떻게 작동하는지 계산하거나 볼 수 없습니다. 시간되시면 정리좀 부탁드립니다.
귀하의 노력에 다시 한 번 감사드립니다. : )
건배
 

안녕하세요 허클베리

두 질문 모두 중요합니다!

답변 1.

두 조건 모두 참이지만 다음과 같은 경우:
1.1. 우리는 그것을 알고

 int       iCommand          = iSignalOpen ()                    ; //<          >
     

1.2. "iSignalOpen()"은 "EMPTY", "OP_BUY" 및 "OP_SELL"의 3가지 가능한 값만 반환할 수 있다는 것을 알고 있습니다.
1.3. 첫 번째 값이 이미 확인되었습니다.

 if      ( iCommand         == EMPTY  )                return    ; //<          >
     

1.4. 두 번째 값도 확인됩니다.

 if      ( iCommand         == OP_BUY )                            //<          >
     

계산 속도를 약간 높이기 위해 마지막 검사 "if"를 생략할 수 있습니다.

 else if     ( iCommand       == OP_SELL )                    //<          >
     


답변 2.

2.1. 바 번호 0의 열림 시간과 마지막으로 저장된 바 번호 0의 열림 시간을 비교하여 바 번호 0이 변경되었음을 인식합니다.
"iTime ( 0, 0, 0 )"은 현재 불완전한 막대의 여는 시간을 반환합니다.
현재 막대의 인덱스는 항상 0이며 "iTime ( 0, 0, 0 )"의 세 번째 값입니다.
변수 "int iTime_0"을 "정적"으로 선언하면 이 변수의 값이 함수 호출 사이에 저장됩니다.
개장 시간이 변경될 때마다 다음을 수행합니다.
2.1.1. 할당 "iTime_0 = iTime ( 0, 0, 0 ) ;" 현재 바의 오픈 시간을 저장하기 위해;
2.1.2. 현재 막대가 새 막대이고 마지막 막대 번호 0이 막대 번호 1이 됨을 의미하는 "TRUE"를 반환합니다.

 ////////////////////////////////////////////////////////////////////<         5>
// < 2.1.1. Code : Interface : iNewBar >                          //<          >
int       iNewBar ()         //       - i       4 l       1 o     //<          >
{                                                                 //<          >
static    int       iTime_0 = 0                                 ; //<          >
//                                                                //<          >
if      ( iTime_0 < iTime   ( 0 , 0 , 0 ) )                       //<          >
        { iTime_0 = iTime   ( 0 , 0 , 0 ) ;  return ( TRUE  ) ; } //<          >
else    {                                    return ( EMPTY ) ; } //<          >
}                                                                 //<          >
// </2.1.1. Code : Interface : iNewBar >                          //<          >
     

2.2. "iSignalOpen()"의 "dHigh" 및 "dLow" 및 "iSignalClose()"의 "dATR" 계산을 위한 시작 막대는 "iBaseBar=1"입니다.
막대 번호 1은 동일하지만 이러한 값은 동일합니다.
이러한 값을 새 막대에서만 계산하는 이유입니다.
이것은 프로그램의 속도를 높입니다.
"static int iFirstRun" 변수는 간단한 트리거입니다.
초기 값 "1"은 조건에 관계없이 첫 번째 프로그램 실행에서 "dHigh", "dLow" 및 "dATR"을 강제로 계산합니다.
이것은 프로그램의 신뢰성을 향상시킵니다.

<나중에 추가됨>
정확히 첫 번째 프로그램에서 "iSignalOpen()"에서 "iNewBar()"를 실행하면 "TRUE"가 반환되고 "iSignalClose"에서는 "EMPTY"가 반환됩니다!
이것은 "iSignalOpen()"의 첫 번째 실행 내부인 "iNewBar()"의 첫 번째 호출에서 "iTime_0 = 0"의 값과 "iNewBar()"의 두 번째 호출에서 첫 번째 내부에 있기 때문입니다. "iSignalClose()", "iTime_0 = iTime(0, 0, 0)" 실행!
결과적으로 첫 번째 실행 제어가 없는 경우 "dATR = 0"이 될 수 있습니다.
이것이 첫 번째 실행입니다.
</나중에 추가됨>

그 직후에 "iFirstRun = 0"을 할당하고 다음 조건은 새 막대에서만 true가 됩니다.

 if    ( ( iNewBar () == TRUE )   ||   ( iFirstRun  == 1 ) )       //<          >
     

하지만!
"iSignalOpen()" 및 "iSignalClose()"의 나머지 코드는 매 틱마다 실행됩니다!
변경되지 않은 값의 계산만 건너뜁니다.

 ////////////////////////////////////////////////////////////////////<         6>
// < 2.1.2. Code : Interface : iSignalOpen >                      //<          >
int       iSignalOpen ()     //       - i      15 l       1 o     //<          >
{                                                                 //<          >
static    int                           iFirstRun   = 1         ; //<          >
if    ( ( iNewBar () == TRUE )   ||   ( iFirstRun  == 1 ) )       //<          >
        {                               iFirstRun   = 0         ; //<          >
          int iIndexH = iHighest      ( 0 , 0    , MODE_HIGH  ,   //<          >
                                        iBaseLag , iBaseBar   ) ; //<          >
          int iIndexL = iLowest       ( 0 , 0    , MODE_LOW   ,   //<          >
                                        iBaseLag , iBaseBar   ) ; //<          >
          static double dHigh ; dHigh = High     [ iIndexH    ] ; //<          >
          static double dLow  ; dLow  = Low      [ iIndexL    ] ; //<          >
        } // if                                                   //<          >
//                                                                //<          >
double    dAsk    = MarketInfo        ( Symbol () , MODE_ASK  ) ; //<          >
if      ( dAsk    > dHigh )             return    ( OP_BUY    ) ; //<          >
//                                                                //<          >
double    dBid    = MarketInfo        ( Symbol () , MODE_BID  ) ; //<          >
if      ( dBid    < dLow  )             return    ( OP_SELL   ) ; //<          >
//                                                                //<          >
                                        return    ( EMPTY     ) ; //<          >
}                                                                 //<          >
// </2.1.2. Code : Interface : iSignalOpen >                      //<          >
     


도움이 될 수 있기를 바랍니다.
건배!
:)

추신: 나중에 몇 가지 설명이 추가되었습니다.
그리고 이러한 지적을 보면 분명히 "iNewBar()"가 수정되어야 함을 알 수 있다.
이는 이 함수가 단일 이벤트를 확인하기 위해 두 번 호출되었기 때문입니다.
이제 첫 번째 호출에서 동일한 이벤트에 대해 "iNewBar()"는 올바른 값을 반환하고 두 번째 호출에서는 잘못된 값을 반환합니다.
수정됩니다.



 

하이 아이스
설명해주셔서 감사합니다. 더 많은 독서로 이어지겠습니다. 아직 코드에 대한 완전한 핸들이 없습니다.
그런데 아이뉴바까지 수정해야 할 부분이 있다고 하셨죠?? iNewBar 가 백테스트에서 밝혀진 문제에 대해 잘못이 있는지 확신할 수 없습니다. 가능한 두 가지 문제??
다음은 백테스트 후 차트를 열었을 때 본 것입니다. Ask가 지난 20개 막대 중 가장 높은 값보다 높을 때 Buy 항목이 있다는 것을 알고 있습니다. 매도는 정반대입니다. 그러나 항목이 일관되지 않습니다. 본 지역이 맞나요?
한 가지 더 찾았습니다. Hard Stop은 Atr*2로 계산됩니다. 이것은 정확하지만 이것이 어디에서 계산되는지 알 수 없습니다. 그러나 진짜 문제는 TakeProfit의 Atr*2 계산이 동일하다는 것입니다. Hard Stop이 계산되는 위치를 알고 있다면 TakeProfit을 수정할 수 있습니다. 이 경우 TakeProfit은 Atr*1이어야 합니다.
몸조심하시고 내일 다시 오겠습니다.
건배

 

안녕하세요 허클베리

TakeProfit 조건은 테스트 목적으로 제가 직접 개발했습니다.
이제 변경되었습니다.
"Atr*2" 및 "Atr*1" 대신 "dATR * dFactorTP"를 "dATR * dFactorSL"로 사용합니다.
초기 값 "dFactorTP = 1.0" 및 "dFactorSL = 2.0"은 2페이지 "데이터: 입력"에 있습니다.
이러한 솔루션을 사용하면 이러한 값을 쉽게 최적화 할 수 있습니다.

"iSignalOpen()" 및 "iSignalClose()" 기능을 변경했습니다.
이제 새 막대 확인이 이러한 기능에서 구현됩니다.
"iSignalOpen()"에서 "구매" 및 "판매"에 대한 조건은 아마도 맞는 것 같습니다.

전체 프로그램은 다음 페이지의 첨부 파일에 있습니다.

건배

사유: