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

 
Maxim Kuznetsov :

물론, 나는 그들을 위해 메모리를 할당합니다. 계산 및 디버깅에 필요한 것 이상의 깊이. 위의 조각에서 30이면 충분합니다. 예를 들어 깊이가 50인 표준 편차를 계산해야 하는 경우 캐시를 늘려야 합니다. 그리고 그때에도 계산 속도를 높이기 위해서만.

확인. 모든 사람은 자신의 비전을 가지고 있습니다.
 
Vladimir Simakov :

모든 것이 원과 잘 어울립니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2018.02.15 11:48

이러한 거래 논리를 사용하여 MQL5에서 스크립트를 작성하는 것이 좋습니다(MQL4 스타일은 의미를 빠르게 설명하기 위한 것입니다).

 void OnStart ()
{
   OrderCloseBy ( OrderSend ( _Symbol , OP_BUY , 1 , Ask , 0 , 0 , 0 ), OrderSend ( _Symbol , OP_SELL , 1 , Bid , 0 , 0 , 0 ));
}
 
fxsaber :
 #include <Template\Objects\COrder.mqh>
#include <Template\Objects\CPosition.mqh>

COrder  *order1,*order2;
CPosition *pos1,*pos2;

//----------------------------------------------------------------------
int OnInit ()
  {
   order1= new COrder( NULL , ORDER_TYPE_BUY , 0.2 , 0.0 , 0.0 , 0.0 );
   order2= new COrder( NULL , ORDER_TYPE_SELL , 0.1 , 0.0 , 0.0 , 0.0 );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   delete order1;
   delete order2;
   delete pos1;
   delete pos2;
  }
//+------------------------------------------------------------------+
void OnTick ()
  {
   CheckOrder(order1,pos1);
   CheckOrder(order2,pos2);
   if ( CheckPointer (pos1)&& CheckPointer (pos2)) pos1.CloseBy(pos2);
   if ( CheckPointer (pos1)&&pos1.Control()>POSITION_MUST_CLOSE) delete pos1;
   if ( CheckPointer (pos2)&&pos2.Control()>POSITION_MUST_CLOSE) delete pos2;
  }

void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
   if ( CheckPointer (order1)) order1.TradeTransaction(trans,request,result);
   if ( CheckPointer (order2)) order2.TradeTransaction(trans,request,result);
  }      
//-----------------------------------------------------------------
void CheckOrder(COrder* &order, CPosition* &position){
   if (! CheckPointer (order)) return ;
   switch (order.Control()){
       case ORDER_FULL:        position=NewPosition(order);
                               Print (position.GetTicket(), " Ok" );
       case ORDER_REMOVE:
       case ORDER_ERROR:       delete order;}}
//-------------------------------------------------------------------
CPosition* NewPosition(COrder* &order)  { return CheckPointer (order)&& PositionSelectByTicket (order.GetTicket())? new CPosition(): NULL ;}

라이브러리가 표시되지 않습니다. ex5 파일을 첨부했습니다.

CloseBy는 무릎에서 이루어졌으며 아직 필요하지 않았지만 "약한"덕분에 CloseBy 후 위치 변경 만 남습니다.

미래에는 COrder 및 СPosition에 대한 하나의 래퍼 클래스가 있을 것입니다.

파일:
Test.ex5  43 kb
 

나는 이미 음절로 무엇을 하는지 설명하려고 노력할 것입니다 :-)

고문이 필요하다고 합니다. 우선 - 가장 간단한 방법은 비둘기의 교차점과 프랙탈에서 멈춤을 추적하는 것입니다. 즉, 터미널에서 다음과 같이 보입니다.

검은색 사각형 안에 동그라미 친 것이 테이블의 1행입니다. 어드바이저가 알고리즘에서 고려하는 데이터입니다.

주어진 사용 사례의 임무는 이 영역에 무엇이 있는지, 어떻게 고려되고 EA가 이를 보완하는지 가능한 한 간결하게 설명하는 것입니다. 이 데이터를 기반으로 어떤 계산이 수행됩니까?

내 생각에 가장 쉬운 일은
1) 이름을 지정하여 이러한 필드를 나열합니다. 즉, ENUM에 나열합니다.
2) ENUM과 bar의 이름으로 조언자에게 값을 제공하는 간단한 함수를 작성하십시오.

일반 프로그래머의 경우 간단한 Expert Advisors를 개발하기 위한 몇 가지 방법론(명확하게 표시된 단계)이 있습니다.

1. 입력 설정

