Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
이 경우 복사 호출이 더 적기 때문에 구현이 더 빠르게 작동해야 합니다. 한 번에 하나의 값을 복사하는 것이 아니라 한 번에 3개의 값을 복사하는 것입니다.
아무도 한 번에 하나의 값을 얻기 위해 코드를 변환하는 것을 귀찮게 하지는 않지만:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose ( constint index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT ) { if (symbol== NULL ) symbol= Symbol (); if (timeframe== 0 ) timeframe= Period (); doubleClose [ 1 ]; double close= 0 ; int copied= CopyClose (symbol,timeframe,index, 1 , Close ); if (copied> 0 ) close= Close [ 0 ]; return (close); }
이 경우 복사 호출이 더 적기 때문에 구현이 더 빠르게 작동해야 합니다. 한 번에 하나의 값을 복사하는 것이 아니라 한 번에 3개의 값을 복사하는 것입니다.
아무도 한 번에 하나의 값을 얻기 위해 코드를 변환하는 것을 귀찮게 하지는 않지만:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose ( constint index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT ) }
한 번에 여러 값을 가져오기 위한 코드로. 난 그냥 게으른 :)
답변 해주셔서 감사합니다!
즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?
그래서 어떻게 든 ( @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);
}
//+------------------------------------------------------------------+
나는 그것을 확인하지 않았습니다. 솔직히 말해서 - 항상 도달하지는 않습니다. 결과를 확인하고 게시하십시오.
내 솔루션이 얼마나 "더 쉬운"지는 모르겠지만 다음을 시도하십시오. https://www.mql5.com/ru/forum/160945#comment_4053382
그런데 그 언어 에는 표준 기능이 없고 모두가 자신의 자전거를 만들어야 하고 그 후에 성능을 측정 해야 합니까?
이거 빼고 다 찾은거같은데 다른 솔루션을 보니 "누가 뭘 신경써"
그런데 그 언어 에는 표준 기능이 없고 모두가 자신의 자전거를 만들어야 하고 그 후에 성능을 측정 해야 합니까?
이거 빼고 다 찾은거같은데 다른 솔루션을 보니 "누가 뭘 신경써"
마지막 질문. 오늘 저는 코드베이스에서 "마스터"의 코드를 보았으므로 다음이 사용되었습니다.
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 );
어제 비슷한 글을 썼지만 다음과 같이 썼습니다.
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;
오늘 본 후, 나는 내 결정이 옳았는지 의심하기 시작했습니다.
질문: 어떤 옵션이 더 낫습니까? 아니면 그냥 배우는 중입니까?
마지막 질문. 오늘 저는 코드베이스에서 "마스터"의 코드를 보았으므로 다음이 사용되었습니다.
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 );
어제 비슷한 글을 썼지만 다음과 같이 썼습니다.
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);
}
한 번에 여러 값을 가져오기 위한 코드로. 난 그냥 게으른 :)
이 경우 복사 호출이 더 적기 때문에 구현이 더 빠르게 작동해야 합니다. 한 번에 하나의 값을 복사하는 것이 아니라 한 번에 3개의 값을 복사하는 것입니다.
아무도 한 번에 하나의 값을 얻기 위해 코드를 변환하는 것을 귀찮게 하지는 않지만:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
}
한 번에 여러 값을 가져오기 위한 코드로. 난 그냥 게으른 :)
답변 해주셔서 감사합니다!
즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?
답변 해주셔서 감사합니다!
즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?
CopyRates 는 최소한 두 가지 확인이 필요합니다.
답변 해주셔서 감사합니다!
즉, 제가 올린 솔루션을 적용하는 것이 좋겠죠? 한 번만 확인하면 충분합니다. 오류가 없을까요?
솔루션도 최적이 아닙니다. 이미 받은 배열의 값으로 많은 변수를 초기화하고 있습니다. 질문: 왜? 배열만 사용할 수 있는 경우는 언제입니까? 이름을 Bar로 지정하면 행복할 것입니다.
if ( CopyRates ( Symbol (), 0 , 1 , 3 , Bars )< 0 ) return ;
double value = Bars [ 0 ].open;
...
솔루션도 최적이 아닙니다. 이미 받은 배열의 값으로 많은 변수를 초기화하고 있습니다. 질문: 왜? 배열만 사용할 수 있는 경우는 언제입니까? 이름을 Bar로 지정하면 행복할 것입니다.
if ( CopyRates ( Symbol (), 0 , 1 , 3 , Bars )< 0 ) return ;
double value = Bars [ 0 ].open;
...
Bars 라고 불리는 컴파일러는 세상이 의미하는 바를 꾸짖었습니다. 이 디자인을 테스트했습니까? 아니면 작동해야 한다고 가정했습니까? 아니면 제가 뭔가 잘못하고 있습니까?
Bars 라고 불리는 컴파일러는 세상이 의미하는 바를 꾸짖었습니다. 이 디자인을 테스트했거나 작동해야 한다고 가정했습니까?