포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 388

 
gyfto :

전문가를 위해 틱을 구성하려고 하지만 작동하지 않습니다. 주말은 나를 놀라게 했다. 올바르게 구성하는 방법? 예를 들어 다음과 같은 기본 전문가 고문이 있습니다.

- 틱을 시뮬레이션하고 타이머를 시작하는 방법은 무엇입니까?

주말인건 알겠는데 시장의 휴일 일정이 러시아연방 일정과 맞지 않아 계속 일을 해야 하는군요...

도서관.

 //=================================================================================================================================================
 // 4.7. Функции для управления обновлением графика.
 //=================================================================================================================================================
 // 4.7.1. Функция запускает обновление всех графиков с указанным периодом. Если обновление уже запущено, то функция меняет период обновления графиков.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshAllCharts( int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.2. Функция запускает обновление всех графиков однократно. Вызов функции при работающих других режимах останавливает обновление всех графиков.
 void ServiceRefreshAllOnceCharts();
 //=================================================================================================================================================
 // 4.7.3. Функция запускает обновление указанного графика с указанным периодом. Если обновление уже запущено, то функция меняет только период обновления графика.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshChart( int hwndChart,         // Системный дескриптор обновляемого графика.
                           int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.4. Функция запускает обновление автономных графиков с указанным периодом. Если обновление уже запущено, то функция меняет период обновления графиков.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshOfflineCharts( int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.5. Функция запускает обновление online-графиков с указанным периодом. Если обновление уже запущено, то функция меняет период обновления графиков.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshOnlineCharts( int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.6. Функция останавливает обновление указанного графика.
 void ServiceStopRefreshChart( int hwndChart); // Системный дескриптор графика, на котором останавливается обновление.
 //=================================================================================================================================================
 // 4.7.7. Функция корректно останавливает обновление всех графиков при bTerminate = FALSE, иначе функция завершает обновление аварийно.
 void ServiceStopRefreshAllCharts( int bTerminate); // Флаг аварийной остановки потоков обновления графиков.
                                                   // FALSE - потоки останавливаются корректно, TRUE - потоки останавливаются аварийно.
 //=================================================================================================================================================
 // 4.7.8. Функция эммулирует тик для эксперта на указанном графике.
 void ServiceTickExpert( int hwndChart); // Системный дескриптор окна графика, для эмуляции тика для эксперта.
 //=================================================================================================================================================
 // 4.7.9. Функция эммулирует тик для индикаторов на указанном графике.
 void ServiceTickIndicators( int hwndChart); // Системный дескриптор окна графика, для эмуляции тика для индикаторов.
 //=================================================================================================================================================
 
Zhunko :

도서관.


포럼에 연락하기 전에 사용하려고 했던 것은 ServiceTickExpert()였습니다. 지금 테스트 EA를 시작하려고 했습니다.

 #import "ServicesMT4.dll"
   void ServiceTickExpert( int hwndChart);
   void ServiceRefreshChart( int hwndChart, int nPeriodMilliSec);
#import
int delay = 180 ;
datetime read_now;
int init(){
   read_now = TimeCurrent () + delay;
}
int start(){
   int hWnd = WindowHandle ( Symbol (), Period ());
   ServiceTickExpert(hWnd);
   ServiceRefreshChart(hWnd, 500 );
   int how_many_remains = read_now - TimeCurrent ();
   Comment ( StringConcatenate (
       StringSubstr ( "-" , (how_many_remains% 60 >= 0 ), 0 ),
       StringSubstr ( "0" , ( MathAbs (how_many_remains/ 60 ) > 9 ), 0 ),
       MathAbs (how_many_remains/ 60 ),
       ":" ,
       StringSubstr ( "0" , ( MathAbs (how_many_remains% 60 ) > 9 ), 0 ),
       MathAbs (how_many_remains% 60 )
   ));
   return ( 0 );
}

- 그러나 침묵.

 
Link_x :
가장 중요한 것은 표시될 것이라는 것입니다. :)

이렇게 하면 엄청난 가치가 증발하지만 문제는 남아 있습니다.

나는 문제가 다음 줄에 있다고 생각합니다.

R_time        = Seconds () * Minute () * Hour (); 

모든 값에 동일한 시간 (서버의 현재 시간 또는 오히려 마지막으로 알려진 시간)이 곱해집니다.

또한 bool 유형의 변수 선언에서 두 배, 음, 다른 몇 가지 작은 잼이 있어야 합니다. 입문서는 아직 끝나지 않았습니다. 이해)))

 #property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Gold
