오류, 버그, 질문 - 페이지 1935

 
Aleksey Vyazmikin :

그래서 그것이 거래 기능에 관한 것인지 확실하지 않습니다 ...

거기에는 누구나 재현할 수 있는 건설적인 진술의 예가 있습니다.
 
fxsaber :
거기에는 누구나 재현할 수 있는 건설적인 진술의 예가 있습니다.

이해합니다 - 코드를 게시하지만 아직 지불하지 않은거래 기능 에 대한 클래스를 사용합니다 ...

렌더링할 때 점진적인 속도 저하(최대 속도에서 막대당 거의 몇 초)를 관찰합니다. 어떤 아이디어가 있습니까?

바이러스 백신이 검사하지 않음, SSD 나사, 공간이 있습니다...

 
Aleksey Vyazmikin :

EA 를 MT4에서 MT5로 다시 작성했습니다.

이야기는 동일하며 몇 분 안에 체크포인트를 테스트합니다.

MT5

2017.07.20 20:01:38.059 코어 1 Si-9.17,M1: 107509틱, 35385바 생성. 환경이 0:00:00.078에 동기화되었습니다. 테스트는 0:03:52.707에 통과했습니다 (0:00:00.031을 사전 처리하는 틱 포함).

MT4

2017.07.20 20:02:32.696 RUBRUR,M1: 0:00:04.259(총 시간 0: 00:11.310)에 처리된 225314개의 틱 이벤트(35701개 막대, 231783개 막대 상태)

그리고 MT5의 자랑스러운 속도는 어디에?
두 전문가의 코드를 보여줍니다. 기본 MQL5 대신 지연 MQL4 에뮬레이터가 있습니까?
 
Renat Fatkhullin :
두 전문가의 코드를 보여줍니다. 기본 MQL5 대신 지연 MQL4 에뮬레이터가 있습니까?

이유가 있어 아직 코드를 표시할 준비가 되지 않았습니다.

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

오류, 버그, 질문

Aleksey Vyazmikin , 2017.07.20 23:28


이해합니다 - 코드를 게시하지만 아직 지불하지 않은 거래 기능 에 대한 클래스를 사용합니다 ...

하지만 MT5의 프로파일링 결과를 보여드릴 준비가 되어 있습니다. 제가 알기로는 거래 기능에는 문제가 없습니다.



