Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 388

 
gyfto:

J'essaie d'organiser un tic pour un expert - pas de chance. Le week-end m'a pris par surprise. Comment l'organiser correctement ? Par exemple, nous avons le conseiller expert élémentaire suivant :

- comment simuler des ticks et démarrer une minuterie ?

Je comprends que c'est le week-end, mais sur le marché, le calendrier des vacances ne coïncide pas avec celui de la RF, et je dois travailler...

Bibliothèque.

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

Bibliothèque.


C'est ServiceTickExpert() que j'ai essayé d'utiliser avant de contacter le forum. J'ai essayé d'exécuter le test expert maintenant

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

- Mais le silence.

 
Link_x:
L'essentiel est qu'ils soient affichés. :)

En agissant ainsi, les valeurs interdites s'évaporent, mais le problème demeure.

Je pense que le problème est dans cette ligne :

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

Toutes les valeurs sont multipliées par la même heure - l'heure actuelle du serveur, pour être exact - dernière heure connue.

Et aussi dans la déclaration des variables de type bool où elles devraient être doubles, et quelques autres petits bogues. L'amorce n'est pas encore complètement percée, d'après ce que j'ai compris )))).

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

Je pense que le problème est dans cette ligne :

Toutes les valeurs sont multipliées par le même temps - le temps actuel du serveur, ou plus précisément, le dernier temps connu.

Et aussi dans la déclaration des variables de type bool où elles devraient être doubles, et quelques autres petits bogues. L'amorce n'est pas encore complètement percée, d'après ce que j'ai compris )))).


Oh, merci !
Je peux voir les erreurs et les pépins.
Je n'arrive pas à imaginer comment je pourrais taper ça ? :)

J'ai remarqué que l'indicateur dessine des images que je n'avais même pas imaginées.
J'ai travaillé un peu sur le "corps" du code.
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;
C'est plus comme ce que j'imaginais.
Mais les "vagues de temps" atténuent complètement les "vagues de prix". Renforcer les "vagues de prix" et affaiblir les "vagues de temps".
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:


C'est ServiceTickExpert() que j'ai essayé d'utiliser avant de contacter le forum. J'ai essayé d'exécuter le test expert maintenant

- mais il est silencieux.

Ce n'est pas un code qui fonctionne. Peut-être pouvez-vous encore regarder le script d'exemple ?

Il y a 3 façons de mettre à jour le graphique.

1. Arrangez la boucle infinie dans le début de l'Expert Advisor. Un seul démarrage de l'Expert Advisor à partir du programme initial ou à distance est nécessaire.
2. Commencez à mettre à jour à partir d'un autre fil. Ensuite, chaque conseiller expert sera exécuté, quel que soit son code.

3. Comme au point 2, la même chose, mais avec l'aide de la minuterie du système.

Les deux premiers sont mis en œuvre dans la bibliothèque. Ce que vous avez dans votre code nécessite une organisation indépendante du cycle de rafraîchissement du graphique ou de la boucle du conseiller expert. Dans le premier cas, un script en boucle est nécessaire. Dans le second cas, le conseiller expert doit être démarré une fois.

Les 7 premières fonctions de cette section (4.7) organisent le rafraîchissement et gèrent le rafraîchissement des graphiques indépendants dans un thread séparé. Il est possible de démarrer et de décharger le programme une fois. Les graphiques continueront à se mettre à jour sans les programmes 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, merci !
Je peux voir les erreurs et les pépins.
Je ne peux même pas imaginer comment j'ai pu taper ça. :)

J'ai remarqué que l'indicateur dessine des images que je n'avais même pas imaginées.
J'ai travaillé un peu sur le "corps" du code.
C'est plus comme ce que j'imaginais.
Mais les "vagues de temps" atténuent complètement les "vagues de prix". Renforcer les "vagues de prix" et affaiblir les "vagues de temps".


Puis-je demander quelle est la chose effrayante ?

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:
Pouvez-vous examiner le script d'exemple ? Ce n'est pas un code de travail.


Mais... mais c'est par votre script que j'ai modifié pour la première fois le fameux script iTicks ! Voilà, maintenant je l'ai relancé, d'abord l'EA de test (son code est sur la page précédente, pas sur celle-ci), puis la modification suivante de 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);
}

par l'exemple de code de Check_ServicesMT4.dll.mq4

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

Il n'y a pas de changement sur le tableau

La case "autoriser l'appel dll" est cochée...

Ajouté par

Zhunko:

Il existe trois façons de mettre à jour un graphique.

Je répondais à une ancienne version du post, désolé, je vais regarder maintenant...
 

gyfto, l'exemple dans le script de test est fait pour mettre à jour le graphique que vous avez mis en place. Il est possible de configurer une carte à distance (celle de quelqu'un d'autre).

Il est évident que cela n'a aucun sens de mettre à jour le graphique pour le script.

Configurez-le sur le graphique avec votre conseiller expert. L'expert travaillera.

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

Mec, je suis un idiot. J'ai réalisé mon erreur. Mot clé.

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

Je l'ai fait.

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

Et ainsi de suite, ce qui était une constante au démarrage (2013.12.31 18:59:59). C'est ainsi que l'inattention fait défaut..... Désolé pour le dérangement, tout s'explique maintenant.

Ce code fonctionne :

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

Naturellement, c'est seulement pour le week-end. Encore une fois, je m'excuse pour ce désagrément.

 

Ce n'est pas approprié. C'est comme ça qu'il faut faire :

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