적은 코드, 더 많이 사용합니다. Expert Advisor 작성 - 페이지 4

 
Maxim Kuznetsov :
왜 다음 단계에 대한 게시물을 내리셨습니까 ?? 프로젝트가 공개적으로 수행되며 공개적으로 사용 가능합니다.

고너를 조여주세요. 그리고 리소스 규칙을 읽으십시오.

포럼 게시물과 CodeBase의 설명에서 모든 것을 정렬할 수 있습니다.

 
Maxim Kuznetsov :
왜 다음 단계에 대한 게시물을 내리셨습니까 ?? 프로젝트가 공개적으로 수행되며 공개적으로 사용 가능합니다.

글을 보니 범죄행위는 없었습니다. 분명히 그는 잘 보이지 않았습니다.

 
Maxim Kuznetsov :

균형은 물론 무너지고 있습니다. 음, "두 MA의 교차"에서 무엇을 원했습니까?


고문에 대해 다른 기준을 취할 수 있습니다. 매시업은 최선의 선택이 아닙니다.

 
aleger :

고문에 대해 다른 기준을 취할 수 있습니다. 매시업은 최선의 선택이 아닙니다.

조금 더 자세히 살펴보면 이미 많은 것을 구현할 수 있음을 알 수 있습니다 :-)

다음이 얻어진다:

* 응용 프로그램 프로그래머(라이브러리 사용자)는 여러 열이 있는 마이크로 엑셀을 가지고 있다고 선언했습니다(사용 사례의 경우 FAST_MA,SLOW_MA,SIGNAL_BUY,SIGNAL_SELL).

* 그리고 그가 개별 세포를 계산하는 방법의 기능을 스케치했습니다. 이 예에서 그는 iMA로 눈을 돌렸습니다.

* 동시에 그는 이 테이블의 다른 셀에 제한 없이 액세스할 수 있습니다(DataFrame은 가능한 경우 시퀀스를 파괴합니다)

* 별도로 사용자는 "문자열의 값을 확인하십시오. 거래 할 시간입니까?"라는 기능을 작성했습니다.

이것은 고문이 거래를 시작하기에 충분하다는 것이 분명합니다. 그리고 전략은 매우 유연하게 변경할 수 있습니다. 표 계산으로 상상할 수 있는 모든 것이 가능합니다.
또 다른 것은 이것이 단지 전반기 단계에 불과하다는 것입니다 :-) 지금까지 어드바이저는 하나의 심볼과 하나의 시간대에서 최소한의 랏으로만 멍키 시프터처럼 거래합니다.

 

처음 두 부분에서는 구어체로 "원숭이 또는 신호에 대한 쿠데타"로 설명되는 가장 간단한 전략을 실행할 수 있는 고문을 확보했습니다.
동시에 신호 자체는 Excel에서와 같이 가능한 한 간단하게 프로그래밍됩니다. :-)

조언자를 조금 더 가르칠 때입니다. 최소한 StopLoss를 넣고 추적하십시오.

"스톱 로스는 STOPLOSS_POINTS 거리에서 설정된 다음 프랙탈을 따라 추적합니다."라는 문구로 전략에 대한 예술적 설명을 보완합니다. 그리고 우리는 사용 사례에서 이전의 변경 사항을 이해할 수 있도록 변경합니다.

  • 새 EA 매개변수 입력 int STOPLOSS_POINTS=100;
  • 두 개의 계산된 필드 UPPER_FRACTAL,LOWER_FRACTAL이 ENUM_SERIES에 추가됩니다.
  • 두 개의 "케이스:"를 GetData 함수에 추가하여 계산합니다.

EA를 구성 하기 위한 기능(EA 클래스 방식)을 사용자에게 제공합니다. 가장 간단한 표기법은 다음과 같습니다.

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);

"지정된 거리에 손절매를 하고 LOWER_FRACTAL 테이블 열에서 매수하고 UPPER_FRACTAL에서 매도"로 읽습니다. 제 생각에는 메서드의 이름이 명확하고 구문이 다소 명확합니다.

가상의 사용자는 이미 많은 제스처(입력 선언, 두 개의 열 추가, 설정 함수 호출)를 했으므로 그의 작업이 예상한 결과로 이어지도록 라이브러리를 개발합니다. 우리는 표 형식의 계산을 개발하고 메시지/이벤트 메커니즘의 기반을 마련해야 합니다.

압축을 위해 복사-붙여넣기에서 제거된 추가 주석 및 MQL5 코드

 input ENUM_APPLIED_PRICE FAST_MA_PRICE= PRICE_CLOSE ;
input ENUM_MA_METHOD FAST_MA_METHOD= MODE_EMA ;
input int FAST_MA_PERIOD= 14 ;
input int FAST_MA_SHIFT= 0 ;

input ENUM_APPLIED_PRICE SLOW_MA_PRICE= PRICE_CLOSE ;
input ENUM_MA_METHOD SLOW_MA_METHOD= MODE_SMA ;
input int SLOW_MA_PERIOD= 54 ;
input int SLOW_MA_SHIFT= 0 ;

// начальные значения StopLoss, TakeProfit
input int STOPLOSS_POINTS= 100 ;
input int TAKEPROFIT_POINTS= 200 ;

#include "EA/EA.mqh"