OHLC 환경의 경우 다음 기능을 사용합니다.

 //-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open ( int index)
  {
   double open= 0 ;
   ArraySetAsSeries ( Open , true );
   int copied= CopyOpen ( Symbol (), 0 , 0 , Bars ( Symbol (), 0 ), Open );
   if (copied> 0 && index<copied) open= Open [index];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low ( int index)
  {
   double low= 0 ;
   ArraySetAsSeries ( Low , true );
   int copied= CopyLow ( Symbol (), 0 , 0 , Bars ( Symbol (), 0 ), Low );
   if (copied> 0 && index<copied) low= Low [index];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High ( int index)
  {
   double high= 0 ;
   ArraySetAsSeries ( High , true );
   int copied= CopyHigh ( Symbol (), 0 , 0 , Bars ( Symbol (), 0 ), High );
   if (copied> 0 && index<copied) high= High [index];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close ( int index)
  {
   double close= 0 ;
   ArraySetAsSeries ( Close , true );
   int copied= CopyHigh ( Symbol (), 0 , 0 , Bars ( Symbol (), 0 ), Close );
   if (copied> 0 && index<copied) close= Close [index];
   return (close);
  }
내가 뭔가 잘못하고 있는 건 아닐까?
 
Aleksey Vyazmikin :

이유가 있어 아직 코드를 표시할 준비가 되지 않았습니다.

하지만 MT5의 프로파일링 결과를 보여드릴 준비가 되어 있습니다. 제가 알기로는 거래 기능에는 문제가 없습니다.

OHLC 환경의 경우 다음 기능을 사용합니다.

내가 뭔가 잘못하고 있는 건 아닐까?
 double iOpen ( string symbol, ENUM_TIMEFRAMES tf, int index) {
   if (index < 0 ) return (- 1 );
   double Arr[];
   if ( CopyOpen (symbol,tf, index, 1 , Arr)> 0 )
         return (Arr[ 0 ]);
   else return (- 1 );
 }

double iClose ( string symbol, ENUM_TIMEFRAMES tf, int index) {
   if (index < 0 ) return (- 1 );
   double Arr[];
   if ( CopyClose (symbol,tf, index, 1 , Arr)> 0 )
         return (Arr[ 0 ]);
   else return (- 1 );
 }

double iHigh ( string symbol, ENUM_TIMEFRAMES tf, int index) {
   if (index < 0 ) return (- 1 );
   double Arr[];
   if ( CopyHigh (symbol,tf, index, 1 , Arr)> 0 )
         return (Arr[ 0 ]);
   else return (- 1 );
 }

double iLow ( string symbol, ENUM_TIMEFRAMES tf, int index) {
   if (index < 0 ) return (- 1 );
   double Arr[];
   if ( CopyLow (symbol,tf, index, 1 , Arr)> 0 )
         return (Arr[ 0 ]);
   else return (- 1 );
 }
 

기록에서 사용 가능한 모든 막대를 복사하고 있지만 실제로는 검색된 인덱스 가 하나만 필요합니다.

 CopyOpen ( Symbol (), 0 , index , Bars ( Symbol (), 0 ) 1 , Open );
 
Vitaly Muzichenko :

기록에서 사용 가능한 모든 막대를 복사하고 있지만 실제로는 검색된 인덱스 가 하나만 필요합니다.

나는 당신의 조리법에 따라 그것을 바꿨고 고문은 주문 개시를 중단했습니다 ... 아마도 그가 다시 망쳤습니까?


 //-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open ( int index)
  {
   double open= 0 ;
   ArraySetAsSeries ( Open , true );
   int copied= CopyOpen ( Symbol (), 0 ,index, 1 , Open );
   if (copied> 0 && index<copied) open= Open [index];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low ( int index)
  {
   double low= 0 ;
   ArraySetAsSeries ( Low , true );
   int copied= CopyLow ( Symbol (), 0 ,index, 1 , Low );
   if (copied> 0 && index<copied) low= Low [index];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High ( int index)
  {
   double high= 0 ;
   ArraySetAsSeries ( High , true );
   int copied= CopyHigh ( Symbol (), 0 ,index, 1 , High );
   if (copied> 0 && index<copied) high= High [index];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close ( int index)
  {
   double close= 0 ;
   ArraySetAsSeries ( Close , true );
   int copied= CopyHigh ( Symbol (), 0 ,index, 1 , Close );
   if (copied> 0 && index<copied) close= Close [index];
   return (close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double open= 0 ;
   ArraySetAsSeries (OpenI, true );
   int copied= CopyOpen (symbol,timeframe,index, 1 ,OpenI);
   if (copied> 0 && index<copied) open=OpenI[index];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double low= 0 ;
   ArraySetAsSeries (LowI, true );
   int copied= CopyLow (symbol,timeframe,index, 1 ,LowI);
   if (copied> 0 && index<copied) low=LowI[index];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double high= 0 ;
   ArraySetAsSeries (HighI, true );
   int copied= CopyHigh (symbol,timeframe,index, 1 ,HighI);
   if (copied> 0 && index<copied) high=HighI[index];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double close= 0 ;
   ArraySetAsSeries (CloseI, true );
   int copied= CopyHigh (symbol,timeframe,index, 1 ,CloseI);
   if (copied> 0 && index<copied) close=CloseI[index];
   return (close);
  }
 
Aleksey Vyazmikin :

나는 당신의 조리법에 따라 그것을 바꿨고 고문은 주문 개시를 중단했습니다 ... 아마도 그가 다시 망쳤습니까?


 double Close ( int index)
  {
   double close= 0 ;
   ArraySetAsSeries ( Close , true );
   int copied= Copy High ( Symbol (), 0 ,index, 1 , Close );
   if (copied> 0 && index<copied) close= Close [index];
   return (close);
  }

닫기 != 높음


추신. 여기 에 쓰십시오. 이것은 주제가 아닙니다.

나는 이것을 쓰레기로 만들지 않도록 중재자에게 게시물을 올바른 주제로 이동하도록 요청합니다.

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Vitaly Muzichenko :

닫기 != 높음

추신. 여기 에 쓰십시오. 이것은 주제가 아닙니다.

나는 이것을 쓰레기로 만들지 않도록 중재자에게 게시물을 올바른 주제로 이동하도록 요청합니다.

감사합니다 - 수정했습니다.

결국 코드는 다음과 같습니다

 //-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open ( int index)
  {
   double open= 0 ;
   int copied= CopyOpen ( Symbol (), 0 ,index, 1 , Open );
   if (copied> 0 ) open= Open [ 0 ];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low ( int index)
  {
   double low= 0 ;
   int copied= CopyLow ( Symbol (), 0 ,index, 1 , Low );
   if (copied> 0 ) low= Low [ 0 ];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High ( int index)
  {
   double high= 0 ;
   int copied= CopyHigh ( Symbol (), 0 ,index, 1 , High );
   if (copied> 0 ) high= High [ 0 ];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close ( int index)
  {
   double close= 0 ;
   int copied= CopyClose ( Symbol (), 0 ,index, 1 , Close );
   if (copied> 0 ) close= Close [ 0 ];
   return (close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double open= 0 ;
   int copied= CopyOpen (symbol,timeframe,index, 1 ,OpenI);
   if (copied> 0 ) open=OpenI[ 0 ];
   return (open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double low= 0 ;
   int copied= CopyLow (symbol,timeframe,index, 1 ,LowI);
   if (copied> 0 ) low=LowI[ 0 ];
   return (low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double high= 0 ;
   int copied= CopyHigh (symbol,timeframe,index, 1 ,HighI);
   if (copied> 0 ) high=HighI[ 0 ];
   return (high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double close= 0 ;
   int copied= CopyClose (symbol,timeframe,index, 1 ,CloseI);
   if (copied> 0 ) close=CloseI[ 0 ];
   return (close);
  }

테스터의 시간이 길어졌습니다 - 나는 이미 기다림에 지쳤습니다 :)

 

나는 이번 달의 기록에서 거래된 랏을 계산합니다.

   double lots= 0 ;
   for ( int i= OrdersHistoryTotal ()- 1 ;i>= 0 ;i--)
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))
         if ( TimeMonth ( OrderCloseTime ())== TimeMonth ( TimeCurrent ()))
             if ( OrderType ()< 2 )
               lots+= OrderLots ();

예를 들어 지난 3일 동안 터미널 기록에 주문을 표시하면 OrdersHistoryTotal ()은 지난 3일만 볼 수 있습니다.

이것이 올바르지 않다고 생각합니다. OrdersHistoryTotal ()은 전체 기록의 모든 주문을 보고, 프로그래머는 날짜와 기간으로 필터링해야 합니다.

그렇지 않으면 사용자가 이력을 잘못 숨기면 문제가 발생할 수 있습니다....