초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 729

 
Artyom Trishkin :
그래서 어떻게 든 ( @fxsaber 의 솔루션 ):

//+------------------------------------------------------------------+
//| Возвращает смещение бара по времени                              |
//+------------------------------------------------------------------+
int GetBarShift( const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=- 1 ;
   datetime last_bar;
   if ( SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE ,last_bar)) {
       if (time>last_bar) res= 0 ;
       else {
         const int shift= Bars (symbol_name,timeframe,time,last_bar);
         if (shift> 0 ) res=shift- 1 ;
         }
      }
   return (res);
}
//+------------------------------------------------------------------+
여기 어딘가에 누군가가 선택한 행에서 다음을 수행해야 한다고 썼습니다. if (time>=last_bar) res= 0 ;

나는 그것을 확인하지 않았습니다. 솔직히 말해서 - 항상 도달하지는 않습니다. 결과를 확인하고 게시하십시오.
내가 썼어. 그리고 이것은 논리적입니다. 왜냐하면. 시간이 현재 막대의 여는 시간과 일치하면 해당 인덱스도 0입니다. 예, fxsaber의 순수한 솔루션은 오류와 함께 작동합니다.
 
Alexey Kozitsyn :
내 솔루션이 얼마나 "더 쉬운"지는 모르겠지만 다음을 시도하십시오. https://www.mql5.com/ru/forum/160945#comment_4053382

그런데 그 언어 에는 표준 기능이 없고 모두가 자신의 자전거를 만들어야 하고 그 후에 성능을 측정 해야 합니까?

이거 빼고 다 찾은거같은데 다른 솔루션을 보니 "누가 뭘 신경써"

 
Vitaly Muzichenko :

그런데 그 언어 에는 표준 기능이 없고 모두가 자신의 자전거를 만들어야 하고 그 후에 성능을 측정 해야 합니까?

이거 빼고 다 찾은거같은데 다른 솔루션을 보니 "누가 뭘 신경써"

표준이 없습니다. 기사 https://www.mql5.com/en/articles/81에서 옵션을 제공했습니다. "목발"도 거기에 설명되어 있습니다.
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 

마지막 질문. 오늘 저는 코드베이스에서 "마스터"의 코드를 보았으므로 다음이 사용되었습니다.

   double open_1= iOpen ( 1 );
   double open_2= iOpen ( 2 );
   double high_0= iHigh ( 0 );
   double high_1= iHigh ( 1 );
   double high_2= iHigh ( 2 );
   double high_3= iHigh ( 3 );
   double low_0= iLow ( 0 );
   double low_1= iLow ( 1 );
   double low_2= iLow ( 2 );
   double low_3= iLow ( 3 );
   double close_1= iClose ( 1 );
   double close_2= iClose ( 2 );


어제 비슷한 글을 썼지만 다음과 같이 썼습니다.

ArraySetAsSeries (Tick, true );
if ( CopyRates (dSymbol, 0 , 1 , 3 ,Tick)< 0 ) return ;
  open1 = Tick[ 0 ].open;  open2 = Tick[ 1 ].open;  open3 = Tick[ 2 ].open;
  high1 = Tick[ 0 ].high;  high2 = Tick[ 1 ].high;  high3 = Tick[ 2 ].high;
  low1  = Tick[ 0 ].low;   low2  = Tick[ 1 ].low;   low3  = Tick[ 2 ].low;
  close1= Tick[ 0 ].close; close2= Tick[ 1 ].close; close3= Tick[ 2 ].close;


오늘 본 후, 나는 내 결정이 옳았는지 의심하기 시작했습니다.

질문: 어떤 옵션이 더 낫습니까? 아니면 그냥 배우는 중입니까?

 
Vitaly Muzichenko :

마지막 질문. 오늘 저는 코드베이스에서 "마스터"의 코드를 보았으므로 다음이 사용되었습니다.

   double open_1= iOpen ( 1 );
   double open_2= iOpen ( 2 );
   double high_0= iHigh ( 0 );
   double high_1= iHigh ( 1 );
   double high_2= iHigh ( 2 );
   double high_3= iHigh ( 3 );
   double low_0= iLow ( 0 );
   double low_1= iLow ( 1 );
   double low_2= iLow ( 2 );
   double low_3= iLow ( 3 );
   double close_1= iClose ( 1 );
   double close_2= iClose ( 2 );


어제 비슷한 글을 썼지만 다음과 같이 썼습니다.

ArraySetAsSeries (Tick, true );
if ( CopyRates (dSymbol, 0 , 1 , 3 ,Tick)< 0 ) return ;
  open1 = Tick[ 0 ].open;  open2 = Tick[ 1 ].open;  open3 = Tick[ 2 ].open;
  high1 = Tick[ 0 ].high;  high2 = Tick[ 1 ].high;  high3 = Tick[ 2 ].high;
  low1  = Tick[ 0 ].low;   low2  = Tick[ 1 ].low;   low3  = Tick[ 2 ].low;
  close1= Tick[ 0 ].close; close2= Tick[ 1 ].close; close3= Tick[ 2 ].close;


오늘 본 후, 나는 내 결정이 옳았는지 의심하기 시작했습니다.

질문: 어떤 옵션이 더 낫습니까? 아니면 그냥 배우는 중입니까?

이 경우 복사 호출이 더 적기 때문에 구현이 더 빠르게 작동해야 합니다. 한 번에 하나의 값을 복사하는 것이 아니라 한 번에 3개의 값을 복사하는 것입니다.

아무도 한 번에 하나의 값을 얻기 위해 코드를 변환하는 것을 귀찮게 하지는 않지만:

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   double Close [ 1 ];
   double close= 0 ;
   int copied= CopyClose (symbol,timeframe,index, 1 , Close );
   if (copied> 0 ) close= Close [ 0 ];
   return (close);
  }

한 번에 여러 값을 가져오기 위한 코드로. 난 그냥 게으른 :)

 
Vladimir Karputov :

이 경우 복사 호출이 더 적기 때문에 구현이 더 빠르게 작동해야 합니다. 한 번에 하나의 값을 복사하는 것이 아니라 한 번에 3개의 값을 복사하는 것입니다.

아무도 한 번에 하나의 값을 얻기 위해 코드를 변환하는 것을 귀찮게 하지는 않지만:

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  }

한 번에 여러 값을 가져오기 위한 코드로. 난 그냥 게으른 :)

답변 해주셔서 감사합니다!

즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?

 
Vitaly Muzichenko :

답변 해주셔서 감사합니다!

즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?

CopyRates 는 최소한 두 가지 확인이 필요합니다.

  1. 오류 검사(if ... <0)
  2. 확인하지만 함수가 필요한 양을 반환했는지 확인합니다(갑자기 3개를 요구했지만 2개만 반환?)
또한 매우 바람직합니다. 쓰레기의 존재 여부에 대한 가격을 확인하는 것(가격이 아닌 "0"을 반환할 수 있는 가격일 수 있음)

 
Vitaly Muzichenko :

답변 해주셔서 감사합니다!

즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?

솔루션도 최적이 아닙니다. 이미 받은 배열의 값으로 많은 변수를 초기화하고 있습니다. 질문: 왜? 배열만 사용할 수 있는 경우는 언제입니까? 이름을 Bar로 지정하면 행복할 것입니다.

ArraySetAsSeries ( Bars , true );
if ( CopyRates ( Symbol (), 0 , 1 , 3 , Bars )< 0 ) return ;
double value = Bars [ 0 ].open;
...
 
Vasiliy Sokolov :

솔루션도 최적이 아닙니다. 이미 받은 배열의 값으로 많은 변수를 초기화하고 있습니다. 질문: 왜? 배열만 사용할 수 있는 경우는 언제입니까? 이름을 Bar로 지정하면 행복할 것입니다.

ArraySetAsSeries ( Bars , true );
if ( CopyRates ( Symbol (), 0 , 1 , 3 , Bars )< 0 ) return ;
double value = Bars [ 0 ].open;
...

Bars 라고 불리는 컴파일러는 세상이 의미하는 바를 꾸짖었습니다. 이 디자인을 테스트했습니까? 아니면 작동해야 한다고 가정했습니까? 아니면 제가 뭔가 잘못하고 있습니까?

 
Vitaly Muzichenko :

Bars 라고 불리는 컴파일러는 세상이 의미하는 바를 꾸짖었습니다. 이 디자인을 테스트했거나 작동해야 한다고 가정했습니까?

바[]
사유: