초보자의 모험 - 페이지 10

 
niko :
당신의 소원은 내 명령입니다 (나는 '하이 플라이어'라고 말하려고했지만 온라인 사전을 확인했는데 분명히 무례한 코멘트, 신경 쓰지 않았습니다)

확인. 나는 당신이 지금 내 취향에 너무 임의적이기 때문에 간단히 살펴 보았습니다.

내 코드의 최신 버전을 기반으로 변경하지 않았습니다.

따라서 이전 버전에 추가 항목을 추가하기 전에 최신 버전의 코드가 필요한 작업을 수행했는지 여부를 알 수 없습니다.

그러나 내가 알아차린 것은 start() 함수 의 시작 부분에 여는 중괄호가 없다는 것입니다. 나는 우리가 이것을 겪었다고 생각했다.

당신은 약간의 통제를 행사할 필요가 있습니다. 변경하려는 경우 - 변경 사항을 최신 버전에 추가해야 합니다. 그리고 변경 사항과 변경 이유를 알려주세요.


CB.

 
niko wrote >>

팀,

전략 테스터에서는 아직 거래를 하지 않지만 컴파일할 때 보고된 오류가 없는 곳을 가리키는 코드를 얻었습니다. 그러나 나는 뭔가에 의아해합니다 : ...

안녕 닉,

여기에 있는 귀하의 의견과 코드에 대한 몇 가지 변경 사항을 살펴보면 변수와 함수 매개변수 간의 혼동으로 인해 '당황'이 발생한 것 같습니다. 생김새와 행동은 비슷하지만 실제로는 전혀 다른 짐승입니다.


아마도 아래의 주석 처리된 코드 예제를 보면 상황이 좀 더 명확해질 것입니다.


나는 개발 코드를 조금 더 정리하고 몇 가지 함수 매개변수 이름을 약간 변경하여 다른 변수와 구별하려고 시도하는 자유를 얻었습니다. 나는 또한 당신이 원하는대로 할 수 있도록 모든 불필요한 메모, 주석 등을 파일 끝에 "부록"으로 옮겼습니다.

코드가 좋아 보입니다. 파일에 AS TODO로 표시한 몇 가지 약간의 잡다한 일과 끝이 있지만 이제 여러분 앞에 놓인 주요 작업은 디버깅과 테스트입니다.


테스트는 개발 주기에서 매우 중요한 부분입니다. 거래 시스템에서 제대로 테스트하지 못하면 거래 전략과 궁극적으로 계정에 혼란을 줄 수 있는 미묘한 문제가 발생할 수 있습니다. 테스트의 주요 작업은 코드가 예상대로 작동하는지 확인하는 것입니다. 효과적으로 당신은 "이 상황에서, 나는 이 결과를 기대합니다"라고 쓰거나 스스로에게 말해야 합니다. 그런 다음 이것이 실제로 일어나는지 확인하기 위해 테스트를 고안하고 수행합니다. 그렇지 않은 경우 문제를 수정해야 합니다. 당신은 당신이 상상할 수 있는 모든 가능성 있는 상황에 대해 이 과정을 반복합니다. 물론 MetaTrader 시스템 오류 메시지와 함께 표시되거나 표시되지 않을 수 있는 런타임 오류 또는 버그를 찾고 있습니다.


MT4를 사용하면 주요 테스트 도구는 전략 테스터 및 로그 파일(저널 탭 아래)과 결과, 그래프 및 보고서 기능이 됩니다.


로그 파일을 사용하면 저널 뷰어를 통해 파일의 일부를 보는 것보다 Microsoft 메모장에서 전체 파일을 여는 것이 더 쉽다는 것을 종종 알게 됩니다. 매번 실행하기 전에 로그 파일/저널을 지우는 것을 잊지 마십시오. 전략 테스터에서 각 테스트를 실행한 후 디버그 문 메시지와 메타 트레이더 시스템 메시지 모두에 대한 로그 파일을 검사합니다. MetaTrader 온라인 문서를 사용하여 추가 정보에 대한 오류 코드를 찾을 수 있습니다. 또한 결과, 그래프 및 보고서 기능을 사용하여 특정 조건 세트에서 프로그램이 수행하는 작업을 확인합니다.


