Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 388

 
gyfto:

Cercando di organizzare un tic per un esperto - senza fortuna. Il fine settimana mi ha colto di sorpresa. Come organizzarlo correttamente? Per esempio, abbiamo il seguente Expert Advisor elementare:

- come simulare i tick e avviare un timer?

Capisco che è il fine settimana, ma nel mercato il calendario delle vacanze non coincide con quello di RF, e devo lavorare...

Biblioteca.

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

Biblioteca.


Era ServiceTickExpert() che ho cercato di usare prima di contattare il forum. Provato ad eseguire il test expert ora

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

- Ma il silenzio.

 
Link_x:
La cosa principale è che devono essere visualizzati. :)

Facendo così e i valori proibiti evaporano, ma il problema rimane.

Credo che il problema sia in questa linea:

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

Tutti i valori sono moltiplicati per lo stesso tempo - il tempo corrente del server, per essere esatti - l'ultimo tempo conosciuto.

E anche nella dichiarazione di variabili di tipo bool dove dovrebbero essere double, e un paio di altri piccoli bug. Il primer non è ancora completamente annoiato, come ho capito ))))

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

Credo che il problema sia in questa linea:

Tutti i valori sono moltiplicati per lo stesso tempo - il tempo corrente del server, o più precisamente, l'ultimo tempo conosciuto.

E anche nella dichiarazione di variabili di tipo bool dove dovrebbero essere double, e un paio di altri piccoli bug. Il primer non è ancora completamente annoiato, come ho capito ))))


Oh, grazie!
Posso vedere gli errori e i difetti.
Non riesco a immaginare come potrei mai digitarlo? :)

Ho notato che l'indicatore disegna immagini che non immaginavo nemmeno.
Ho lavorato un po' sul "corpo" del codice.
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;
È più simile a quello che immaginavo.
Ma le "onde del tempo" smorzano completamente le "onde del prezzo". Rafforzando le "onde di prezzo" e indebolendo le "onde di tempo".
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:


Era ServiceTickExpert() che ho cercato di usare prima di contattare il forum. Provato ad eseguire il test expert ora

- ma è silenzioso.

Non è un codice funzionante. Forse puoi dare un'occhiata allo script di esempio?

Ci sono 3 modi per aggiornare il grafico.

1. Disponi un ciclo infinito all'inizio dell'Expert Advisor. È necessario un singolo avvio dell'Expert Advisor dal programma iniziale o remoto.
2. Iniziare l'aggiornamento da un altro thread. Allora ogni Expert Advisor sarà eseguito indipendentemente dal suo codice.

3. Simile al punto 2, lo stesso, ma con l'aiuto del timer di sistema.

I primi 2 sono implementati nella libreria. Quello che hai nel tuo codice richiede di organizzare in modo indipendente il ciclo di aggiornamento del grafico o il looping dell'Expert Advisor. Nel primo caso, è necessario uno script in loop. Nel secondo caso, l'Expert Advisor deve essere avviato una volta.

Le prime 7 funzioni di quella sezione (4.7) organizzano l'aggiornamento e gestiscono l'aggiornamento indipendente del grafico in un thread separato. È possibile avviare e scaricare il programma una volta sola. I grafici continueranno ad aggiornarsi senza programmi 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:

Oh, grazie!
Posso vedere gli errori e i difetti.
Non riesco a immaginare come potrei mai digitarlo? :)

Ho notato che l'indicatore disegna immagini che non immaginavo nemmeno.
Ho lavorato un po' sul "corpo" del codice.
È più simile a quello che immaginavo.
Ma le "onde del tempo" smorzano completamente le "onde del prezzo". Rafforzando le "onde di prezzo" e indebolendo le "onde di tempo".


Posso chiedere qual è la cosa che fa paura?

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:
Puoi dare un'occhiata allo script di esempio? Questo non è un codice funzionante.


Ma... ma è stato grazie al tuo script che ho modificato per la prima volta il famoso script iTicks! Ecco, ora l'ho eseguito di nuovo, prima l'EA di prova (il suo codice è nella pagina precedente, non in questa), poi iTicks la prossima modifica:

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

dal codice di esempio di Check_ServicesMT4.dll.mq4

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

Nessun cambiamento nel grafico

La casella di controllo "allow dll call" è selezionata...

Aggiunto da

Zhunko:

Ci sono 3 modi per aggiornare un grafico.

Stavo rispondendo a una vecchia versione del post, scusate, ora controllerò...
 

gyfto, l'esempio nello script di test è fatto per aggiornare il grafico che hai impostato. È possibile impostare un grafico remoto (di qualcun altro).

È ovvio che non ha senso aggiornare il grafico per lo script.

Configuralo sul grafico con il tuo Expert Advisor. L'esperto lavorerà.

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

Amico, sono un pazzo. Mi sono reso conto del mio errore. Parola chiave.

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

L'ho fatto.

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

E così via, che era una costante all'avvio (2013.12.31 18:59:59). Ecco come la disattenzione fallisce.... Mi dispiace per l'inconveniente, ora tutto ha un senso.

Questo codice funziona:

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

Naturalmente, è solo per il fine settimana. Ancora una volta mi scuso per l'inconveniente.

 

Non è appropriato. Questo è il modo per farlo:

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