Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 388

 
gyfto:

Tentando organizar um tique para um especialista - sem sorte. O fim de semana me pegou de surpresa. Como organizá-lo adequadamente? Por exemplo, temos o seguinte Expert Advisor elementar:

- como simular carrapatos e iniciar um temporizador?

Entendo que é fim de semana, mas no mercado o horário de feriados não coincide com o de RF e eu ainda tenho que trabalhar...

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.


Foi ServiceTickExpert() que eu tentei usar antes de entrar em contato com o fórum. Tentei executar agora o teste especialista

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

- Mas silêncio.

 
Link_x:
O principal é que eles devem ser exibidos. :)

Fazendo isso e os valores proibidos evaporam, mas o problema permanece.

Acho que o problema está nesta linha:

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

Todos os valores são multiplicados pelo mesmo tempo - tempo atual do servidor, para ser exato - último tempo conhecido.

E também na declaração de variáveis do tipo bool onde devem ser o dobro, e um par de outros pequenos bugs. A cartilha ainda não está completamente entediada, como eu a entendo ))))

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

Acho que o problema está nesta linha:

Todos os valores são multiplicados pelo mesmo tempo - o tempo atual do servidor, ou, mais precisamente, o último tempo conhecido.

E também na declaração de variáveis do tipo bool onde devem ser o dobro, e um par de outros pequenos bugs. A cartilha ainda não está completamente entediada, como eu a entendo ))))


Oh, obrigado!
Eu posso ver os erros e as falhas.
Eu não consigo imaginar como eu poderia digitar isso? :)

Notei que o indicador desenha imagens que eu nem sequer imaginava.
Trabalhou um pouco sobre o "corpo" do código.
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;
É mais como o que eu imaginava.
Mas as "ondas do tempo" amortecem completamente as "ondas de preços". Reforçando as "ondas de preços" e enfraquecendo as "ondas do 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:


Foi ServiceTickExpert() que eu tentei usar antes de entrar em contato com o fórum. Tentei executar agora o teste especialista

- mas é silenciosa.

Não é um código de trabalho. Talvez você ainda possa olhar para o roteiro de exemplo?

Há 3 maneiras de atualizar o gráfico.

1. Organizar o loop infinito na partida do Expert Advisor. É necessário o início único do Expert Advisor a partir do programa inicial ou remoto.
2. Comece a atualização a partir de outra linha. Então, todo consultor especializado será executado independentemente de seu código.

3. Similar ao ponto 2, o mesmo, mas com a ajuda do temporizador do sistema.

Os dois primeiros são implementados na biblioteca. O que você tem em seu código requer a organização independente do ciclo de atualização do gráfico ou looping do Expert Advisor. No primeiro caso, é necessário um roteiro em loop. No segundo caso, o Expert Advisor precisa ser iniciado uma vez.

As primeiras 7 funções dessa seção (4.7) organizam a atualização e gerenciam a atualização independente do gráfico em uma linha separada. É possível iniciar e descarregar o programa uma vez. Os gráficos continuarão a ser atualizados sem os programas 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, obrigado!
Eu posso ver os erros e as falhas.
Eu não consigo imaginar como eu poderia digitar isso? :)

Notei que o indicador desenha imagens que eu nem sequer imaginava.
Eu trabalhei um pouco no "corpo" do código.
É mais como o que eu imaginava.
Mas as "ondas do tempo" amortecem completamente as "ondas de preços". Fortalecer as "ondas de preços" e enfraquecer as "ondas do tempo".


Posso perguntar qual é a coisa mais assustadora?

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:
Mas você pode olhar o roteiro do exemplo? Este não é um código de trabalho.


Mas... mas foi por seu roteiro que eu modifiquei pela primeira vez o famoso roteiro do iTicks! Aqui, agora eu o executei novamente, primeiro o teste EA (seu código está na página anterior, não nesta), depois o iTicks na próxima modificação:

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

por código de amostra de Check_ServicesMT4.dll.mq4

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

Não há mudanças na tabela

A caixa de seleção "permitir chamada dll" está marcada...

Adicionado por

Zhunko:

Há 3 maneiras de atualizar um gráfico.

Eu estava respondendo a uma versão antiga do post, desculpe, vou dar uma olhada agora...
 

gyfto, o exemplo no roteiro de teste é feito para atualizar o gráfico que você montou. É possível configurar para uma tabela remota (de outra pessoa).

É óbvio que não faz sentido atualizar o gráfico para o roteiro.

Configure-o na tabela com seu Consultor Especialista. O especialista vai trabalhar.

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

Cara, eu sou um tolo. Percebi meu erro. Palavra-chave.

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

Eu fiz.

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

E assim por diante, o que na partida foi uma constante (2013.12.31 18:59:59). É assim que a falta de atenção falha.... Desculpe pelo inconveniente, tudo faz sentido agora.

Este código funciona:

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, é apenas para o fim de semana. Mais uma vez, peço desculpas pelo incômodo.

 

Isso não é apropriado. Essa é a maneira de fazer isso:

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