힌트 - 초기 테스트 실행 시 테스트 기간을 짧게 유지하여 로그 파일의 데이터 양을 최소화하십시오.


우리는 이미 일부 디버그 기능을 코드에 구축했지만 아마도 이를 확장해야 할 것입니다. 로그 파일의 정보를 압축하고 관련성을 유지하기 위해 필요에 따라 개별 디버그 문을 비활성화합니다. 시간이 많이 걸릴 수 있는 디버그 문을 삭제하거나 주석 처리하지 않고 이 작업을 수행하는 방법에 대한 코드의 예가 있습니다. 나는 내 주요 디버그 상태를 프로그램 파일에 무한정 남겨두고 테스트가 끝나면 프로그램에서 DEBUG_ON 플래그를 사용하여 모두 끕니다.


로그 파일과 디버그 문을 효율적으로 관리하는 것이 MetaTrader 환경에서 훌륭하고 효율적인 테스트 및 디버깅의 핵심이라고 생각합니다. 이 포럼에서 MetaTrader의 디버깅 기능이 부족하다고 불평하는 사람들을 보았습니다. 수백만 줄의 상용 코드가 MetaTrader에서 볼 수 있는 것보다 더 정교하지 않은 기능을 사용하여 성공적으로 디버깅되고 테스트되었습니다. 이러한 시설은 기본적일 수 있지만 적절하게 사용하는 방법을 알고 있으면 잘 작동합니다.


또 다른 요점은 지저분하거나 잘못 구성된 코드를 디버그하려고 하면 시간이 많이 걸리고 실망스러울 수 있다는 것입니다. 이 시점부터 잘 구조화되고 주석 처리가 잘 된 코드의 이점을 실제로 누리기 시작할 것입니다. 다른 사람이 귀하의 코드에 대해 작업해야 하는 경우 이러한 측면에서 귀하의 노력에 대해 매우 감사할 것입니다.


닉, 이 여행은 아직 가야 할 길이 있습니다. 나에게 테스트, 디버깅 및 최적화 - "모든 작업을 수행하는 것"은 작업에서 가장 흥미로운 부분이자 가장 어려운 경우가 많습니다. 테스트를 시작하기 위해 코드를 다시 전달하고 발생한 질문 및/또는 문제에 대해 답변을 받을 때까지 기다립니다.


문안 인사



전역 변수와 함수 매개변수의 차이점을 시도하고 보여주는 간단한 코드 예제

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
string MyGlobalVariable ; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = " Nick "; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction( MyGlobalVariable ); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter ) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment( MyFunctionParameter ); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

 
CB, 항상 mq4 파일을 새 파일로 저장하고 다른 파일을 구분하기 위해 최신 날짜로 저장하기 때문에 이상합니다. 혼란이 스쳐지나갔을 것입니다. 내가 포함하고 싶었지만 어느 시점에서 당신이 그것을 제거 하도록 요청했다고 생각했습니다 (마지막 것이지만 마지막 것이 없으면 start() 가 불균형 할 것입니다. 그래서 첫 번째 것도 제거했습니다. ,하지만 나는 그것을 다시 넣을 것입니다).
 
niko :
CB, 항상 mq4 파일을 새 파일로 저장하고 다른 파일을 구분하기 위해 최신 날짜로 저장하기 때문에 이상합니다. 혼란이 스쳐지나갔을 것입니다. 내가 포함하고 싶었지만 어느 시점에서 당신이 그것을 제거하도록 요청했다고 생각했습니다 (마지막 것이지만 마지막 것이 없으면 start() 가 불균형 할 것입니다. 그래서 첫 번째 것도 제거했습니다. ,하지만 나는 그것을 다시 넣을 것입니다).

