voidOnStart ()
{
int t;
int s;
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
MqlDateTime m;
TimeCurrent (m);
t=m.min;
s=m.sec;
}
uint time= GetTickCount ()-start;
Print ( "time = " ,time, " ms" );
}
Expert Advisor에서 최적화를 위해 다음 코드를 만들었습니다.
staticdouble ind1; //записываю значенияstaticdouble ind2; // значенияstaticdouble indsmall; //индикаторовMqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
if (MIN== 0 && SEC== 0 )//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}
각 틱에서 표시기 값을 얻을 때 새 막대를 확인하지 않고 단일 실행 결과: 817,196ms
새로운 바 체크 포함: 735,904ms
차이점은 특별히 인상적이지 않고 개선 사항이 있지만 이것으로 충분하지 않습니다.
다음과 같은 표시기를 얻습니다.
int TSIHandle; // хэндл индикатора TSIdouble TSI[]; // динамические массивы для хранения численных значений TSIintOnInit ()
{
TSIHandle= iCustom ( NULL , 0 , "Blau_TSI" ,q,r,s,u, PRICE_CLOSE );
if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}
ArraySetAsSeries (TSI, true );
return ( 0 );
}
voidOnDeinit ( constint reason)
{
//--- освобождаем хэндлы индикаторовIndicatorRelease (TSIHandle);
ArrayFree (TSI);
}
voidOnTick ()
{
MqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
staticdouble tsismall;
if (MIN== 0 && SEC== 0 )
{
//--- копируем значения индикаторов из индикаторных буферовif ( CopyBuffer (TSIHandle, 0 , 0 , 3 ,TSI)< 0 )
{
Alert ( "Ошибка копирования буферов индикатора Moving Average - номер ошибки:" , GetLastError (), "!!" );
return ;
}
tsismall=TSI[ 1 ];
}
}
새 막대가 확인되는 블록에 핸들 호출이 있는 코드를 배치하려고 했습니다. 이 행이 있으면 오류가 발생합니다.
if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}
나는 그반환 을 넣어아무 것도 반환하지 않고 오류도 없지만 어드바이저는 작동하지 않습니다.
가능한 경우 핸들의 호출, 그리고 일반적으로 정적 변수를 제외한 모든 주요 코드는 새 막대를 확인하기 위해 조건부 연산자 내부에 배치되어야 한다고 가정합니다.
내가 틀리지 않았다면 어딘가에서 핸들을 호출해도 버퍼에 표시기를 요청하지 않아도 여전히 계산된다는 것을 읽었습니다.
rus-lot : 하나의 공식 버퍼[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)의 결과 출력을 기반으로 지표를 만드는 방법을 알려줄 수 있는 사람 ))*10000;
사용자 지정 지표를 작성해야 합니다. 프로세스를 더 쉽게 만들려면 가장 간단한 표시기 중 하나인 iMa 를 사용하여 약간 다시 작성하십시오. 다음은 MarketInfo에 대해 이야기하는 또 다른 스레드 입니다. 코드를 작성하고 문제가 해결되지 않으면 물어보십시오.
스크립트에서 다음과 같이 했습니다.
시간=0
SymbolInfoTick은 월요일에 확인합니다.
다음 코드로 확인할 수 있습니다.
그러나 기호로 진드기가 필요합니다.
다음 코드로 확인할 수 있습니다.
그러나 기호로 진드기가 필요합니다.
예, " SymbolInfoTick ", 오늘 테스트되지 않았습니다.
틱이 갈 때까지 시도했지만 아무 것도 작동하지 않습니다.
iask=0예, "SymbolInfoTick", 오늘 테스트되지 않았습니다.
틱이 갈 때까지 시도했지만 아무 것도 작동하지 않습니다.
iask=0이 기능은 너무 빠릅니다.
성능을 측정하려면 반복 횟수가 많은 루프에서 여러 호출을 적용하고 총 실행 시간을 측정해야 합니다.
더 흥미로운 것은 코드 예제가 있다는 것입니다. 결과를 기다리고 있습니다.
EA에서 새 막대를 확인하기 위해 포럼에서 찾은 "CopyTime", "CopyRates"를 기반으로 하는 기능을 사용했습니다. 나는 그들의 계산에 많은 시간이 걸린다는 결론에 이르렀다.
다음은 확인 데이터입니다( 표시기 호출 에 171ms가 소요됨).
그리고 나는 시도하면 다른 것을 생각했습니다. 예를 들어 "TimeCurrent"
최적화를 위해 다음 코드를 만들었습니다.
Expert Advisor에서 최적화를 위해 다음 코드를 만들었습니다.
각 틱에서 표시기 값을 얻을 때 새 막대를 확인하지 않고 단일 실행 결과: 817,196ms
새로운 바 체크 포함: 735,904ms
차이점은 특별히 인상적이지 않고 개선 사항이 있지만 이것으로 충분하지 않습니다.
다음과 같은 표시기를 얻습니다.
새 막대가 확인되는 블록에 핸들 호출이 있는 코드를 배치하려고 했습니다. 이 행이 있으면 오류가 발생합니다.
나는 그 반환 을 넣어 아무 것도 반환하지 않고 오류도 없지만 어드바이저는 작동하지 않습니다.
가능한 경우 핸들의 호출, 그리고 일반적으로 정적 변수를 제외한 모든 주요 코드는 새 막대를 확인하기 위해 조건부 연산자 내부에 배치되어야 한다고 가정합니다.
내가 틀리지 않았다면 어딘가에서 핸들을 호출해도 버퍼에 표시기를 요청하지 않아도 여전히 계산된다는 것을 읽었습니다.
하나의 공식 버퍼[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)의 결과 출력을 기반으로 지표를 만드는 방법을 알려줄 수 있는 사람 ))*10000;
사용자 지정 지표를 작성해야 합니다. 프로세스를 더 쉽게 만들려면 가장 간단한 표시기 중 하나인 iMa 를 사용하여 약간 다시 작성하십시오. 다음은 MarketInfo에 대해 이야기하는 또 다른 스레드 입니다. 코드를 작성하고 문제가 해결되지 않으면 물어보십시오.
정적 변수 는 어떻게 되었습니까? 오늘 나는 터미널의 이전 빌드를 업데이트했고 이제 오류를 컴파일할 때:
이제 클래스의 정적 데이터 멤버를 배치해야 합니다 .