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

 
Ais :

안녕하세요 카메오펙스입니다.
친절한 답변 감사합니다.
이 코딩 시스템은 매우 간단하고 쉽습니다.
모두 MetaEditor에서 수동으로 수행됩니다.
실제로 시스템은 대용량 프로그램을 쉽고 빠르게 개발할 수 있도록 설계되고 있습니다.
또한 시스템은 유연하고 안정적이어야 합니다.
친애하는!

Ais님, 답변 감사합니다. 나는 당신의 게시물에서 많은 것을 배웠습니다 :)

카메오

 

안녕 친구들!

과거의 한 가지가 날마다 나를 지배합니다.
이것은 AIS5 Trade Machine에 대한 문서입니다.
신이 결정하는 대로 돌아오겠습니다.

일단은 안녕!

 

안녕하세요 아이스
당신의 부재는 매우 그리울 것입니다. 잘 지내세요.
우리는 당신의 반환을 환영합니다.
당신의 친구, 건배

 

안녕하세요 아이스
돌아오시는 대로 더 많은 질문을 드려 죄송합니다. 특히 귀하의 시스템이 아닙니다. 대부분의 모든 프로그램에서 이 문제가 있습니다. 사용자 정의 함수 와 관련이 있습니다. 사용자 정의 함수는 어떻게 정의를 얻습니까?
예를 들어:

 int        iSignalOpen ()     //       - i      17 l       1 o     //< This is what iSignalOpen function will do.....
{                                                                 //< When the chart is opened, first pass..
if     ( ( iTradeBarTime    == iTime   ( 0 , 0 , 0 ) )   //< false input, EMPTY == (0,0,0)------|
      &&         //                                         &&                                 |--(return)EMPTY
      ( iTradeBarOnce    == 1 ))                         //< true  input, 1 == 1 ---------------|
       return ( EMPTY);
      
// This proves, 'EMPTY' will always be returned when the chart first opens. At the next tick...       
// ... 'iTime' will have parameters, example: (EUR/USD,HOUR_1,1) it is a predefined function so that...
// ... these parameters will be collected so that an expression can be calculated. Where as the... 
// ... 'iTradeBarTime' is not predefined. 'iTradeBarTime' was assigned 'EMPTY' at declaration earlier in the program.
// 'iTradeBarTime' knows that it is 'EMPTY'and nothing else. 
// When and how did 'iTradeBarTime' get deifined to collect data so that it's value can be other than 'EMPTY'? 
// The 'iTradeBarTime' has to have the same values as the 'iTime', or the input will never be 'true'?
// If it is never 'true', the return is always 'EMPTY'? 
책이나 포럼에서 확고한 답을 찾지 못하는 것 같습니다. 릴레이 로직 회로도에서 AND 게이트는 위의 예와 동일하게 작동합니다. 2개의 '참' 입력이 있는 경우에만 '참' 출력이 있게 됩니다. 그래야만 제어가 계속됩니다.
당신의 응답을 기다리는. 미리 감사드립니다.
건배
 

안녕하세요 허클베리

코드의 이 부분을 명확히 합시다.

1. 아마도 주요 어려움:
1.1. 모든 인간은 다르게 생각하고 행동합니다.
1.2. 나는 엄격하게 제한된 수의 데이터 유형을 사용하는 것을 좋아합니다.
1.3. "표준" 데이터 유형만 사용하고 싶습니다.
1.3.1. "인트",
1.3.2. "더블",
1.3.3. "끈";
1.4. 나는 특별한 경우에만 다른 데이터 유형을 사용합니다.
1.5. 내 프로그램 요소의 유형을 이름의 첫 번째 위치에 소문자로 표시합니다.
1.5.1. "int" 데이터 유형의 경우 "i",
1.5.2. "이중" 데이터 유형의 경우 "d",
1.5.3. "문자열" 데이터 유형의 경우 "s",
1.5.4. "정의되지 않은" 데이터 유형의 경우 "r";
1.6. 이 프로그래밍 기술은 유형 캐스팅을 제어하는 데 도움이 됩니다.
1.7. 미리 정의된 함수와 상수는 다음 데이터 유형도 가질 수 있습니다.
1.7.1. "불",
1.7.2. "색깔",
1.7.3. "날짜 시간";
1.8. 저는 항상 이러한 유형을 "int" 유형으로 캐스트하려고 합니다.
1.9. 오늘날 내 데이터 캐스팅은 일반적으로 암시적입니다.
1.10. 내 프로그래밍 기술의 몇 가지 필수 사항:
1.10.1. 저는 "TRUE" 및 "FALSE" 상수 쌍 대신 "TRUE" 및 "EMPTY" 상수 쌍을 사용하는 것을 좋아했습니다.
1.10.2. "if" 문에서 때때로 "TRUE"와 "FALSE" 대신 "1"과 "0"을 사용했습니다.
1.10.3. 부호 없는 데이터 요소에 대한 잘못된 결과를 나타내기 위해 음수 값 "-1"과 함께 상수 "EMPTY"를 사용했습니다.
1.10.4. 앞으로는 이름에 "b" 접두사가 있는 "bool" 유형을 사용할 것입니다.

2. 다음과 같은 MQL4 데이터 유형에 대해 알아야 합니다.
2.1. "int"는 -2147483648에서 2147483647 사이의 값을 갖는 <!>부호 있는</!> 긴 4바이트 정수입니다.
2.2. "datetime"은 0에서 4294967295 사이의 값을 갖는 <!>부호 없는</!> 긴 4바이트 정수입니다.
2.3. "datetime" 값을 "int" 변수에 할당하면 대략 2038.01.01까지 올바른 결과를 얻을 수 있습니다.

3. 다음과 같은 "iTime ( symbol, timeframe, shift )" 기능에 대해 알아야 합니다.
3.1. 이 함수는 항상 "datetime" 유형의 값을 반환합니다.
3.2. 반품에는 2가지 다른 경우가 있습니다.
3.2.1. 로컬 히스토리가 비어 있으면 "0";
3.2.2. 다른 모든 경우에 "shift"로 표시된 막대의 개방 시간 ;
3.3. "iTime ( 0, 0, 0 )"은 현재 차트의 0 막대에 대한 오픈 시간을 반환합니다.
3.4. 0 막대는 동일하지만 "iTime ( 0, 0, 0 )"은 동일한 값을 반환합니다.
3.5. 현재 제로 바가 완성되면 이 바는 1번 바가 되며 새로운 제로 바 형성이 시작됩니다.
3.6. "iTime ( 0, 0, 0 )"은 새 값을 반환합니다.
3.7. 따라서 "iTime ( 0, 0, 0 )"의 값은 0 막대가 변경될 때 변경됩니다.

4. "2.2.3.1. 이력 데이터 검사" 프로그램 블록에서 빈 이력으로 작업을 방지했습니다.

5. "iTryClose" 기능에서 주문이 성공적으로 종료되면 "iTradeBarTime = iTime ( 0, 0, 0 ) ;"을 할당합니다.

6. "iSignalOpen" 기능에서 "iTradeBarTime == iTime ( 0, 0, 0 ) )"인지 검사합니다.

7. "iTradeBarOnce = 1"에 의하여 반복매매가 금지된 경우 그런 다음 "EMPTY" 값으로 신호를 여는 것을 금지합니다.

건배

 

안녕하세요 아이스
당신의 응답을 주셔서 감사합니다. 나는 이것에 대해 공부하고 곧 돌아올 것입니다.
건배

 

안녕하세요 에이스입니다.
답변이 느려 죄송합니다. 월요일에 본업으로 다시 일을 시작했습니다. 요즘은 시간이 좀 짧습니다. 공부시간이 더 짧습니다.
이 스레드에서 이전에 언급했듯이 저는 모든 것을 너트와 볼트로 분해하는 것을 좋아합니다. 한 스프로킷이 다른 스프로킷 등에 어떻게 동력을 제공합니까? 그래서 저는 프로그램 내의 컨트롤이 매력적이라는 것을 발견했습니다. 당신이 제공한 인내와 지식에 대해 나는 당신 모두에게 합당한 존경을 표하지만 2.2.3.1 블록이 필요한 이유에 대해 질문이 있음을 이해하십시오.
어떻게 iBaseLag + iBaseBar가 표현식이 될 수 있습니까?
iBaseLag 및 iBaseBar가 iHighest 및 iLowest 매개변수 내에 있음을 이해했습니다. 명시적인 숫자가 아닌 한,
정확한 숫자를 어떻게 결정할 수 있습니까? iBaseLag는 평균 계산에 사용되는 20개의 막대를 나타내는 20입니다.
iBaseBar는 막대 평균이 시작되어야 하는 위치를 나타냅니다. 막대 1부터 20까지, 이 경우 막대 0은 고려되지 않습니다.
나는 자유로이 프로그램을 /* 2.2.3.1*/로 단축했다. 프로그램을 테스트하고 동일한 결과를 찾았습니다. 실제 거래 조건에서 프로그램을 실행할 때 이것은 좋은 생각이 아닐 수 있습니다.
당신의 테이크는 무엇입니까?
또한 블록 2.1.2에 대한 설명에서 내 혼란을 설명했습니다. iTime은 0 막대의 열린 시간 을 반환합니다.
iTradeBarTime은 유형 캐스트 날짜/시간이기도 합니다. 프로그램은 거래가 발생한 막대를 알고 있으므로 막대당 하나의 거래만 가능합니다. . . iTradeBarOnce == 1
고맙습니다
앞으로 더 공부하겠습니다. 그러나 예약된 블록 2.1.1을 기존 위치에 추가 위치를 제공하는 기능에 사용할 수 있습니까? 예: 기존의 롱에 3개 이상의 롱을 추가하시겠습니까?
프로그램에 이미 있는 기능으로 추가 위치와 충돌이 있습니까?
모든 것에 다시 한 번 감사드립니다. 잘있어
건배

 

안녕하세요 허클베리입니다.

블록 2.2.3.1을 포함하여 프로그램의 주요 부분을 주의 깊게 살펴보겠습니다.

 ////////////////////////////////////////////////////////////////////<        14>
// < 2.2.3. Code : Special : Start >                              //<          >
int       start   ()         //       - i       9 l       - o     //<          >
{                                                                 //<          >
// < 2.2.3.1. History data inspection 4 >`````````````````````````//<          >
static    int       iTrigger   = 0       ; if ( iTrigger == 0 ) { //<          >
  if  ( ( iTime ( 0 , 0 , 0 ) == 0                          )     //<          >
  ||    ( iBars ( 0 , 0     )  < iBaseLag     + iBaseBar    ) )   //<          >
          return                         ; else iTrigger  = 1 ; } //<          >
// </2.2.3.1. History data inspection 4 >`````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
int       iTicket           = iGetTicket ()                     ; //<          >
//                                                                //<          >
if      ( iTicket < 0 )       iTryOpen   ()                     ; //<          >
else                          iTryClose  ()                     ; //<          >
// </2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
int       iTrap   =           GetLastError ()                   ; //<          >
if      ( iTrap   > 0 )       Alert  ( "Exception " , iTrap   ) ; //<          >
// </2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
}                                                                 //<          >
// </2.2.3. Code : Special : Start >                              //<          >
////////////////////////////////////////////////////////////////////<         0>

이 코드는 다음과 같은 방식으로 작동합니다.

1. 프로그램의 맨 처음 블록인 블록 2.2.3.1.은 간단한 트리거입니다.
1.1. "static int iTrigger"는 "정적"과 같은 프로그램의 전체 수명 동안 고유한 값을 저장합니다.
1.2. 처음에는 "iTrigger == 0";
1.3. "if ( iTrigger == 0 )" 문은 각 틱에서 실행됩니다.
1.4. 처음으로 "iTrigger == 0"일 때 이력 데이터 검사는 블록 {..} 내부에서 실행됩니다.
1.5. 히스토리 데이터가 잘못된 경우 "return;" 실행된다;
1.6. 메인 함수 "start()"의 실행이 종료되었음을 의미합니다.
1.7. 다음 틱 문에서 "if ( iTrigger == 0 )"가 다시 실행됩니다.
1.8. 기록 데이터가 정확하면 "iTrigger = 1 ;" 실행된다;
1.9. 그런 다음 주 기능 "start()"의 실행이 계속됩니다.
1.10. 다음 틱 문에서 "if ( iTrigger == 0 )"가 다시 실행됩니다.
1.11. 현재와 미래의 "iTrigger" 값은 정적이기 때문에 항상 "== 1"입니다.
1.12. 따라서 미래의 역사에서 데이터 검사는 항상 건너뛸 것입니다.
1.13. 이것이 간단한 방아쇠입니다.

2. 이력 데이터 검사는 두 부분으로 구성됩니다.
2.1. 로컬 기록이 비어 있는지 확인 "iTime ( 0, 0, 0 ) == 0";
2.2. 로컬 히스토리의 크기가 "iATR ( 0, 0, iBaseLag, iBaseBar )" 계산에 충분한지 확인합니다. 여기서:
2.2.1. "iBaseBar"는 "iATR"의 시작 막대입니다.
2.2.2. "iBaseLag"는 "iATR"에 대한 평균 막대 수입니다.
2.2.3. "iBaseLag + iBaseBar"는 일반적인 표현이며 결과는 항상 "iBaseLag"와 "iBaseBar"의 합입니다.
2.2.4. 다른 말로 표현하면 "iBaseLag + iBaseBar"는 "iBaseLag"와 "iBaseBar"의 합과 같습니다.
2.2.5. 블록 1.1.1의 프로그램 입력에서 "iBaseLag" 및 "iBaseBar"에 대한 값을 할당할 수 있습니다.
2.2.6. "iBaseLag = 100 ;" 및 "iBaseBar = 7 ;";
2.2.7.
그러면 계산을 위한 마지막 막대 번호가 #106이고 막대 번호 0이 항상 고려 되기 때문에 로컬 히스토리의 크기가 107 이상인 경우 "iATR( 0, 0, iBaseLag, iBaseBar )"의 올바른 계산이 가능합니다 .

모든 프로그램에 기능을 원하는 만큼 추가할 수 있습니다. 블록 2.1.1은 가능한 구현의 샘플을 보여줍니다.
추가 직위를 제공하려면 기능 2.1.4보다 훨씬 더 복잡한 직위 분석 및 관리 코드가 필요합니다.
그러나 모든 것이 가능합니다.

건배

 

안녕하세요 아이스
빠른 답변 감사합니다. 나는 당신이 말한 많은 것을 따를 수 있습니다. 특히 iATR 기능 에 대해. iBaseLag + iBasebar 표현을 사용하는 것 자체가 공식의 예외적인 부분이라는 귀하의 말. 정의된 함수의 매개변수에 포함해야 하거나 허용되지 않는다는 인상을 받았습니다. 진행할 수 있는 막대가 실제로 충분한 경우 로컬 히스토리의 크기를 확인하기 위한 것입니다. 그게 지적하시는건가요? 더 많은 단계가 있지만 목표를 달성하는 데 필요한 단계입니다. 간과하거나 당연하게 여길 수 있는 단계.
나머지는 더 씹어먹을게. 시간 내 주셔서 감사합니다.
건배

 

안녕하세요 허클베리
MQL4는 특히 예를 들어 C 또는 어셈블러와 비교할 때 매우 친숙한 환경입니다.
다양한 검사 및 기타 트릭에 대한 요구 사항이 크게 줄어듭니다.
그러나 개발 환경에 최대한의 가능한 검사를 구현하면 항상 성능이 저하됩니다.
어떤 식으로든 프로그래머는 항상 프로그램의 잘못된 동작에 대한 책임이 있습니다.
따라서 예를 들어 경계의 기본 손상보다 중복 재확인이 더 좋습니다.
건배