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

 
Aleksey Vyazmikin :

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

하지만 MT5에서 프로파일링한 결과를 보여줄 준비가 되었습니다. 제가 이해하기로는 거래 기능에 대해서는 의문의 여지가 없습니다.



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

내가 뭔가 잘못하고 있는 건 아닐까?

불행히도, 당신 은 모든 것을 잘못하고 있습니다.

기본적이고 효율적인 MQL5 코드를 작성하는 대신 수십 배의 속도를 줄이는 매우 비효율적인 MQL4 코드 에뮬레이터를 사용하고 있습니다.

나쁜 점은 속도에 대해 질문을 하기 때문에 자신이 하는 일조차 이해하지 못한다는 것입니다.
 
Aleksey Vyazmikin :

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

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • 투표: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

감사합니다 - 이 라이브러리를 봤습니다 - 설명이 혼란스럽습니다


대부분의 시간은 초기화 단계에서 소비됩니다 . 시계열 데이터에 여러 번 액세스할 계획이 없다면(막대를 형성하는 동안 수천 번 이상) 다른 방법을 고려해야 합니다.

내 고문은 술집을 열 때만 일합니다. 시도해 보는 것이 합리적이라고 생각하십니까?
 
Renat Fatkhullin :

불행히도, 당신 은 모든 것을 잘못하고 있습니다.

기본적이고 효율적인 MQL5 코드를 작성하는 대신 수십 배의 속도를 줄이는 매우 비효율적인 MQL4 코드 에뮬레이터를 사용하고 있습니다.

나쁜 점은 속도에 대해 질문을 하기 때문에 자신이 하는 일조차 이해하지 못한다는 것입니다.

물론 MQL4 기능을 MQL5로 대체하는 방법, 특히 시계열에 대한 액세스 방법을 찾고 있었는데 이것이 대부분의 사람들이 MQL5로 전환할 때 직면하는 문제 중 하나라는 것을 알았습니다.

따라서 기사 중 하나에서 내가 사용한 방법을 권장하는 동일한 사이트에서 솔루션을 찾았습니다.

개인적으로 언어에서 좋고 편리한 기능을 제거하는 요점이 무엇인지 이해하지 못합니다.

따라서 MQL5 언어 의 장점을 느끼기 위해 정보 수신을 적절하게 구성하는 방법은 무엇입니까?

 
Aleksey Vyazmikin :

따라서 MQL5 언어 의 장점을 느끼기 위해 정보 수신을 적절하게 구성하는 방법은 무엇입니까?

MQL4 코드에 집착하지 않고 MQL5 언어의 네이티브, 보다 생산적인 기능을 사용하십시오. 모든 MQL4 -> MQL5 변환기/단순화기는 MQL4에서 MQL5 대량 작업을 통해 직접 액세스 마이크로 기능을 에뮬레이트하려고 하기 때문에 수십 배의 속도 저하를 수반합니다. 또한 에뮬레이션에는 최적화 및 캐싱이 전혀 없습니다.

특정 기능(다른 사람의 코드를 포함한 코드 조각) 사용의 근간에는 정확히 무엇을 하고 있는지에 대한 이해가 있어야 합니다. 그렇지 않으면 "방금 다른 사람의 코드를 사용했습니다. 속도가 떨어졌습니다!"로 나타납니다. 도구와 그 도구로 무엇을 하는지 이해하지 못하면 좋은 결과를 얻을 수 없습니다.


"올바른 방법"과 함께 "프로그래밍 배우기"라는 작업은 언어 조작(이해도 아니라 조작)의 가장 기본적인 수준 이상으로 올라가면 매우 어렵다는 것을 분명히 밝힙니다. 따라서 나는 많은 기사, 문서, 라이브러리의 기성 코드 및 몇 년 동안의 필수 연습을 읽는 것 외에는 배울 수 있는 다른 방법이 없습니다.
 
Renat Fatkhullin :

MQL4 코드에 집착하지 않고 MQL5 언어의 네이티브, 보다 생산적인 기능을 사용하십시오.

특정 기능(다른 사람의 코드를 포함한 코드 조각) 사용의 근간에는 정확히 무엇을 하고 있는지에 대한 이해가 있어야 합니다. 그렇지 않으면 "방금 다른 사람의 코드를 사용했습니다. 속도가 떨어졌습니다!"로 나타납니다. 도구와 그 도구로 무엇을 하는지 이해하지 못하면 좋은 결과를 얻을 수 없습니다.


"올바른 방법"과 함께 "프로그래밍 배우기"라는 작업은 언어 조작(이해도 아니라 조작)의 가장 기본적인 수준 이상으로 올라가면 매우 어렵다는 것을 분명히 밝힙니다. 따라서 나는 많은 기사, 문서, 라이브러리의 기성 코드 및 몇 년 동안의 필수 연습을 읽는 것 외에는 배울 수 있는 다른 방법이 없습니다.