enum ENUM_SERIES {
   FAST_MA,       // id. значений FAST_MA
   SLOW_MA,       // id. значений SLOW_MA 
   SIGNAL_BUY,     // сигнал к покупкам
   SIGNAL_SELL,   // сигнал к продажам
   UPPER_FRACTAL,       // верхний фрактал (для трала стопов ордеров sell)
   LOWER_FRACTAL, // нижний фрактал
   TOTAL_SERIES   // последний элемент перечисления = кол-во элементов
};

double GetData(EA *ea, int id, int shift,DataFrame *table)
{
   switch ((ENUM_SERIES)id) {
       case FAST_MA:
         return table[FAST_MA][shift]= iMA (ea. Symbol ,ea. Period ,FAST_MA_PERIOD, 0 ,FAST_MA_METHOD,FAST_MA_PRICE,shift);
       case SLOW_MA:
         return table[SLOW_MA][shift]= iMA (ea. Symbol ,ea. Period ,SLOW_MA_PERIOD, 0 ,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
       case SIGNAL_BUY:
         return table[SIGNAL_BUY][shift]=table.CrossedUp(FAST_MA,SLOW_MA,shift);
       break ;
       case SIGNAL_SELL:
         return table[SIGNAL_SELL][shift]=table.CrossedDn(FAST_MA,SLOW_MA,shift);
       break ;
       // Расчёт уровней трала
       case UPPER_FRACTAL:
         // верхний фрактал. уровень по которому тралятся sell
         return table[UPPER_FRACTAL][shift]=iFractal(ea. Symbol ,ea. Period , MODE_UPPER ,shift+ 2 );
       case LOWER_FRACTAL:
         return table[UPPER_FRACTAL][shift]=iFractal(ea. Symbol ,ea. Period , MODE_LOWER ,shift+ 2 );
   }
   return EMPTY_VALUE ;
}
int SignalOfCross(EA *ea, int shift,DataFrame *data)
{
   if (FAST_MA_PRICE!= PRICE_OPEN || SLOW_MA_PRICE!= PRICE_OPEN ) shift++;
   if (data[SIGNAL_BUY][shift]== 1.0 )   return OP_BUY ;
   if (data[SIGNAL_SELL][shift]== 1.0 ) return OP_SELL ;
   return - 1 ;
}
EA *ea= NULL ;

int OnInit ()
{
   ea = new EA();
   ea.SetupTimeframe( _Symbol , _Period ,TOTAL_SERIES, 30 ,GetData);
   ea.SetupSignal(SignalOfCross);

         // укажем начальный стоп-лосс ордеров и уровни для тралов 
   ea.SetupStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);
   // и заодно тейк-профит
   ea.SetupTakeProfit(TAKEPROFIT_POINTS);
   // остальная часть одинакова для всех советников
   //................
}
 
Maxim Kuznetsov :

그러한 코드를 보는 것은 이미 어렵습니다. 단순히 외부에서 쓰는 것은 어려운 작업입니다. 간결함도 중요하지만, 그것으로도 단순함은 쉽게 사라질 수 있습니다.

내 의견과 마찬가지로 코드에 대한 귀하의 의견은 매우 주관적입니다. 외부의 관찰자는 어려운지 간단한지 훨씬 더 객관적으로 말할 수 있습니다.

귀하의 코드를 관찰하는 사람으로서는 어렵습니다.

 
fxsaber :

그러한 코드를 보는 것은 이미 어렵습니다. 단순히 외부에서 쓰는 것은 어려운 작업입니다. 간결함도 중요하지만, 그것으로도 단순함은 쉽게 사라질 수 있습니다.

내 의견과 마찬가지로 코드에 대한 귀하의 의견은 매우 주관적입니다. 외부의 관찰자는 어려운지 간단한지 훨씬 더 객관적으로 말할 수 있습니다.

귀하의 코드를 관찰하는 사람으로서는 어렵습니다.

특히 사용 사례에 대해 더 이해하기 쉽고 간결한 표기법을 제공합니다. 또는 현재 것을 편집합니다.

이것은 가장 어려운 점이며 기본적으로 토론을 위해 제안된 사람입니다.

 
Maxim Kuznetsov :

특히 사용 사례에 대해 더 이해하기 쉽고 간결한 표기법을 제공합니다. 또는 현재 것을 편집합니다.

이것은 가장 어려운 점이며 기본적으로 토론을 위해 제안된 사람입니다.

제공하지 않을 것이므로 나는 이것이 왜 필요한지, 이해조차 하지 못한다. MQL4보다 간단한 것이 외부 관찰자를 위해 발명될 가능성은 거의 없습니다. MQL4의 개발자들은 독창적으로 단순한 아키텍처에 착수했습니다.

 

그리고 출력으로 무엇을 얻고 싶습니까? 솔직히 이해가 되지 않았습니다. 처음에 나는 la 프레임워크가 생각하고 있다고 생각했지만, 지표, 주문, 표준 의사 결정 알고리즘에 대한 래퍼 클래스가 없었습니다. 다음 구문이 훨씬 읽기 쉽습니다. fast.Get(2)>=slow.Get(1); (예를 들어 이것은 나입니다) 및 선언:

CMA fast=new CMA(NULL,0,12,...);

CMA 느림=new CMA(NULL,0,100,...);

이것은 논의할 수 있지만 IMHO는 시간을 표시하고 있습니다.

 
fxsaber :

귀하의 코드를 관찰하는 사람으로서는 어렵습니다.

언어를 알고 있더라도 코드를 읽는 것이 매우 어렵다는 데 동의합니다.