#property indicator_color2 Gold
#property indicator_color3 Gold
//+---------------------------------------------------------------------+
extern double _N_ = 1 ; 
extern double _M_ = - 1 ; 
extern int History = 10000 ; //многовато, а вдруг столько на графике нету? Проверка нужна...
//+---------------------------------------------------------------------+
int p; 
//+---------------------------------------------------------------------+
double Buf_0[];
double Buf_1[];
double Buf_2[];
double RSI;
double ADX_Main; 
double ADX_dD;
double ADX_DD;
double price;
//+---------------------------------------------------------------------+  5 переменных ниже были обьявлены как bool , непонятно только с какого перепугу
double R_adx; 
double R_time;
double R_adx_time;
double R_rsi_time;
double R_rrsi_time;
//+---------------------------------------------------------------------+
int init()
{
//+---------------------------------------------------------------------+  
SetIndexBuffer ( 0 ,Buf_0);
SetIndexStyle ( 0 , DRAW_LINE );
//+---------------------------------------------------------------------+  
SetIndexBuffer ( 1 ,Buf_1);
SetIndexStyle ( 1 , DRAW_LINE );
//+---------------------------------------------------------------------+  
SetIndexBuffer ( 2 ,Buf_2);
SetIndexStyle ( 2 , DRAW_LINE );
//+---------------------------------------------------------------------+  
return ( 0 );
}
//+---------------------------------------------------------------------+
int start()
{
//+---------------------------------------------------------------------+  
for (
p= 0 ;
p<History;
p++)
{
//+---------------------------------------------------------------------+  
//price = Bid;
//+---------------------------------------------------------------------+  
ADX_Main    = iADX ( Symbol (), 0 , 14 , 0 , 0 ,p);
ADX_dD      = iADX ( Symbol (), 0 , 14 , 0 , 1 ,p);
ADX_DD      = iADX ( Symbol (), 0 , 14 , 0 , 2 ,p);
RSI         = iRSI ( Symbol (), 0 , 14 , 0 ,p);
//+---------------------------------------------------------------------+  
R_adx         = (ADX_DD - ADX_dD) * ADX_Main; 
string R_time1        = TimeToString ( Time [p], TIME_SECONDS ); //Время отркытия свечи р
R_time        = StringToDouble (R_time1); 
//+---------------------------------------------------------------------+  
R_adx_time    = _N_ * (R_time + R_adx);
R_rsi_time    = _N_ * (R_time + RSI);
R_rrsi_time   = _M_ * (R_time + RSI);
//+---------------------------------------------------------------------+  
Buf_0[p] = R_adx_time;
Buf_1[p] = R_rsi_time;
Buf_2[p] = R_rrsi_time;
//+---------------------------------------------------------------------+  
}
return ( 0 ); //эта строка была чуть  выше чем надо :)
}
//+-------------------
 
evillive :

나는 문제가 다음 줄에 있다고 생각합니다.

모든 값에 같은 시간(서버의 현재 시간 또는 마지막으로 알려진 시간)이 곱해집니다.

또한 bool 유형의 변수 선언에서 두 배, 음, 다른 몇 가지 작은 잼이 있어야 합니다. 입문서는 아직 끝나지 않았습니다. 이해)))


오 감사합니다!
오류와 버그를 이해합니다.
어떻게 이걸 얻을 수 있는지 정말 모르겠어? :)

인디케이터가 상상도 못한 그림을 그린다는 걸 알게 되었어요.
코드의 "본문"에 대해 약간 작업했습니다.
R_adx           = (ADX_DD - ADX_dD) * ADX_Main; 
string R_time_1 = TimeToStr ( Time [p], TIME_SECONDS );
R_time          = StrToDouble (R_time_1); 
string T_time_1 = TimeToStr ( Time [p], TIME_MINUTES );
T_time          = StrToDouble (T_time_1);
string B_time_1 = TimeToStr ( Time [p], TIME_DATE );
B_time          = StrToDouble (B_time_1);
A_time          = R_time * T_time * B_time;
내가 상상했던 것과 더 비슷합니다.
그러나 '일시적 파도'는 '가격파동'을 완전히 소멸시킨다. 우리는 "가격파동"을 강화하고 "일시파동"을 약화시킵니다.
R_rsi_time    = _N_ * (A_time + (RSI * 2000 )) / 1.9 ;
A_time          = R_time * T_time * B_time / 4 ;
R_adx           = ((ADX_DD - ADX_dD) * ADX_Main) * 40 ; 
 