2. 수식을 작성하여 데이터를 설명하고 보완합니다. 필요에 따라 열 추가

3. 수신된 테이블의 데이터와 사용 위치를 나타냅니다.

데이터를 저장하기 위해 인덱스, 데이터 캐싱 및 주문형 계산에 의한 액세스를 제공하는 "열별" 데이터를 저장하는 DataFrame 클래스가 만들어집니다.

이미 이 씬(코드가 거의 없고 사용 사례에 꼭 필요한 것만) 기반으로 다양한 Expert Advisor를 만들 수 있습니다. 테이블 카운트, 신호 수신, 거래가 열립니다.

물론 이것으로 충분하지 않습니다 :-) 그래서 프로젝트가 막 열렸고 기성품이 없었습니다. 이것은 프로젝트입니다. 이제 막 탄생하고 발전하고 있는 것입니다.

 
Vladimir Simakov :

"약한" 감사합니다

따라서 고문이 아니라 스크립트입니다. 하지만 어드바이저와 함께 했어도 MT4와 MT5의 차이점을 완벽하게 보여주었습니다. 옵션 중 하나에는 한 줄만 있습니다. 두 번째는 안타깝게도 실패했습니다.

 
fxsaber :

따라서 고문이 아니라 스크립트입니다. 하지만 어드바이저와 함께 했어도 MT4와 MT5의 차이점을 완벽하게 보여주었습니다. 옵션 중 하나에는 한 줄만 있습니다.

어서, CloseBy, 당신이 눈치채지 못했다면, 나는: pos1.CloseBy(pos2), 다른 모든 것은 주문을 열고 작업을 확인하고 있습니다. MT4에서는 먼저 2개의 위치를 열어야 하고 개방을 제어해야 합니다. 순전히 비교를 위해 스튜디오에서 작업 코드를 배치할 수도 있습니다.

 
Maxim Kuznetsov


:

나는 이미 음절로 무엇을 하는지 설명하려고 노력할 것입니다 :-)

고문이 필요하다고 합니다. 우선 - 가장 간단한 방법은 비둘기의 교차점과 프랙탈에서 멈춤을 추적하는 것입니다. 즉, 터미널에서 다음과 같이 보입니다.

검은색 사각형 안에 동그라미 친 것이 테이블의 1행입니다. 어드바이저가 알고리즘에서 고려하는 데이터입니다.

주어진 사용 사례의 임무는 이 영역에 무엇이 있는지, 어떻게 고려되고 EA가 이를 보완하는지 가능한 한 간결하게 설명하는 것입니다. 이 데이터를 기반으로 어떤 계산이 수행됩니까?

내 생각에 가장 쉬운 일은
1) 이름을 지정하여 이러한 필드를 나열합니다. 즉, ENUM에 나열합니다.
2) ENUM과 bar의 이름으로 조언자에게 값을 제공하는 간단한 함수를 작성하십시오.

일반 프로그래머의 경우 간단한 Expert Advisors를 개발하기 위한 몇 가지 방법론(명확하게 표시된 단계)이 있습니다.

1. 입력 설정

2. 수식을 작성하여 데이터를 설명하고 보완합니다. 필요에 따라 열 추가

3. 수신된 테이블의 데이터와 사용 위치를 나타냅니다.

데이터를 저장하기 위해 인덱스, 데이터 캐싱 및 주문형 계산에 의한 액세스를 제공하는 "열별" 데이터를 저장하는 DataFrame 클래스가 만들어집니다.

이미 이 씬(코드가 거의 없고 사용 사례에 꼭 필요한 것만) 기반으로 다양한 Expert Advisor를 만들 수 있습니다. 테이블 카운트, 신호 수신, 거래가 열립니다.

물론 이것으로 충분하지 않습니다 :-) 그래서 프로젝트가 막 열렸고 기성품이 없었습니다. 이것은 프로젝트입니다. 이제 막 탄생하고 발전하고 있는 것입니다.

일반적인 고려를 위해 mql4에 있지만 Ichimoku에 대한 래퍼 클래스의 예입니다.

 #ifndef _ICHIMOKU_
#define _ICHIMOKU_

#include <ProjectLibrary\Functions\MyLib.mqh>