중괄호 추가 및 제거 를 시작하지 맙시다. 나는 당신이 완전히 불필요한 세트를 가지고 있다는 것을 이전에 지적했으며, 둘 다 제거될 수 있습니다.

여기 최신 버전이 있습니다. 다음을 수행하십시오.

- 먼저 컴파일하고 오류를 수정하십시오. 그러면 후속 오류가 변경 사항으로 인한 것임을 알 수 있습니다.

- 수정해야 할 오류가 있는지 여부를 알려주십시오.

- 시도해보고 필요한 기능이 있는지 확인하십시오.

- 어떻게 되는지 알려주세요 - 그리고 어떤 변화가 필요하다고 생각하는지 알려주세요


CB

파일:
 
CB님 감사합니다. 내가 할게 조금 섭섭했다면 미안
 

Tim, 감사합니다.

나는 당신이 나에게 이러한 것들을 설명하기 위해 가는 길이에 정말 감사합니다. 그것은 매우 고무적입니다. 함수에 대한 문서를 이미 20번은 읽었음에도 불구하고 함수 및 호출에 대해 함수를 가져왔다가 전혀 얻지 못하는 '깜박임'이 발생하는 것 같습니다. 더 많은 시간을 할애하겠습니다. '테스트 및 디버깅'에 대해 수동 거래( 전략 테스트 )에서도 필수라고 생각하기 때문에 이전에 다른 패키지에서 이 작업을 수행했습니다(모든 거래를 수행하고 모든 것이 잘 맞는지 확인). 코드를 진행하여 알려 드리겠습니다.

 
niko :
CB님 감사합니다. 내가 할게 조금 섭섭했다면 미안

걱정 하지마 친구. 한 번에 한 단계씩만 진행하려고 합니다.


CB

 

이봐 CB,


코드에서 몇 가지 버그를 수정했는데 주로 괄호가 누락되었으며 코드에서 강조 표시되어 있습니다. 더 이상 구문 오류가 없습니다.

나는 전략 테스터 에서 코드를 실행하지만 BUY 거래만 수행합니다. 숏 트레이드가 전혀 없습니다. 로그를 살펴보니 오류 130(중지와 관련하여)이 생성되므로 문제에 대한 설명이 없습니다.

오류가 어디에 있는지 알아낼 수 있는지 확인하려고 했습니다(fnSHouldWeTrade 또는 fnOrderDuplicate에 있다고 가정).

최신 버전의 코드 첨부, TopFilter 및 BotFilter에 값을 추가하여 전략을 거래할 수 있도록 했습니다.

추신: 이전에 이전 코드를 붙여넣은 이유를 알아냈고, mt4를 다른 폴더에 다시 설치했으며(연결 오류 없음) 코드가 이전 폴더의 오래된 복제본이었습니다.

 
niko :

이봐 CB,


코드에서 몇 가지 버그를 수정했는데 주로 괄호가 누락되었으며 코드에서 강조 표시되어 있습니다. 더 이상 구문 오류가 없습니다.

전략 테스터에서 코드를 실행하지만 BUY 거래만 수행합니다. 숏 트레이드가 전혀 없습니다. 로그를 살펴보니 오류 130(중지와 관련하여)이 생성되므로 문제에 대한 설명이 없습니다.

오류가 어디에 있는지 알아낼 수 있는지 확인하려고 했습니다(fnSHouldWeTrade 또는 fnOrderDuplicate에 있다고 가정).

최신 버전의 코드 첨부, TopFilter 및 BotFilter에 값을 추가하여 전략을 거래할 수 있도록 했습니다.

추신: 이전에 이전 코드를 붙여넣은 이유를 알아냈고, mt4를 다른 폴더에 다시 설치했으며(연결 오류 없음) 코드가 이전 폴더의 오래된 복제본이었습니다.


변화:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point,"Nikos First EA",0,0,Red);

에게:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point,"Nikos First EA",0,0,Red);


CB

 
감사합니다 CB, 나는 그것을 알아차렸어야 했고 그래서 오류는 결국(130) 옳았습니다.