gyfto :


포럼에 연락하기 전에 사용하려고 했던 것은 ServiceTickExpert()였습니다. 지금 테스트 EA를 시작하려고 했습니다.

- 그러나 침묵.

이것은 작동하지 않는 코드입니다. 그럼에도 불구하고 예제와 함께 스크립트를 살펴볼까요?

그래프를 업데이트하는 방법은 3가지가 있습니다.

1. Expert Advisor를 시작할 때 무한 루프를 직접 구성하십시오. 초기화 또는 원격 프로그램에서 Expert Advisor를 한 번 실행해야 합니다.
2. 다른 스레드에서 업데이트를 실행합니다. 그러면 코드에 관계없이 모든 Expert Advisor가 실행됩니다.

3. 포인트 2와 유사하게 모든 것이 동일하지만 시스템 타이머 를 사용합니다.

라이브러리에서 처음 2개가 구현됩니다. 코드에 있는 내용은 차트 업데이트 주기 또는 Expert Advisor의 루프에 대한 독립적인 구성이 필요합니다. 첫 번째 경우에는 반복 스크립트가 필요합니다. 두 번째 경우에는 Expert Advisor를 한 번 시작해야 합니다.

해당 섹션(4.7)의 처음 7개 기능은 업데이트를 구성하고 별도의 스레드에서 독립 그래프 업데이트를 관리합니다. 프로그램을 한 번 실행하고 언로드할 수 있습니다. 차트는 MQL 프로그램 없이 계속 업데이트됩니다.

 #include <ServicesMT4.mqh>

int delay = 180 ;
datetime read_now;
int hWnd = 0 ;

void init()
 {
  read_now = TimeCurrent () + delay;
  hWnd = WindowHandle ( Symbol (), Period ());
  ServiceRefreshChart(hWnd, 500 );
 }
void deinit()
 {
  ServiceStopRefreshChart(hWnd);
 }
void start()
 {
   int how_many_remains = TimeLocal () - read_now;
  Comment ( StringConcatenate ( StringSubstr ( "-" , (how_many_remains% 60 >= 0 ), 0 ),
                             StringSubstr ( "0" , ( MathAbs (how_many_remains/ 60 ) > 9 ), 0 ),
                             MathAbs (how_many_remains/ 60 ), ":" ,
                             StringSubstr ( "0" , ( MathAbs (how_many_remains% 60 ) > 9 ), 0 ),
                             MathAbs (how_many_remains% 60 )));
 }
 
Link_x :

오 감사합니다!
오류와 버그를 이해합니다.
어떻게 이걸 얻을 수 있는지 정말 모르겠어? :)

인디케이터가 상상도 못한 그림을 그린다는 걸 알게 되었어요.
코드의 "본문"에 대해 약간 작업했습니다.
내가 상상했던 것과 더 비슷합니다.
그러나 '일시적 파도'는 '가격파동'을 완전히 소멸시킨다. 우리는 "가격파동"을 강화하고 "일시적 파동"을 약화시킵니다.


뭐가 그렇게 무서운지 알 수 있습니다

R_adx           = (ADX_DD - ADX_dD) * ADX_Main; 
string R_time_1 = TimeToStr ( Time [p], TIME_SECONDS );
R_time          = StrToDouble (R_time_1); 
string T_time_1 = TimeToStr ( Time [p], TIME_MINUTES );
T_time          = StrToDouble (T_time_1);
string B_time_1 = TimeToStr ( Time [p], TIME_DATE );
B_time          = StrToDouble (B_time_1);
A_time          = R_time * T_time * B_time;
 
Zhunko :
그럼에도 불구하고 예제와 함께 스크립트를 살펴볼까요? 이것은 작동하지 않는 코드입니다.


하지만... 하지만 당신의 스크립트를 사용하여 잘 알려진 iTicks 스크립트를 수정했습니다! 여기에서 이제 다시 시작했습니다. 먼저 Expert Advisor 테스트(해당 코드는 이 페이지가 아닌 이전 페이지에 있음)를 하고 다음 수정으로 iTicks를 실행했습니다.

 #include <ServicesMT4.mqh>
extern int   delay_MSecond = 2000 ;
int start(){
   while (! IsStopped ()){
       string _symbol = Symbol (); int _period = Period ();
       int hWnd = WindowHandle (_symbol, _period);
      ServiceTickExpert(hWnd);
       Sleep (delay_MSecond);
   }
   return ( 0 );
}

Check_ServicesMT4.dll.mq4의 코드 샘플에 따라

 if (TickExpert) while (! IsStopped ()) {ServiceTickExpert(hwndChart); Sleep ( 1000 );}

차트에 변화 없음

"DLL 호출 허용" 확인란은...

추가됨

준코 :

그래프를 업데이트하는 방법은 3가지가 있습니다.

나는 이전 버전의 메시지에 답장을 보냈습니다. 용서를 구합니다. 지금 바로 알아낼 것입니다 ...
 

gyfto, 테스트 스크립트의 예제는 튜닝한 차트를 업데이트하기 위해 만들어졌습니다. 원격(외부) 일정으로 설정할 수 있습니다.

스크립트에 대한 차트를 업데이트하는 것은 무의미한 것이 분명합니다.

전문가와 함께 차트에 설정하십시오. 전문가가 작동합니다.

 #include <ServicesMT4.mqh>

int hWnd = 0 ;

void init()
 {
  hWnd = WindowHandle ( Symbol (), Period ());
  ServiceRefreshChart(hWnd, 500 );
 }
void deinit()
 {
  ServiceStopRefreshChart(hWnd);
 }
void start()
 {
   Comment ( TimeToStr ( TimeLocal (), TIME_DATE | TIME_SECONDS ));
 }
 

젠장, 난 바보야 나는 나의 실수를 깨달았다. 예어

 void start()
 {
   Comment ( TimeToStr ( TimeLocal (), TIME_DATE | TIME_SECONDS ));
 }

그리고 나는 가지고 있었다

 int init(){
   read_now = TimeCurrent () + delay;
}

등등, 시작시 상수였습니다(2013.12.31 18:59:59). 이것이 부주의가 실패하는 방법입니다 ... 문제에 대해 사과드립니다. 이제 모든 것이 명확합니다.

실제로 작동하는 코드는 다음과 같습니다.

 int delay = 180 ;
datetime read_now;
int init(){
   read_now = TimeLocal () + delay;
   start();
}
int start(){
   while (! IsStopped ()){
       int how_many_remains = read_now - TimeLocal ();
       Comment ( StringConcatenate (
         StringSubstr ( "-" , (how_many_remains% 60 >= 0 ), 0 ),
         StringSubstr ( "0" , ( MathAbs (how_many_remains/ 60 ) > 9 ), 0 ),
         MathAbs (how_many_remains/ 60 ),
         ":" ,
         StringSubstr ( "0" , ( MathAbs (how_many_remains% 60 ) > 9 ), 0 ),
         MathAbs (how_many_remains% 60 )
      ));
       Sleep ( 1000 );
   }
   return ( 0 );
}

물론 주말에만 가능합니다. 다시 한번 불편을 드려 죄송합니다.

 

너무 음란합니다. 다음과 같아야 합니다.

 #include <ServicesMT4.mqh>

int delay = 180 ;
datetime read_now;
int hWnd = 0 ;

void init()
 {
  read_now = TimeLocal () + delay;
  hWnd = WindowHandle ( Symbol (), Period ());
  ServiceRefreshChart(hWnd, 100 );
 }
void start()
 {
  ServiceStopRefreshChart(hWnd);
   while (! IsStopped ())
   {
     int how_many_remains = read_now - TimeLocal ();
     Comment ( StringConcatenate ( StringSubstr ( "-" , (how_many_remains% 60 >= 0 ), 0 ),
                               StringSubstr ( "0" , ( MathAbs (how_many_remains/ 60 ) > 9 ), 0 ),
                               MathAbs (how_many_remains/ 60 ), ":" ,
                               StringSubstr ( "0" , ( MathAbs (how_many_remains% 60 ) > 9 ), 0 ),
                               MathAbs (how_many_remains% 60 )));
     Sleep ( 1000 );
   }
 }