class CIchimoku
  {
private :
   string             cSymbol;
   ENUM_TIMEFRAMES    cFrame;
   int                cTenkan;
   int                cKijun;
   int                cSenkou;
   ENUM_TIMEFRAMES    cTempFrame;
   int                cFrameShift;
public :
                     CIchimoku( string mSymbol, ENUM_TIMEFRAMES mFrame, int mTenkan, int mKijun, int mSenkou, int mDeltaFrame= 0 );
   double             Get( int mBuffer, int mShift= 0 );
   double             Tenkan( int mShift= 0 )       { return Get( MODE_TENKANSEN ,mShift);}
   double             Kijun( int mShift= 0 )        { return Get( MODE_KIJUNSEN ,mShift);}
   double             SpanA( int mShift= 0 )        { return Get( MODE_SENKOUSPANA ,mShift);}
   double             SpanB( int mShift= 0 )        { return Get( MODE_SENKOUSPANB ,mShift);}
   double             Chikou( int mShift= 0 )       { return Get( MODE_CHIKOUSPAN ,mShift);}
   double             CloudMin( int mShift= 0 )     { return MathMin (SpanA(mShift),SpanB(mShift));}
   double             CloudMax( int mShift= 0 )     { return MathMax (SpanA(mShift),SpanB(mShift));}
private :
   ENUM_TIMEFRAMES    CheckFrame();
  };
//--------------------------------------------------------------------------------------------------
CIchimoku::CIchimoku( string mSymbol, ENUM_TIMEFRAMES mFrame, int mTenkan, int mKijun, int mSenkou, int mFrameShift= 0 ):
   cTenkan(mTenkan),cKijun(mKijun),cSenkou(mSenkou),cFrameShift(mFrameShift){
   cSymbol=mSymbol== NULL ? _Symbol :mSymbol;
   if (mFrameShift){
      cTempFrame=mFrame== PERIOD_CURRENT ?( ENUM_TIMEFRAMES ) Period ():mFrame;
      cFrame=::GetShiftFrame(cTempFrame,mFrameShift);}
   else
      cFrame=mFrame;}
//--------------------------------------------------------------------------------------------------
ENUM_TIMEFRAMES CIchimoku::CheckFrame( void ){
   if (!cFrameShift) return cFrame; //>>
   ENUM_TIMEFRAMES frame=( ENUM_TIMEFRAMES ) Period ();
   if (cTempFrame==frame) return cFrame; //>>
   else cTempFrame=frame;
   return ::GetShiftFrame(frame,cFrameShift);}
//--------------------------------------------------------------------------------------------------------------
double CIchimoku::Get( int mBuffer, int mShift= 0 ){
   ResetLastError ();
   double res= iIchimoku (cSymbol,CheckFrame(),cTenkan,cKijun,cSenkou,mBuffer,mShift);
   return ! GetLastError ()?res: 0.0 ;}

#endif 
 
Vladimir Simakov :

일반적인 고려를 위해 mql4에 있지만 Ichimoku에 대한 래퍼 클래스의 예입니다.

어떤 Ichimokov 구성 요소에 대해 래퍼를 원하십니까? 그리고 가장 중요한 것은 왜 그리고 무엇을 ...
그냥 해? 아마도, 왜 안되는지.

추신/엑셀을 보았습니까? DataFrame에서 Ichimoki는 동일하게 보입니다. 다른 모든 사람들과 마찬가지로.. 트레이더는 실제로 테이블로 작업합니다. 그래픽 차트는 피벗 테이블의 특정 표현(보기)일 뿐입니다. 따라서 이 데이터를 테이블과 같이 취급해야 합니다.
상인의 관점에서 - 소프트웨어 개체란 무엇입니까??? 예 아무것도. 그의 실제 생활에는 그러한 생물이 없습니다.

 
Vladimir Simakov :

어서, CloseBy, 당신이 눈치채지 못한 경우를 대비해 제가 가지고 있습니다: pos1.CloseBy(pos2), 다른 모든 것은 주문을 시작하고 작업을 확인하는 것입니다.

작동하지 않습니다.

MT4에서는 먼저 2개의 위치를 열어야 하고 개방을 제어해야 합니다. 순전히 비교를 위해 스튜디오에서 작업 코드를 배치할 수도 있습니다.

 #include <MT4Orders.mqh>

#define Bid SymbolInfoDouble ( _Symbol , SYMBOL_BID )
#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnStart ()
{
   OrderCloseBy ( OrderSend ( _Symbol , OP_BUY , 1 , Ask , 0 , 0 , 0 ), OrderSend ( _Symbol , OP_SELL , 1 , Bid , 0 , 0 , 0 ));
}
 
fxsaber :

작동하지 않습니다.

나는 바로 이 명령의 개시를 통제하면서 그것을 썼습니다.