Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 388

 
gyfto :

Bir uzman için bir onay işareti ayarlamaya çalışıyorum ama işe yaramıyor. Hafta sonu beni şaşırttı. Nasıl doğru organize edilir? Örneğin, aşağıdaki temel Uzman Danışmanımız var:

- keneler nasıl simüle edilir ve bir zamanlayıcı nasıl başlatılır?

Bunun bir hafta sonu olduğunu anlıyorum, ancak piyasadaki tatil programı Rusya Federasyonu'ndakilerle örtüşmüyor ve yine de çalışmanız gerekiyor ...

Kütüphane.

 //=================================================================================================================================================
 // 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 :

Kütüphane.


Forumla iletişim kurmadan önce kullanmaya çalıştığım ServiceTickExpert() idi. Şimdi bir test EA başlatmaya çalıştım

 #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 );
}

- ama sessizlik.

 
Link_x :
Ana şey - gösterilecekleri. :)

Bunu yapıyoruz ve fahiş değerler buharlaşıyor ama sorun devam ediyor.

Bence sorun şu satırda:

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

Tüm değerler aynı zamanla çarpılır - sunucunun geçerli saati veya daha doğrusu bilinen son saat.

Ve ayrıca bool türündeki değişkenlerin bildiriminde, çift olması gereken yerde, peki, birkaç başka küçük söve. Anladığım kadarıyla astar henüz bitmedi)))

 #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 :

Bence sorun şu satırda:

Tüm değerler aynı zamanla çarpılır - sunucunun geçerli saati veya daha doğrusu bilinen son saat.

Ve ayrıca bool türündeki değişkenlerin bildiriminde, çift olması gereken yerde, peki, birkaç başka küçük söve. Anladığım kadarıyla astar henüz bitmedi)))


Teşekkür ederim!
Hataları ve hataları anlıyorum.
Bunu nasıl elde edeceğimi gerçekten bilmiyorum? :)

Göstergenin hayal bile etmediğim resimler çizdiğini fark ettim.
Kodun "gövdesi" üzerinde biraz çalıştı.
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;
Daha çok hayal ettiğim gibi.
Ancak "geçici dalgalar", "fiyat dalgalarını" tamamen söndürür. "Fiyat dalgalarını" güçlendiriyoruz ve "geçici dalgaları" zayıflatıyoruz.
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 :


Forumla iletişim kurmadan önce kullanmaya çalıştığım ServiceTickExpert() idi. Şimdi bir test EA başlatmaya çalıştım

- ama sessizlik.

Bu çalışma kodu değil. Belki yine de senaryoya örneklerle bir göz atın?

Grafiği güncellemenin 3 yolu vardır.

1. Expert Advisor'ın başlangıcında kendiniz sonsuz bir döngü düzenleyin. Expert Advisor'ın bir init veya uzak programdan tek bir başlatması gerekir.
2. Güncellemeyi başka bir iş parçacığından çalıştırın. Ardından, kodu ne olursa olsun herhangi bir Uzman Danışman yürütülür.

3. 2. noktaya benzer şekilde, her şey aynıdır, ancak sistem zamanlayıcısını kullanır.

Kütüphanede, ilk 2 uygulanmaktadır. Kodda sahip olduğunuz şey, grafik güncelleme döngüsünün veya Expert Advisor'ın döngüsünün bağımsız bir şekilde düzenlenmesini gerektirir. İlk durumda, döngülü bir komut dosyası gereklidir. İkinci durumda, Expert Advisor'ı bir kez başlatmanız gerekir.

Bu bölümdeki (4.7) ilk 7 fonksiyon, güncellemeyi düzenler ve bağımsız grafik güncellemesini ayrı bir iş parçacığında yönetir. Programı bir kez çalıştırabilir ve kaldırabilirsiniz. Grafikler, MQL programları olmadan güncellenmeye devam edecektir.

 #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 :

Teşekkür ederim!
Hataları ve hataları anlıyorum.
Bunu nasıl elde edeceğimi gerçekten bilmiyorum? :)

Göstergenin hayal bile etmediğim resimler çizdiğini fark ettim.
Kodun "gövdesi" üzerinde biraz çalıştı.
Daha çok hayal ettiğim gibi.
Ancak "geçici dalgalar", "fiyat dalgalarını" tamamen söndürür. "Fiyat dalgalarını" güçlendiriyoruz ve "geçici dalgaları" zayıflatıyoruz.


Neyin bu kadar korkunç olduğunu öğrenebilirsin

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 :
Belki yine de, senaryoya örneklerle bir göz atın? Bu çalışma kodu değil.


Ama... ama sizin betiğinizi kullanarak iyi bilinen iTicks betiğini değiştirdim! Burada, şimdi yeniden başlattım, önce bir test Uzman Danışmanı (kodu bu sayfada değil, önceki sayfada), ardından aşağıdaki değişiklikle 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 kod örneğini izleyerek

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

Grafikte değişiklik yok

"DLL çağrısına izin ver" onay kutusu...

Katma

Zhunko :

Grafiği güncellemenin 3 yolu vardır.

Mesajın eski halini cevapladım, kusura bakmayın hemen halledeceğim...
 

gyfto, test komut dosyasındaki örnek, ayarladığınız grafiği güncellemek için yapılmıştır. Uzak (yabancı) bir programa ayarlanabilir.

Senaryonun grafiğini güncellemenin anlamsız olduğu çok açık.

Uzmanınızla bir çizelge üzerinde ayarlayın. Uzman çalışacak.

 #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 ));
 }
 

Lanet olsun, ben aptalım. Hatamı anladım. anahtar kelime

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

ve sahiptim

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

ve benzeri, başlangıçta sabit olan (2013.12.31 18:59:59). Dikkatsizlik bu şekilde başarısız olur ... Sorun için özür dilerim, şimdi her şey açık.

Bu aslında çalışan koddur:

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

Tabii ki, sadece hafta sonu için. Bir kez daha, rahatsızlıktan dolayı özür dilerim.

 

Çok uygunsuz. Bunun gibi olmalı:

 #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 );
   }
 }