Renat, 코드 베이스를 보았습니까? 그곳에서 MQL4 언어에서 정확하게 조정된 기능이 있는 코드를 발견했습니다.

환경에 대한 정보를 올바르게 얻는 방법을 구체적으로 작성해 주시기 바랍니다. 추상적인 책을 참조하는 것은 생산적이지 않으며 이 참조가 검증할 수 없는 변명일 뿐이라는 내 (아마도 잘못된) 생각을 강화시킬 뿐입니다.

내가 너무 멍청해서 배열에 정보를 복사하는 기능의 의미를 이해하지 못한다는 것은 프로그래밍 언어에 대한 문서를 컴파일하는 낮은 수준에 대해 이야기한다는 의미입니다. 한 배열에서 다른 배열로 복사하는 것의 이점이 무엇이며 필요에 따라 배열에서 정보를 가져오는 함수가 왜 끔찍한 코드인지 이해하지 못합니다.

 
Aleksey Vyazmikin :

물론 MQL4 기능을 MQL5로 대체하는 방법, 특히 시계열 접근에 대한 솔루션을 찾고 있었는데 이것이 MQL5로 전환할 때 대부분의 사람들이 직면하는 문제 중 하나라는 것을 알았습니다.

따라서 기사 중 하나에서 내가 사용한 방법을 권장하는 동일한 사이트에서 솔루션을 찾았습니다.

개인적으로 언어에서 좋고 편리한 기능을 제거하는 요점이 무엇인지 이해하지 못합니다.

따라서 MQL5 언어 의 장점을 느끼기 위해 정보 수신을 적절하게 구성하는 방법은 무엇입니까?

내가 잘못 검색한 것은 아닐까? 여기 , 하나의 사본으로 이 모든 코드 대신 필요한 모든 것을 얻을 수 있습니다.

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

오류, 버그, 질문

알렉세이 비아즈미킨 , 2017.07.21 01:20

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

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

 //-------------------------------------------------------------------
//==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);
  }

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

이것을 사용하기 위해서는 구조체가 무엇인지 이해하는 것으로 충분합니다.

 struct MqlRates
  {
   datetime time;         // время начала периода
   double    open;         // цена открытия
   double    high;         // наивысшая цена за период
   double    low;           // наименьшая цена за период
   double    close;         // цена закрытия
   long      tick_volume;   // тиковый объем
   int       spread;       // спред
   long      real_volume;   // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov :

내가 잘못 검색한 것은 아닐까? 여기 , 하나의 사본으로 이 모든 코드 대신 필요한 모든 것을 얻을 수 있습니다.

이것을 사용하기 위해서는 구조체가 무엇인지 이해하는 것으로 충분합니다.



우리는 같은 것을 얻습니다 - 사실...

제안한 옵션은 다음과 같은 경우에 적합합니다.

- 막대가 열려 있을 때만 계산이 발생합니다.

- 얼마나 많은 막대가 필요할지 미리 알고 있습니다.

내 코드에 주기가 있으므로 계산량을 미리 알지 못할 수 있습니다.

그리고 바가 열릴 때마다 300개의 바에 대한 정보를 복사하는 의미가 무엇입니까? 새 바에 대한 정보를 추가하는 것이 더 논리적이라면 개발자는 왜 이 방법을 사용하지 않았습니까?

 
죄송합니다. 각 특정 초보자에게 프로그래밍을 가르칠 시간이 전혀 없습니다. 특히 사람이 프로그래밍에 대한 이해의 기초조차 가지지 않은 것이 분명하고 진부한 것을 묻습니다.


하지만 방향을 알려드리겠습니다.

  1. MQL5 문서
  2. 코드베이스
  3. 조항
  4. 포럼("저를 위해 글을 쓰세요. 왜 저를 가르치고 제 일을 하지 않으시겠습니까?"가 아님)
  5. 프리랜서(여기서 올바르게 작성할 수 있음)
  6. 사려 깊은 분석을 통한 독립적인 작업 "이 래퍼가 느려지고 리소스가 낭비되는 이유는 무엇입니까? 최적으로 다시 작성할 수 있습니까?"
  7. 각 코드 줄에서 실제 리소스 사용량을 보여주는 프로파일러 사용
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

그래서 이런 맥락에서 소통하고 싶은 생각은 없습니다. 무슨 일이 일어나는지 알아내기 위해 말하는 내용을 이해하려고 하는 대신 몇 가지 놀라운 반대 의견이 나옵니다.

사유: