소개
당신의 대부분은 아마도 EA에서 신경망을 사용하는 가능성을 고려 하였다. 이 주제는 2007 자동 거래 챔피언십에 의해 극적으로 승리 특별히 후 매우 뜨거웠다 더 나은 자신의 시스템은 신경망을 기반으로. 많은 인터넷 포럼 신경 네트워크와 외환 거래에 관련된 항목이 쇄도했다. 불행하게도 NN의 기본 MQL4 구현을 작성하는 것은 쉬운 일이 아니다. 그것은 몇 가지 프로그래밍 기술을 필요로하고 데이터의 많은 수에 테스터에 최종 결과를 테스트하려는 경우 결과는 특별히 매우 효율적하지 않을 것입니다.
난 당신이 (LGPL에서) 자유롭게 사용할 수를 사용하는 방법을 보여 드리겠습니다이 문서, 유명한에서 빠른 인공 신경망 도서관 당신의 MQL4 코드 (FANN) 특정 장애물과 제한을 피하면서. 또한 나는 독자가 잘 알고 있다고 가정 인공 신경망 내가 MQL4 언어로 앤의 특정 구현을 사용하는 실용적인 측면에 집중합니다 있도록이 주제에 관한 (앤) 및 용어.
FANN 특징
완전히 FANN 구현 하나의 가능성을 이해하기 위해 그와 함께했습니다해야 할 문서 와 가장 일반적으로 사용되는 기능. FANN의 전형적인 사용은 간단한 피드 포워드 네트워크를 만들 일부 데이터 및 실행 함께 양성하는 것입니다. 생성 및 훈련 네트워크는 파일에 저장하고 더 사용하기 위해 나중에 복원 할 수 있습니다. 앤 하나를 만들려면 () 함수를 fann_create_standard 사용해야합니다. 의이 구문을 보자 :
FANN_EXTERNAL struct fann *FANN_API fann_create_standard(unsigned int num_layers, int lNnum, ... )
여기서 num_layers는 입력 및 출력 층을 포함 층의 총 개수를 나타낸다. lNnum 다음과 인수 입력 층에서 시작하여 출력층 끝나는 각 층의 뉴런의 수를 나타낸다. 다음과 같이 호출 할 것이다 5 뉴런, 10 입력 및 1 출력 하나 하나의 숨겨진 레이어와 네트워크를 만들려면 :
fann_create_standard (3,10,5,1);
앤이 생성되면 다음 작업은 약간의 입력 및 출력 데이터와 함께 훈련을하는 것입니다. 간단한 훈련 방법은 다음의 함수에 의해 달성 될 수 증분 트레이닝이다 :
FANN_EXTERNAL void FANN_API fann_train( | struct | fann | * | ann, | |
fann_type | * | input, | |||
fann_type | * | desired_output | ) |
이 기능은 포인터를 취 fann이 구조체 fann_create_standard () 모두 입력 데이터 벡터와 출력 데이터 벡터에 의해 이전에 돌려 보냈다. 입력 및 출력 벡터의 배열입니다 fann_type의 유형입니다. 그 유형은 사실의 문제에 있습니다 더블 또는 플로트 FANN 컴파일하는 방식에 따라 입력합니다. 이 구현에서는 입력 및 출력 벡터의 배열로가는 두 번 .
앤이 훈련되면 다음 원하는 기능은 네트워크를 실행하는 것입니다. 다음과 같이 그 구현이 함수는 정의된다 :
FANN_EXTERNAL fann_type * FANN_API fann_run( | struct | fann | * | ann, | |
fann_type | * | input | ) |
이 기능은 포인터를 취 fann 구조체 이전에 생성 된 네트워크와 정의 형 (의 입력 벡터 나타내는 이중 배열). 반환 값은 출력 벡터의 배열입니다. 하나 utput 네트워크에 대해 우리에 allways 출력값 아닌 출력값 자체 한 소자 어레이를 얻을로서 이러한 사실은 중요하다.
불행히도 FANN 기능의 대부분에 대한 포인터를 사용하여 구조체 fann 앤를 나타내는 데이터 타입으로 구조를 지원하지 않는 직접 MQL4 의해 처리 될 수 없다. 그 제한을 피하기 위해 우리는 어떤 방법으로 그 포장해야하고 MQL4에서 숨 깁니다. 가장 쉬운 방법은 배열 만드는 것입니다 구조체 fann 적절한 값을 들고 포인터를하고로 표시되는 인덱스로 참조INT의 변수입니다. 이 방법으로 우리는 지원 하나 변수의 지원되지 않는 유형을 대체 할 수있는 랩퍼 라이브러리를 만들 수 있습니다 쉽게 통합 MQL4 코드.
주위 FANN 포장
MQL4 변수 인수리스트 기능을 지원하지 않는 최선의 지식에 관해서는 우리는 너무 그 처리해야합니다. C 함수가 (가변 인수의 길이) 너무 많은 인수를 호출하면 다른 한편으로 잘못된 것은 그래서 우리는 C 라이브러리에 전달 MQL4 함수의 인수의 고정 된 최대 수를 가정 할 수있다 발생하지 않습니다. 다음과 같은 결과 래퍼 함수가 보일 것이다 :
/ * 표준 완전히 연결 역 전파 신경망을 작성합니다. * num_layers - 입력 및 출력 층을 포함 층의 총 수. * l1num - 1 층에있는 뉴런의 수 (입력) * l2num, l3num, l4num - 숨겨진 출력 레이어 뉴런의 수는 (num_layers에 따라 다름). * 반환 값 : 앤에 * 핸들러, 에러시 -1 * //* Creates a standard fully connected backpropagation neural network. * num_layers - The total number of layers including the input and the output layer. * l1num - number of neurons in 1st layer (inputs) * l2num, l3num, l4num - number of neurons in hidden and output layers (depending on num_layers). * Returns: * handler to ann, -1 on error */ int __stdcall f2M_create_standard(unsigned int num_layers, int l1num, int l2num, int l3num, int l4num);
우리는 선도적 인 변화 fann_ 와 f2M_ (FANN TO MQL의 약자) 지금 들고 앤스의 내부 배열에 인덱스 인수의 정적 수 (4 층) 및 반환 값을 사용하는 구조체 fann의 작동 FANN에 필요한 데이터를. 이 방법은 우리가 쉽게 MQL 코드 내에서 같은 함수를 호출 할 수 있습니다.
동일은 간다 :
/ * 입력의 세트, 및 원하는 출력의 세트로 하나의 반복 트레인. 하나의 패턴이 제공되기 때문에 *이 훈련은 항상 증분 훈련입니다. * 앤 - f2M_create_에 의해 반환 된 네트워크 핸들러 * * * input_vector - 입력 배열 * * output_vector - 출력의 배열 * 반환 값 : * 성공하면 0과 -1 오류에 * / INT __stdcall f2M_train ( INT 앤 , 두 번 * input_vector , 이중 *의 output_vector ) ;
과
/ * 실행 fann 네트워크 * 앤 - f2M_create_에 의해 반환 된 네트워크 핸들러 * * * input_vector - 입력 배열 * 반환 값 : 오류에 * 0 성공에, 음의 값 * 노트 : * 네트워크 출력 사용 f2M_get_output를 얻으려면 (). * 기존 출력 덮어 씁니다 * //* Run fann network * ann - network handler returned by f2M_create_* * *input_vector - array of inputs * Returns: * 0 on success, negative value on error * Note: * To obtain network output use f2M_get_output(). * Any existing output is overwritten */ int __stdcall f2M_run(int ann, double *input_vector);
마지막으로 중요한 것은 당신이 호출하여 한 번 만들어 앤를 파괴해야한다는 사실이다 :
/ * fann 네트워크를 파괴 * 앤 - f2M_에 의해 반환 된 네트워크 핸들러 * * 반환 값 : * 0 성공 -1 오류에 * 경고 :! 앤 핸들러는 재사용 할 수 없습니다 앤 경우 = (_ 앤-1) * 다른 핸들러는 지난 앤이 파괴 된 후에 만 다시 사용할 수 있습니다. * //* Destroy fann network * ann - network handler returned by f2M_* * Returns: * 0 on success -1 on error * WARNING: the ann handlers cannot be reused if ann!=(_ann-1) * Other handlers are reusable only after the last ann is destroyed. */ int __stdcall f2M_destroy(int ann);
앤 그들이 만든 만든 것보다 당신이 역순으로 네트워크를 파괴한다 처리 놓습니다. 또는 당신은 사용할 수 있습니다 :
/ * 모든 fann 네트워크를 파괴
* 반환 값 :
* 0 성공 -1 오류에
* /
INT __stdcall f2M_destroy_all_anns ();
그러나 나는 당신의 일부와 함께 나중에 사용하기 위해 자신의 훈련 네트워크를 저장하는 것을 선호 수 있습니다 확신 해요 :
/ * 구성 파일에 전체 네트워크를 저장합니다. * 앤 - f2M_create에 의해 반환 된 네트워크 핸들러 * * 반환 값 : * 성공 0, 실패시 -1 * //* Save the entire network to a configuration file. * ann - network handler returned by f2M_create* * Returns: * 0 on success and -1 on failure */ int __stdcall f2M_save(int ann,char *path);
물론 저장된 네트워크 나중에로드 (또는 오히려 다시) 할 수 있습니다 :
파일에서 / *로드 fann 앤 * 경로 - .NET 파일의 경로 * 반환 값 : 앤에 * 핸들러, 에러시 -1 * //* Load fann ann from file * path - path to .net file * Returns: * handler to ann, -1 on error */ int __stdcall f2M_create_from_file(char *path);
우리는 기본 기능을 알게되면 우리는 EA에서 그것을 사용하려고 수도 있지만, 먼저 우리는 Fann2MQL 패키지를 설치해야합니다.
Fann2MQL 설치
내가 MSI의 생성이이 패키지의 사용을 용이하게하기 위해 설치 프로그램 의 모든 소스 코드 플러스 미리 컴파일 된 라이브러리와 포함 Fann2MQL.mqh의 모든 Fann2MQL 기능을 선언 헤더 파일을.
설치 과정은 매우 간단하다. 먼저 Fann2MQL 아래에 있음을 통보되는 GPL의 라이센스 :
Fann2MQL의 설치, 1 단계
그런 다음 패키지를 설치 폴더를 선택합니다. 당신은 기본적으로 사용할 수있는 프로그램 파일 \ Fann2MQL \를 하거나 직접 설치 \ 메타 상인 \ 전문가 디렉토리. 이상 그렇지 않으면 당신은 수동으로 복사해야합니다 그들의 장소에 직접 모든 파일을 배치합니다.
Fann2MQL의 설치, 2 단계
설치 프로그램은 다음 폴더에 파일을 저장합니다 :
\ 폴더를 포함
라이브러리 \ 폴더
SRC \ 폴더
당신이 전용 Fann2MQL 폴더에 설치하도록 선택한 경우, 그의 내용을 복사하시기 바랍니다 포함 및 라이브러리 당신의 메타 상인 해당 디렉토리에 하위 폴더를.
설치 프로그램은 시스템 라이브러리 폴더 (대부분의 경우 윈도우 \ system32를)로 또한 FANN 라이브러리를 설치합니다. SRC의 폴더 Fann2MQL의 모든 소스 코드가 포함되어 있습니다. 당신은 당신 내부에 대한 자세한 정보가 필요하면 궁극적 인 문서입니다 소스 코드를 읽을 수 있습니다. 또한 코드를 개선하고 만약 당신이 좋아하면 추가 기능을 추가 할 수 있습니다. 당신이 흥미있는 아무것도 구현하는 경우 나는 나에게 패치를 보내 보시기 바랍니다.
당신의 EA에 신경 네트워크를 사용하여
Fann2MQL가 설치되면 당신은 당신의 자신의 EA 또는 인디케이터를 쓰기 시작할 수 있습니다. NN의 가능한 사용의 많음이있다. 당신은 미래의 가격 변동하지만 이러한 예측의 품질이 의심 스럽다의 실제 활용 가능성을 예측하는 데 사용할 수 있습니다. 당신은 사용하여 자신의 전략을 작성하려고 할 수 있습니다 강화 학습 기법을 말한다 Q-학습 또는 비슷한. 이 모든 기술을 당신의 지능형 EA의 신호 필터로 NN을 사용하거나 결합을 시도 할 수 있습니다 플러스 당신이 정말로 무엇을 기원합니다. 당신은 당신의 상상력에 의해 제한된다.
여기에 내가 당신에게 MACD에 의해 생성 된 신호에 대한 간단한 필터로 NN을 사용하는 예를 보여줍니다. 그것은 가치있는 EA하지만 Fann2MQL의 예 응용 프로그램으로 생각하지 마십시오. Fann2MQL 효과적으로 MQL에서 사용할 수있는 방법을 NeuroMACD.mq4 작품은 내가 당신을 보여 드리죠 : 예 EA는 방법의 설명 중.
모든 EA의 첫 번째 것은, 글로벌 변수의 선언입니다 정의 섹션을 포함한다. 여기 NeuroMACD 그 일을 포함의 시작이다 :
// Include Neural Network package #include <Fann2MQL.mqh> // Global defines #define ANN_PATH "C:\\ANN\\" // EA Name #define NAME "NeuroMACD" //---- input parameters extern double Lots=0.1; extern double StopLoss=180.0; extern double TakeProfit=270.0; extern int FastMA=18; extern int SlowMA=36; extern int SignalMA=21; extern double Delta=-0.6; extern int AnnsNumber=16; extern int AnnInputs=30; extern bool NeuroFilter=true; extern bool SaveAnn=false; extern int DebugLevel=2; extern double MinimalBalance=100; extern bool Parallel=true; // Global variables // Path to anns folder string AnnPath; // Trade magic number int MagicNumber=65536; // AnnsArray[ann#] - Array of anns int AnnsArray[]; // All anns loded properly status bool AnnsLoaded=true; // AnnOutputs[ann#] - Array of ann returned returned double AnnOutputs[]; // InputVector[] - Array of ann input data double InputVector[]; // Long position ticket int LongTicket=-1; // Short position ticket int ShortTicket=-1; // Remembered long and short network inputs double LongInput[]; double ShortInput[];
포함 명령은 모든 Fann2MQL 함수의 선언을 포함하는 Fann2MQL.mqh 헤더 파일을로드 말한다. 그 후 모든 Fann2MQL 패키지 기능은 스크립트에서 사용할 수 있습니다.ANN_PATH의 상수는 훈련 FANN 네트워크와 저장 경로와로드 파일을 정의합니다. 해당 폴더, 즉 C 만들 필요가 : \ 앤 . 이름의 상수는로드 및 저장 네트워크 파일을 나중에 사용이 EA의 이름이 포함되어 있습니다. 입력 파라미터는 후술되지 않은 것들뿐만 아니라, 오히려 명백한 글로벌 변수이며.
EA마다의 엔트리 포인트는 초기화 () 함수이다 :
int init() { int i,ann; if(!is_ok_period(PERIOD_M5)) { debug(0,"Wrong period!"); return(-1); } AnnInputs=(AnnInputs/3)*3; // Make it integer divisible by 3 if(AnnInputs<3) { debug(0,"AnnInputs too low!"); } // Compute MagicNumber and AnnPath MagicNumber+=(SlowMA+256*FastMA+65536*SignalMA); AnnPath=StringConcatenate(ANN_PATH,NAME,"-",MagicNumber); // Initialize anns ArrayResize(AnnsArray,AnnsNumber); for(i=0;i<AnnsNumber;i++) { if(i%2==0) { ann=ann_load(AnnPath+"."+i+"-long.net"); } else { ann=ann_load(AnnPath+"."+i+"-short.net"); } if(ann<0) AnnsLoaded=false; AnnsArray[i]=ann; } ArrayResize(AnnOutputs,AnnsNumber); ArrayResize(InputVector,AnnInputs); ArrayResize(LongInput,AnnInputs); ArrayResize(ShortInput,AnnInputs); // Initialize Intel TBB threads f2M_parallel_init(); return(0); }
첫째는 EA 시간 프레임주기를 해결하기 위해 적용되는지 여부를 확인합니다. AnnInputs 변수는 신경망 입력의 수를 포함합니다. 우리는 우리가 3로 나눌 수 할 다른 인수 3 세트 사용 겠지만 AnnPath가 EA에 반영하기 위해 계산 이름 과 MagicNumber 에서 계산, SlowMA , FastMA 및 SignalMA 이상 신호 MACD 지표에 사용되는 입력 인수를 . 이 AnnPath를 알고 일단 EA는 사용 신경망로드하려고 ann_load () 나는 아래에 설명 할 것이다 기능. 로드 네트워크의 절반 위치 긴 필터링 의미하고, 나머지 절반은 팬티 의미한다.AnnsLoaded 변수는 모든 네트워크가 제대로 초기화되었다는 사실을 나타 내기 위해 사용된다. 당신은 아마이 예제를 발견로서 EA는 여러 네트워크를로드하는 데 노력하고있다.나는 내가 당신에게 한 번에 여러 네트워크를 처리하고 멀티 코어 및 CPU의 병렬 촬영 이점에서 그들을 처리 할 수 Fann2MQL의 잠재력을 보여주고 싶었어요 아직이 응용 프로그램에서 정말 필요한 의심. 가능한 Fann2MQL이 이용 복용 그것을 확인하려면 인텔 ® 스레딩 빌딩 블록 기술을. 함수 f2M_parallel_init ()는 해당 인터페이스를 초기화하는 데 사용됩니다.
여기에 내가 네트워크를 초기화하는 데 사용되는 방법입니다 :
int ann_load(string path) { int ann=-1; /* Load the ANN */ ann=f2M_create_from_file(path); if(ann!=-1) { debug(1,"ANN: '"+path+"' loaded successfully with handler "+ann); } if(ann==-1) { /* Create ANN */ ann= f2M_create_standard(4,AnnInputs,AnnInputs,AnnInputs/2+1,1); f2M_set_act_function_hidden(ann,FANN_SIGMOID_SYMMETRIC_STEPWISE); f2M_set_act_function_output(ann,FANN_SIGMOID_SYMMETRIC_STEPWISE); f2M_randomize_weights(ann,-0.4,0.4); debug(1,"ANN: '"+path+"' created successfully with handler "+ann); } if(ann==-1) { debug(0,"INITIALIZING NETWORK!"); } return(ann); }
경우에 당신이 볼 수 있듯이 f2M_create_from_file () 음의 반환 값으로 표시됩니다 실패는, 네트워크가 만들어집니다 f2M_create_standard () 생성 된 네트워크 (입력 및 출력 포함) 4 층이 것을 나타내는 인수, AnnInput 입력과 기능, 첫 번째 숨겨진 레이어에 AnnInput 뉴런, AnnInput / 2 + 2 은닉층과 출력 층에 1 뉴런 1 뉴런.f2M_set_act_function_hidden () (의 FANN 설명서를 참조하십시오 SIGMOID_SYMMETRIC_STEPWISE에 숨겨진 레이어의 활성화 기능을 설정하는 데 사용됩니다fann_activationfunc_enum ) 및 동일 출력층 간다. 그런 다음에 대한 호출이 f2m_randomize_weights () 네트워크 내부의 신경 세포 연결 가중치를 초기화하는 데 사용됩니다. 여기의 범위를 사용하여 <-0.4; 0.4>하지만 당신은 당신의 응용 프로그램에 따라 다른 사용할 수 있습니다.
이 시점에서 당신은 아마 눈치 챘을 디버그 () 나는 몇 번 사용 기능. 그것은 당신의 EA의 표시 수준을 변경하는 가장 간단한 방법 중 하나입니다. 함께하고 입력 매개 변수와DebugLevel 튜닝 코드를 디버그 출력을 생성하는 방법 수 있습니다.
void debug(int level,string text) { if(DebugLevel>=level) { if(level==0) text="ERROR: "+text; Print(text); } }
의 첫 번째 인수하면 디버그 () 함수는, 디버그 수준이 보다 높은 DebugLevel 기능은 출력을 생성하지 않습니다. 그것은 동일한 낮은 있다면 텍스트 문자열이 출력됩니다. 디버그 레벨이 문자열 0 인 경우 "오류 :"시작에 추가됩니다. 여러 수준 코드에 의해 생성 된 디버그를 나눌 수있는 방법. 그들은 당신이 당신의 저하가있는 경우가 아니면이 인쇄됩니다 레벨 0에 할당되도록 가장 중요한 것은 아마도 오류가 있습니다 DebugLevel (권장하지 않음) 아래 0을. 레벨 1에서 몇 가지 중요한 정보가 성공적으로 네트워크 부하 또는 창조의 확인과 같은 인쇄됩니다. 레벨 2 이상으로 인쇄 된 정보의 중요성이 점차 감소하고있다.
의 자세한 설명을하기 전에 시작 () 아주 긴입니다 기능, 나는 당신에게 네트워크 입력과 실제 네트워크를 실행을 준비하는 의미가 좀 더 기능을 표시해야합니다 :
void ann_prepare_input() { int i; for(i=0;i<=AnnInputs-1;i=i+3) { InputVector[i]= 10*iMACD(NULL,0,FastMA,SlowMA,SignalMA,PRICE_CLOSE, MODE_MAIN,i*3); InputVector[i+1]= 10*iMACD(NULL,0,FastMA,SlowMA,SignalMA,PRICE_CLOSE, MODE_SIGNAL,i*3); InputVector[i+2]=InputVector[i-2]-InputVector[i-1]; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double ann_run(int ann,double &vector[]) { int ret; double out; ret=f2M_run(ann,vector); if(ret<0) { debug(0,"Network RUN ERROR! ann="+ann); return(FANN_DOUBLE_ERROR); } out=f2M_get_output(ann,0); debug(3,"f2M_get_output("+ann+") returned: "+out); return(out); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int anns_run_parallel(int anns_count,int &anns[],double &input_vector[]) { int ret; ret=f2M_run_parallel(anns_count,anns,input_vector); if(ret<0) { debug(0,"f2M_run_parallel("+anns_count+") returned: "+ret); } return(ret); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void run_anns() { int i; if(Parallel) { anns_run_parallel(AnnsNumber,AnnsArray,InputVector); } for(i=0;i<AnnsNumber;i++) { if(Parallel) { AnnOutputs[i]=f2M_get_output(AnnsArray[i],0); } else { AnnOutputs[i]=ann_run(AnnsArray[i],InputVector); } } } //+------------------------------------------------------------------+
함수 ann_prepare_input ()는 네트워크 (즉 명) 입력 이름을 제조하는데 사용된다. 그것의 목적은 매우 간단합니다, 아직 내가 입력 데이터가 제대로 정상화되어야 함을 상기해야합니다 지점입니다. 이 경우에는 정교한 정규화 없지만, I 단순히 결코 회계 데이터의 원하는 범위를 초과되지 MACD 메인 및 신호 값을 사용했다. 실제 예에서 당신은 아마이 문제에 더 많은 관심을 지불해야한다. 아마, 그 부호화, 네트워크 입력에 적절한 입력 인수 분해를 선택하고 정규화 용의자 하듯 뉴럴 네트워크의 처리에서 가장 중요한 요소 중 하나이다.
Fann2MQL는 메타 트레이더의 정상적인 기능을 확장하는 기능을 갖는 I 전에 언급 된 바와 같이, 즉, 신경망의 다중 스레드 병렬 처리이다. 글로벌 인수 병렬 컨트롤이 동작.run_anns () 함수는 모든 초기화를 실행하고 네트워크에 그 출력 및 저장을 얻는다 AnnOutput [] 어레이. anns_run_parallel 함수는 다중 스레드 방식으로 작업을 처리 할 책임이있다. 그것은 호출 f2m_run_parallel () 첫 번째 인수로 프로세스 네트워크의 수를 소요, 두 번째 인수는 세 번째 인수로 입력 벡터를 제공하는 실행하려는 모든 네트워크에 대한 핸들을 포함하는 배열입니다. 모든 네트워크는 매우 동일한 입력 데이터에 실행되어야한다. 네트워크의 출력을 확보하는 것은 여러 호출에 의해 이루어집니다f2m_get_output ().
이제 보자 시작 () 함수를 :
/* Is trade allowed? */ if(!trade_allowed()) { return(-1); } /* Prepare and run neural networks */ ann_prepare_input(); run_anns(); /* Calulate last and previous MACD values. * Lag one bar as current bar is building up */ double MacdLast=iMACD(NULL,0,FastMA,SlowMA,SignalMA,PRICE_CLOSE, MODE_MAIN,1); double MacdPrev=iMACD(NULL,0,FastMA,SlowMA,SignalMA,PRICE_CLOSE, MODE_MAIN,2); double SignalLast=iMACD(NULL,0,FastMA,SlowMA,SignalMA,PRICE_CLOSE, MODE_SIGNAL, 1); double SignalPrev=iMACD(NULL,0,FastMA,SlowMA,SignalMA,PRICE_CLOSE, MODE_SIGNAL, 2); /* BUY signal */ if(MacdLast>SignalLast && MacdPrev<SignalPrev) { BuySignal=true; } /* SELL signal */ if(MacdLast<SignalLast && MacdPrev>SignalPrev) { SellSignal=true; } /* No Long position */ if(LongTicket==-1) { /* BUY signal */ if(BuySignal) { /* If NeuroFilter is set use ann wise to decide :) */ if(!NeuroFilter || ann_wise_long()>Delta) { LongTicket= OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid-StopLoss*Point, Ask+TakeProfit*Point, NAME+"-"+"L ",MagicNumber,0,Blue); } /* Remember network input */ for(i=0;i<AnnInputs;i++) { LongInput[i]=InputVector[i]; } } } else { /* Maintain long position */ OrderSelect(LongTicket,SELECT_BY_TICKET); if(OrderCloseTime()==0) { // Order is opened if(SellSignal && OrderProfit()>0) { OrderClose(LongTicket,Lots,Bid,3); } } if(OrderCloseTime()!=0) { // Order is closed LongTicket=-1; if(OrderProfit()>=0) { train_output[0]=1; } else { train_output[0]=-1; } for(i=0;i<AnnsNumber;i+=2) { ann_train(AnnsArray[i],LongInput,train_output); } } } /* No short position */ if(ShortTicket==-1) { if(SellSignal) { /* If NeuroFilter is set use ann wise to decide ;) */ if(!NeuroFilter || ann_wise_short()>Delta) { ShortTicket= OrderSend(Symbol(),OP_SELL,Lots,Bid,3, Ask+StopLoss*Point, Bid-TakeProfit*Point,NAME+"-"+"S ", MagicNumber,0,Red); } /* Remember network input */ for(i=0;i<AnnInputs;i++) { ShortInput[i]=InputVector[i]; } } } else { /* Maintain short position */ OrderSelect(ShortTicket,SELECT_BY_TICKET); if(OrderCloseTime()==0) { // Order is opened if(BuySignal && OrderProfit()>0) { OrderClose(LongTicket,Lots,Bid,3); } } if(OrderCloseTime()!=0) { // Order is closed ShortTicket=-1; if(OrderProfit()>=0) { train_output[0]=1; } else { train_output[0]=-1; } for(i=1;i<AnnsNumber;i+=2) { ann_train(AnnsArray[i],ShortInput,train_output); } } } return(0); } //+------------------------------------------------------------------+
그것은 아주 잘 주석으로 나는 간단히 그것을 설명 할 것이다. trade_allowed은 () 가 무역 수 있는지 여부를 확인합니다. 기본적으로는 확인 AnnsLoaded의 모든 앤스 초기화 제대로 한 다음 적절한 시간 프레임 기간 최소 계정 잔액과 매우 끝에 검사는 새로운 줄의 첫 번째 틱에서 거래 할 수 있도록했다 나타내는 변수. 네트워크 처리를 네트워크의 입력을 준비하고 실행하는 데 사용되는 함수는 다음 두 상술 단지 몇 라인을 설명 하였다. 다음으로 우리는 계산하고 나중에 마지막 축적 바 및 이전에 대한 신호와 메인 라인의 MACD 값을 처리하기위한 변수로 넣어. 아직 구축되지 않고, 아마도 redrawed되는 바와 같이 현재의 바는 생략한다. SellSignal 및 BuySignal은 MACD 신호와 메인 라인 크로스 오버에 따라 계산된다. 내가 걷고 만 사건을 설명 할 것이다, 그래서이 두 신호는 대칭 장기 및 단기 위치 처리를 위해 사용된다.
LongTicket의 변수는 현재 열려있는 위치의 티켓 번호를 보유하고있다. 이 경우, 그래서 어떤 입장이 개방되지 -1 동일한 있다면 BuySignal가 설정되어 그 긴 위치를 열 수있는 좋은 기회를 나타낼 수 있습니다. 변수 경우 NeuroFilter이 설정되지 않은 긴 위치는 개방되고, 그 신호의 신경 네트워크 필터링이없는 경우입니다 - 순서가 구매로 전송됩니다. 이 시점에서 LongInput의 변수는 기억하기위한 것입니다 InputVector 에 의해 제조 ann_prepare_input () 나중에 사용할 수 있습니다.
경우 LongTicekt의 변수가 유효한 티켓 번호를 보유하고있는 EA는 여전히 열 또는 StopLoss 또는 TakeProfit에 의해 폐쇄되었다 여부를 확인합니다. 순서가 발생 아무것도 폐쇄하지 않은 경우 순서가 닫혀있는 경우, 그러나 train_output [] 하나 otput이 벡터를, 주문이 닫힌 경우, -1의 값을 유지하기 위해 계산 순서는 손실 또는 1 닫힌 경우 이익. 그 값은 전달한다 () ann_train 기능과 함께 훈련 긴 위치 처리를 담당하는 모든 네트워크를. 가변 입력 벡터로서 LongInput가 들고 사용된다 InputVector를 위치 개방 순간. 신호 네트워크가 진행됩니다 이런 식으로 가져 오는 이익과하는 일이 아니다.
당신은 일단 전환 훈련 네트워크 NeuroFilter을 에 사실은 네트워크 필터링을집니다. ann_wise_long ()은 현명한 긴 위치를 처리하는 것을 의미하는 모든 네트워크에 의해 반환 된 값의 평균으로서 계산 뉴럴 네트워크를 사용한다. 델타 파라미터는 필터링 된 신호가 유효 또는 전혀 없음을 나타내는 임계 값으로서 사용된다. 많은 다른 값으로 최적화하는 과정을 얻었다.
우리는 그것이 작동하는 방법을 알고 자하면이 사용할 수있는 방법을 보여 드리죠. 테스트 쌍은 물론 EURUSD이다. I로부터의 데이터는 사용 Alpari M5 시간 프레임으로 변환을. 내가 테스트 목적으로 교육 / 최적화 2009.01.01 및 2009.01.01-2009.03.22에 2007년 12월 31일까지의 기간을 사용했다. 첫 번째 실행에서 나는 다음 NeuroMACD.mq4 파일로 코딩 StopLoss, TakeProfit, SlowMA, FastMA 및 SignalMA 인수에 가장 수익성이 값을 얻기 위해 노력했다. NeuroFIlter는 뿐만 아니라 꺼져 SaveAnn가 , AnnsNumber가 신경 처리를 방지하기 위해 0으로 설정했다. I는 최적화 프로세스를위한 유전자 알고리즘을 사용 하였다. 값을 얻었다되면 다음과 같이 결과 보고서 보았다 :
당신은 내가 0.01의 부지의 크기 및 (200)의 초기 균형 미니 계정이 EA를 실행 한 볼 수 있듯이 그러나 당신이 당신의 계정 설정이나 환경 설정에 이러한 매개 변수에 따라 조정할 수 있습니다.
이 시점에서 우리는 충분히 수익성과 손실 거래는 우리가 켜십시오 수 있습니다 SaveAnn 및 설정 AnnsNumber를 일단 내가 다시 한 번 테스터를 실행 이렇게 (30). 아래 그림에 도시 된 바와 같이 \ ANN은 훈련 네트워크 채워 하였다 : 결과 및 폴더 C (신경 프로세싱의 결과로서) 프로세스는 훨씬 더 느렸다 사실을 제외하고는 정확하게와 동일 하였다. 확인 C를 확인 : \ ANN 폴더이 실행 이전에 존재!
C : \\ 앤 \\ 폴더.
우리가 네트워크를 훈련하면 그것이 작동하는 방식을 테스트하는 시간이다. 먼저 우리는 훈련 데이터를 시도 할 것이다. 변경 NeuroFilter 에 사실 과 SaveAnn 에 거짓을 하고 테스터를 시작합니다. 내가 얻은 결과는 다음과 같습니다. 네트워크 초기화 과정에서 제공되는 신경 세포의 연결 가중치의 네트워크 내부에 약간의 임의성이있는 한 당신 경우에 따라 약간 씩 다를 수 있습니다 (I가 명시 적으로 호출을 사용하여이 예에서 f2M_randomize_weights () 내부 ann_load는 () ).
(1.1 대 1.25) 순이익은 조금 이상 (16.92 대 20.03)이며, 아직 이익 요인은 많이 높다. 거래의 수는 그러나에만 신경 신호 필터링이 작동하고 있음을 보여주고 있지만, 그것이 사용되지 않은 데이터에 작동하는 방법에 대해 아무것도 말하지 않는다 많은 (1188 대 83) 이하, 평균 연속 손실 번호는 7 2.에서 저하된다 훈련 도중. 나는 시험 기간 (2009.01.01 - 2009.30.28)에서 얻을 수있는 결과는 다음과 같다 :
수행 거래의 수는 매우 낮은이며이 전략의 품질을 말해 어렵다, 그러나 나는 어떻게 가장 수익성이 EA를 작성하는 방법하지만 당신은 당신의 MQL4 코드에 신경 네트워크를 사용할 수있는 방법을 설명을 보여 않을했다. 으로 테스트 데이터에 EA의 결과를 비교할 때,이 경우 신경망을 사용하는 실제 효과는 볼 수 NeuroFilter가 온 오프. 아래의 신경 신호 필터링없이 테스트 데이터 구간에서 얻어진 결과는 다음과
차이는 매우 명백하다. 당신이 볼 수 있듯이 신경 신호 필터링은 수익성 하나에 손실 EA를 설정!
결론
나는 당신이 메타 트레이더에 신경 네트워크를 사용하는 방법이 문서에서 배운 바랍니다. 간단한 무료 및 오픈 소스 패키지의 도움으로 Fann2MQL 쉽게 거의 모든 전문가 고문으로 신경 네트워크 계층을 추가하거나 완전히 또는 부분적으로 신경 네트워크를 기반으로 자신의 일을 쓰기 시작 할 수 있습니다. 독특한 멀티 스레딩 기능은, 특정 파라미터를 최적화 할 때 특별히하여 CPU 코어의 수에 따라 처리하여 여러 번 빠르게 할 수있다. 한 경우는 4 코어 인텔 CPU에서 '만'28시간 약 사일에서 내 강화 학습을 기반으로 EA 처리의 최적화를 단축.
이 문서의 작성하는 동안 나는 그것의 자신의 웹 사이트에 Fann2MQL를 넣어하기로 결정했습니다 http://fann2mql.wordpress.com/ . 당신은 거기 Fann2MQL의 최신 버전 및 가능한 미래의 모든 버전뿐만 아니라 모든 기능의 문서를 찾을 수 있습니다. 난 당신이 나에게 기능 요청 또는 내가 흥미 다음 릴리스를 찾을해야합니다 패치를 어떤 의견을 보내 그래서 만약 모든 릴리스에 대한 GPL 라이센스에 따라이 소프트웨어를 유지할 것을 약속드립니다.
이 문서가 Fann2MQL의 아주 기본적인 사용법을 보여줍니다 있습니다. 이 패키지는 FANN보다 훨씬 더 아니기 때문에 당신처럼, FANN 네트워크를 관리하기 위해 설계된 모든 도구를 사용할 수 있습니다 :
- Fanntool : http://code.google.com/p/fanntool/
- FannExplorer : http://leenissen.dk/fann/index.php?p=gui.php
- Fann matlab에 바인딩 : http://www.sumowiki.intec.ugent.be/index.php/FANN_Bindings
: 그리고 빠른 인공 신경망 도서관 홈페이지 FANN에 대한 훨씬 더있다 http://leenissen.dk/fann/ !
포스트 Scriptum
이 기사를 쓰고 난 후에 나는 NeuroMACD.mq4에서 사소한 오류를 발견했다. 짧은 위치에 대한 OrderClose () 함수는 긴 위치 티켓 번호를 공급 하였다. 그것은 반바지와 가까운 걷고을 보유 할 가능성이 있었다 기울어 전략의 결과 :
/* Maintain short position */ OrderSelect(ShortTicket,SELECT_BY_TICKET); if(OrderCloseTime()==0) { // Order is opened if(BuySignal && OrderProfit()>0) { OrderClose(LongTicket,Lots,Bid,3); } }
스크립트의 올바른 버전에서이 오류를 수정하고 모든 OrderClose () 전략을 제거했습니다. 이는 아직 EA에 신경 필터링의 영향의 전체 영상을 변경하지 않았다 밸런스 곡선 형상은 상당히 달랐다. 이 문서에 첨부 된이 EA의 두 버전을 찾을 수 있습니다.