Bem, você pode desenhar todas as linhas no OnInit() e depois desenhar novas sempre que a opção da última barra mudar, você saberá que havia uma nova barra.
Mas não tenho certeza do que exatamente você está querendo fazer.
Max Enrik: Eu realmente preciso perguntar, a função start() está atrasando o gráfico (/ MT4 Platforms)?
Enquanto todos os indicadores estão sendo atualizados, o terminal não faz mais nada. É por isso que os indicadores não podem dormir, não podem negociar, ou fazer pedidos pela web.
Enquanto todos os indicadores estão sendo atualizados, o terminal não faz mais nada. É por isso que os indicadores não podem dormir, não podem negociar, ou fazer pedidos pela web.
Obrigado por seu comentário. (após seu comentário, decidi que vou mudar algo em meus indicadores - porque quase fiz todos os meus indicadores no início() funcionar.)
Eu coloquei abaixo o código na função start( ), então você pode me ajudar de que forma é bom para o meu indicador?
Na verdade, não tenho idéia de como posso editar o código abaixo para parar de atualizar continuamente(sem todos os códigos iniciais() colocados na função init()).
//---MN1 int _cnt_MN1 = 11; // 12 lines for a year 24 for two years and etc. for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ ) { if ( _Period < PERIOD_MN1 ) { //---time convert datetime _tltpMN1 = TimeToString( iTime( Symbol(), PERIOD_MN1, i_MN ), TIME_DATE ); datetime _time = iTime( Symbol(), PERIOD_MN1, i_MN );// + PeriodSeconds( PERIOD_MN1 ); //---name string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
Max Enrik: Na verdade, não tenho nenhuma idéia de como posso editar o código abaixo para parar de atualizar continuamente
Adaptar o novo código de barras para o novo mês.
As barras não são confiáveis (uma atualização/religação pode mudar o número de barras no gráfico)o volume não é confiável (falta de tiques) Use sempre o tempo. Vela nova - Fórum MQL4 Eu discordo de fazer uma nova função de barra, porque ela só pode se tornar uma vez por carrapato. Uma variável pode ser testada várias vezes.
Não usar números de turno em nomes de objetos. Uma vez iniciada uma nova barra, todos os seus objetos são mal denominados e você não pode criar um novo "<prefixo>0". Você tinha isso no seu post original (usando o tempo)
Por favor, coloque-o em um especialista em vez de um indicador que permite uma utilização mais fácil no futuro quando você quiser adicionar sua estratégia comercial.
Para a questão das barras, armazene o tempo de abertura da barra em uma variável de data e simplesmente compare o tempo registrado com o tempo real, então sempre que uma nova barra surgir, ela será acionada.
//+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ voidOnTimer() { if(M1!=iTime(Symbol(),PERIOD_M1,0)) { M1=iTime(Symbol(),PERIOD_M1,0); // overwrite old value with new value //Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M1",0,M1,0); }
if(M5!=iTime(Symbol(),PERIOD_M5,0)) { M5=iTime(Symbol(),PERIOD_M5,0); //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M5",0,M5,0); }
if(M15!=iTime(Symbol(),PERIOD_M15,0)) { M15=iTime(Symbol(),PERIOD_M15,0); //Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M15",0,M15,0); }
if(M30!=iTime(Symbol(),PERIOD_M30,0)) { M30=iTime(Symbol(),PERIOD_M30,0); //Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M30",0,M30,0); }
if(H1!=iTime(Symbol(),PERIOD_H1,0)) { H1=iTime(Symbol(),PERIOD_H1,0); //Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-H1",0,H1,0); }
if(H4!=iTime(Symbol(),PERIOD_H4,0)) { H4=iTime(Symbol(),PERIOD_H4,0); //Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-H4",0,H4,0); }
if(D1!=iTime(Symbol(),PERIOD_D1,0)) { D1=iTime(Symbol(),PERIOD_D1,0); //Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-D1",0,D1,0); }
if(W1!=iTime(Symbol(),PERIOD_W1,0)) { W1=iTime(Symbol(),PERIOD_W1,0); //Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-W1",0,W1,0); }
if(MN1!=iTime(Symbol(),PERIOD_MN1,0)) { MN1=iTime(Symbol(),PERIOD_MN1,0); //Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-MN1",0,MN1,0); } } //+------------------------------------------------------------------+
Não utilizar números de turno em nomes de objetos. Uma vez iniciada uma nova barra, todos os seus objetos são mal denominados e você não pode criar um novo "<prefixo>0". Você tinha isso no seu post original (usando o tempo)
Eu já uso um consultor especializado (Painel de Comércio) em meu gráfico (preciso usar todos os meus indicadores e consultor especializado em uma janela do gráfico).
Se você quis dizer que eu poderia usar seu código em 'Expert Advisor', na verdade não o farei porque vou melhorar meu 'Trade Panel', também quero escrever o código separadamente. (É possível que no futuro eu combine esse conjunto deindicadores(que é importante para mim) - mas não por enquanto).
De qualquer forma, Sr. William, seu comentário realmente me deu uma idéia e também me ensinou algo.
(p.s. se eu estiver pensando errado por favor me avise)
Max Enrik: (porque eu nunca usei a função 'Void OnTick()')
Pré-construção 600 (3 de fevereiro de2014), houve apenas o início(). Agora há OnTick (EAs,) OnCalculate (indicadores,) e OnStart (scripts.) Esqueci que você estava falando de um indicador.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
#Ordem Objetiva
Eu criei 3 Objetos e que os objetos se cruzam.
#1 Linha Horizontal, #2 Linha Vertical, #3 Linha de tendência
Preciso defini-las z posições.
Então, como posso dar-lhes valor z posições?
Obrigado.
Bem, você pode desenhar todas as linhas no OnInit() e depois desenhar novas sempre que a opção da última barra mudar, você saberá que havia uma nova barra.
Mas não tenho certeza do que exatamente você está querendo fazer.
OK! Vou tentar algo. Então eu voltarei para aqui.
Obrigado.
@Marco vd Heijden
Antes de começar a pesquisar sobre isso. Eu realmente preciso perguntar, a função start() é a função slow down chart (/ MT4 Platforms)?
p.s Coloco todos os códigos na função especial start( ), esse código funciona para as linhas de período- H1, H4, D1, W1, MN1.
Tenha um bom fim de semana e obrigado antecipadamente.
Obrigado por seu comentário. (após seu comentário, decidi que vou mudar algo em meus indicadores - porque quase fiz todos os meus indicadores no início() funcionar.)
Eu coloquei abaixo o código na função start( ), então você pode me ajudar de que forma é bom para o meu indicador?
Na verdade, não tenho idéia de como posso editar o código abaixo para parar de atualizar continuamente (sem todos os códigos iniciais() colocados na função init()).
int _cnt_MN1 = 11; // 12 lines for a year 24 for two years and etc.
for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ )
{
if ( _Period < PERIOD_MN1 )
{
//---time convert
datetime _tltpMN1 = TimeToString( iTime( Symbol(), PERIOD_MN1, i_MN ), TIME_DATE );
datetime _time = iTime( Symbol(), PERIOD_MN1, i_MN );// + PeriodSeconds( PERIOD_MN1 );
//---name
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
ObjectCreate ( 0, _vlineName_MN, OBJ_VLINE , 0, _time, 0 );
ObjectSetString ( 0, _vlineName_MN, OBJPROP_TOOLTIP , _tltpMN1 );
ObjectSetInteger ( 0, _vlineName_MN, OBJPROP_COLOR , C'180,160,080' );
ObjectSet ( _vlineName_MN, OBJPROP_BACK , true );
ObjectSet ( _vlineName_MN, OBJPROP_HIDDEN , true );
ObjectSet ( _vlineName_MN, OBJPROP_SELECTABLE , false );
ObjectSet ( _vlineName_MN, OBJPROP_STYLE , STYLE_SOLID );
} //---if Close
} //---for Close
Obrigado!
Eu realmente preciso de ajuda, por favor, alguém responda minha pergunta.
Obrigado.
Eu discordo de fazer uma nova função de barra, porque ela só pode se tornar uma vez por carrapato. Uma variável pode ser testada várias vezes.
static datetime BOMcur=0; dateTime BOMpre = BOMcur;
BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool isNewMonth = BOMcur != BOMpre;
if(isNewMonth){
DO_UPDATE(); ...
}
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
Por favor, coloque-o em um especialista em vez de um indicador que permite uma utilização mais fácil no futuro quando você quiser adicionar sua estratégia comercial.
Para a questão das barras, armazene o tempo de abertura da barra em uma variável de data e simplesmente compare o tempo registrado com o tempo real, então sempre que uma nova barra surgir, ela será acionada.
Aqui está um exemplo:
int OnInit()
{
//--- create timer
EventSetMillisecondTimer(250);
//--- create some things
CreateLines(); // Function that creates time lines
//--- load open times
M1=iTime(Symbol(),PERIOD_M1,0);
M5=iTime(Symbol(),PERIOD_M5,0);
M15=iTime(Symbol(),PERIOD_M15,0);
M30=iTime(Symbol(),PERIOD_M30,0);
H1=iTime(Symbol(),PERIOD_H1,0);
H4=iTime(Symbol(),PERIOD_H4,0);
D1=iTime(Symbol(),PERIOD_D1,0);
W1=iTime(Symbol(),PERIOD_W1,0);
MN1=iTime(Symbol(),PERIOD_MN1,0);
//--- set timelines
ObjectMove(0,"Time-M1",0,M1,0);
ObjectMove(0,"Time-M5",0,M5,0);
ObjectMove(0,"Time-M15",0,M15,0);
ObjectMove(0,"Time-M30",0,M30,0);
ObjectMove(0,"Time-H1",0,H1,0);
ObjectMove(0,"Time-H4",0,H4,0);
ObjectMove(0,"Time-D1",0,D1,0);
ObjectMove(0,"Time-W1",0,W1,0);
ObjectMove(0,"Time-MN1",0,MN1,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
if(M1!=iTime(Symbol(),PERIOD_M1,0))
{
M1=iTime(Symbol(),PERIOD_M1,0); // overwrite old value with new value
//Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M1",0,M1,0);
}
if(M5!=iTime(Symbol(),PERIOD_M5,0))
{
M5=iTime(Symbol(),PERIOD_M5,0);
//Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M5",0,M5,0);
}
if(M15!=iTime(Symbol(),PERIOD_M15,0))
{
M15=iTime(Symbol(),PERIOD_M15,0);
//Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M15",0,M15,0);
}
if(M30!=iTime(Symbol(),PERIOD_M30,0))
{
M30=iTime(Symbol(),PERIOD_M30,0);
//Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M30",0,M30,0);
}
if(H1!=iTime(Symbol(),PERIOD_H1,0))
{
H1=iTime(Symbol(),PERIOD_H1,0);
//Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-H1",0,H1,0);
}
if(H4!=iTime(Symbol(),PERIOD_H4,0))
{
H4=iTime(Symbol(),PERIOD_H4,0);
//Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-H4",0,H4,0);
}
if(D1!=iTime(Symbol(),PERIOD_D1,0))
{
D1=iTime(Symbol(),PERIOD_D1,0);
//Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-D1",0,D1,0);
}
if(W1!=iTime(Symbol(),PERIOD_W1,0))
{
W1=iTime(Symbol(),PERIOD_W1,0);
//Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-W1",0,W1,0);
}
if(MN1!=iTime(Symbol(),PERIOD_MN1,0))
{
MN1=iTime(Symbol(),PERIOD_MN1,0);
//Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-MN1",0,MN1,0);
}
}
//+------------------------------------------------------------------+
static datetime BOMcur=0; dateTime BOMpre = BOMcur;
BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool isNewMonth = BOMcur != BOMpre;
if(isNewMonth){
DO_UPDATE(); ...
}
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
Obrigado por seu comentário.
Desde seu comentário, comecei a tentar pesquisar seu comentário. (porque eu nunca usei a função 'Void OnTick()')
De qualquer forma, Sr. William, seu comentário realmente me deu uma idéia e também me ensinou algo.
(p.s. se eu estiver pensando errado por favor me avise)
Pré-construção 600 (3 de fevereiro de2014), houve apenas o início(). Agora há OnTick (EAs,) OnCalculate (indicadores,) e OnStart (scripts.) Esqueci que você estava falando de um indicador.
Comece a usar as novas Funções de Tratamento de Eventos - Funções - Noções básicas de linguagem - Referência MQL4. Veja Como fazer seuslookbacks corretamente.