Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 388

 
gyfto:

Ich versuche, einen Tick für einen Experten zu organisieren - ohne Erfolg. Das Wochenende kam für mich überraschend. Wie organisiert man das richtig? Wir haben zum Beispiel den folgenden elementaren Expert Advisor:

- Wie kann man Ticks simulieren und einen Timer starten?

Ich verstehe, dass es Wochenende ist, aber auf dem Markt stimmen die Feiertage nicht mit denen in RF überein, und ich muss arbeiten...

Bibliothek.

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

Bibliothek.


Ich habe versucht, ServiceTickExpert() zu verwenden, bevor ich das Forum kontaktierte. Versuchen Sie jetzt, den Testexperten auszuführen

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

- Aber Schweigen.

 
Link_x:
Die Hauptsache ist, dass sie angezeigt werden müssen. :)

Damit verschwinden die verbotenen Werte, aber das Problem bleibt bestehen.

Ich glaube, das Problem liegt in dieser Zeile:

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

Alle Werte werden mit der gleichen Zeit multipliziert - der aktuellen Serverzeit, um genau zu sein - der letzten bekannten Zeit.

Und auch in der Deklaration von Variablen vom Typ bool, wo sie double sein sollten, und ein paar andere kleine Fehler. Die Grundierung ist noch nicht ganz durchgebohrt, wie ich es verstehe ))))

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

Ich glaube, das Problem liegt in dieser Zeile:

Alle Werte werden mit der gleichen Zeit multipliziert - der aktuellen Serverzeit, genauer gesagt, der letzten bekannten Zeit.

Und auch in der Deklaration von Variablen vom Typ bool, wo sie double sein sollten, und ein paar andere kleine Fehler. Die Grundierung ist noch nicht ganz durchgebohrt, wie ich es verstehe ))))


Oh, danke!
Ich kann die Fehler und Pannen sehen.
Ich kann mir nicht einmal vorstellen, wie ich das hätte tippen können. :)

Mir ist aufgefallen, dass der Indikator Bilder zeichnet, die ich mir nicht einmal vorstellen kann.
Ich habe ein wenig an dem "Körper" des Codes gearbeitet.
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;
Es ist eher so, wie ich es mir vorgestellt habe.
Aber die "Zeitwellen" dämpfen die "Preiswellen" vollständig. Verstärkung der "Preiswellen" und Abschwächung der "Zeitwellen".
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:


Ich habe versucht, ServiceTickExpert() zu verwenden, bevor ich das Forum kontaktierte. Versuchen Sie jetzt, den Testexperten auszuführen

- aber es ist still.

Es ist kein funktionierender Code. Vielleicht können Sie sich das Beispielskript ansehen?

Es gibt 3 Möglichkeiten, das Diagramm zu aktualisieren.

1. Ordnen Sie eine Endlosschleife beim Start des Expert Advisors an. Einmaliger Start des Expert Advisors aus dem Start- oder Remote-Programm ist notwendig.
2. Starten Sie die Aktualisierung in einem anderen Thread. Dann wird jeder Expert Advisor unabhängig von seinem Code ausgeführt.

3. Ähnlich wie bei Punkt 2, nur mit Hilfe des Systemtimers.

Die ersten beiden sind in der Bibliothek implementiert. Was Sie in Ihrem Code haben, erfordert eine unabhängige Anordnung des Zyklus der Chart-Aktualisierung oder der Schleifenbildung des Expert Advisors. Im ersten Fall ist ein Skript mit Schleifen erforderlich. Im zweiten Fall muss der Expert Advisor einmal gestartet werden.

Die ersten 7 Funktionen aus diesem Abschnitt (4.7) organisieren die Auffrischung und verwalten die unabhängige Auffrischung der Tabelle in einem separaten Thread. Es ist möglich, das Programm einmal zu starten und wieder zu entladen. Die Diagramme werden auch ohne MMS-Programme aktualisiert.

#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, danke!
Ich kann die Fehler und Pannen sehen.
Ich kann mir nicht vorstellen, wie ich das jemals schreiben könnte? :)

Mir ist aufgefallen, dass der Indikator Bilder zeichnet, die ich mir nicht einmal vorstellen kann.
Ich habe ein wenig an dem "Körper" des Codes gearbeitet.
Es ist eher so, wie ich es mir vorgestellt habe.
Aber die "Zeitwellen" dämpfen die "Preiswellen" vollständig. Verstärken Sie die "Preiswellen" und schwächen Sie die "Zeitwellen".


Darf ich fragen, was das Beängstigende daran ist?

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:
Können Sie sich das Beispielskript trotzdem ansehen? Dies ist kein funktionierender Code.


Aber... aber durch Ihr Skript habe ich zum ersten Mal das berühmte iTicks-Skript geändert! Hier, jetzt habe ich es wieder, zuerst den Test EA (sein Code ist auf der vorherigen Seite, nicht auf dieser), dann iTicks nächste Änderung:

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

durch Beispielcode aus Check_ServicesMT4.dll.mq4

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

Es gibt keine Änderungen in der Tabelle

Das Kontrollkästchen "dll-Aufruf zulassen" ist aktiviert...

Hinzugefügt von

Zhunko:

Es gibt 3 Möglichkeiten, ein Diagramm zu aktualisieren.

Ich habe auf eine alte Version des Beitrags geantwortet, ich bitte um Entschuldigung, ich werde mich jetzt darum kümmern...
 

gyfto, das Beispiel im Testskript dient zur Aktualisierung des von Ihnen erstellten Diagramms. Es ist möglich, eine entfernte (fremde) Karte einzurichten.

Es ist offensichtlich, dass es keinen Sinn macht, das Diagramm für das Skript zu aktualisieren.

Konfigurieren Sie ihn auf dem Chart mit Ihrem Expert Advisor. Der Experte wird arbeiten.

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

Mann, ich bin ein Narr. Ich habe meinen Fehler erkannt. Schlüsselwort.

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

Das habe ich.

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

Und so weiter, was beim Start eine Konstante war (2013.12.31 18:59:59). So scheitert die Unaufmerksamkeit.... Entschuldigen Sie die Unannehmlichkeiten, aber jetzt ergibt alles einen Sinn.

Dieser Code funktioniert:

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

Natürlich nur für das Wochenende. Ich möchte mich noch einmal für die Unannehmlichkeiten entschuldigen.

 

Das ist nicht angemessen. Das ist der richtige Weg:

#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);
   }
 }
Grund der Beschwerde: