Boa Noite, gostaria de saber como faço para capturar o saldo agressor por candle.
Tenho visto alguns posts no forum, porem não consegui rodar o script, não retorna o valor e também gostaria de saber como capturar o valor do saldo por candle.
Preciso do saldo em um número, positivo comprador, negativo vendedor, para ser uma base para meu EA.
Segue script:
//--- requesting ticks (Agressão)
MqlTick tick_array[];
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,0,_INPticks);
ArraySetAsSeries(tick_array,true);
//--- Faz 3 tentativas de receber ticks
while(attempts<3)
{
if (received > 0)
{
if(GetLastError()==0)
{
success=true;
break;
}
}
else
PrintFormat("%s: Ticks ainda não estão sincronizados, %d ticks recebidos por %d ms. Error=%d",
_Symbol,received,GetTickCount(),_LastError);
//--- Contagem de tentativas
attempts++;
//--- Uma pausa de um segundo para aguardar o fim da sincronização da base de dados de ticks
Sleep(1000);
}
//--- A recepção de ticks solicitados no início do histórico de ticks falhou em três tentativas
if(!success)
{
PrintFormat("Error! Falha em receber %d ticks do %s em três tentativas",_Symbol);
return;
}
else
{
int ticks=ArraySize(tick_array);
MqlTick tick=tick_array[ticks];
buy = tick.flags == 24 && tick.last >= tick.ask;
sell = tick.flags == 24 && tick.last <= tick.bid;
}
Muito Obrigado.
... if (tick_array[i].flags == 56) é compra. Veja o volume em tick_array[i].volume... if (tick_array[i].flags == 88) é venda. Depois você calcula a diferença.
Abraços
O problema é que não consigo retorno dos valores, testei na corretora XP e Modal.
Nessa linha:
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,0,_INPticks);
O received me retorna 0 nas 3 tentativas do codigo acima, e com isso não consigo os dados.
Tem algum erro na linha? Pq não me retorna os valores?
Obrigado.
... if (tick_array[i].flags == 56) é compra. Veja o volume em tick_array[i].volume... if (tick_array[i].flags == 88) é venda. Depois você calcula a diferença.
Abraços
O que preciso é calcular o saldo agressor em tempo real no mesmo candle, para que assim o EA tome uma decisão.
Fiz uma alteração no código, porem só me retorna o flags 30 e o volume 3, mesmo alterando o registro de tick.
void OnTick()
{
MqlDateTime today;
datetime current_time=TimeCurrent();
TimeToStruct(current_time,today);
datetime startday=StructToTime(today);
datetime endday=startday+(_Period*60);
MqlTick tick_array[];
int received=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_TRADE,startday*1000,endday*1000);
ArraySetAsSeries(tick_array,true);
int ticks=ArraySize(tick_array);
for(int i=0;i<ticks;i++)
{
Print(tick_array[ticks-1].flags, " ",ticks, " - volume: ", tick_array[ticks-1].volume);
}
}
Podem me ajudar como opter o salgo agressor assim em tempo real, calculando sem prejudicar o processameno do EA, tipo, da forma que esta, ele calcula todos os ticks a cada OnTick e gostaria que somente que já tivesse o valor do saldo e fosse somando ou subtraindo.
O que preciso é calcular o saldo agressor em tempo real no mesmo candle, para que assim o EA tome uma decisão.
Fiz uma alteração no código, porem só me retorna o flags 30 e o volume 3, mesmo alterando o registro de tick.
void OnTick()
{
MqlDateTime today;
datetime current_time=TimeCurrent();
TimeToStruct(current_time,today);
datetime startday=StructToTime(today);
datetime endday=startday+(_Period*60);
MqlTick tick_array[];
int received=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_TRADE,startday*1000,endday*1000);
ArraySetAsSeries(tick_array,true);
int ticks=ArraySize(tick_array);
for(int i=0;i<ticks;i++)
{
Print(tick_array[ticks-1].flags, " ",ticks, " - volume: ", tick_array[ticks-1].volume);
}
}
Podem me ajudar como opter o salgo agressor assim em tempo real, calculando sem prejudicar o processameno do EA, tipo, da forma que esta, ele calcula todos os ticks a cada OnTick e gostaria que somente que já tivesse o valor do saldo e fosse somando ou subtraindo.
... salve o tempo após cada chamada, exemplo, "hora1". Utilize agora a função CopyTicks(_Symbol, tick_array, COPY_TICKS_TRADE, hora1, )
Alterei o codigo com um timer, cada 10s ele busca os ultimos 100 registros, porem o retorno sempre é o mesmo, 92 registros, flags:30, volume:2.
Código:
int OnInit()
{
EventSetTimer(10);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
}
void OnTimer()
{
datetime current_time=TimeCurrent();
MqlTick tick_array[];
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,current_time,100);
ArraySetAsSeries(tick_array,true);
int ticks=ArraySize(tick_array);
for(int i=0;i<ticks;i++)
{
Print("flags: ",tick_array[ticks-1].flags, " Ticks: ",ticks, " Volume: ", tick_array[ticks-1].volume, " Time: ",current_time);
}
}
resultado:
2018.03.05 20:48:05.354 2018.03.01 09:09:30 flags: 30 Ticks: 92 Volume: 2 Time: 2018.03.01 09:09:29
Mesmo alterando o horario de busca, mudando candle, o valor é sempre o mesmo do retorno.
Sabe pq?
Alterei o codigo com um timer, cada 10s ele busca os ultimos 100 registros, porem o retorno sempre é o mesmo, 92 registros, flags:30, volume:2.
Código:
int OnInit()
{
EventSetTimer(10);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
}
void OnTimer()
{
datetime current_time=TimeCurrent();
MqlTick tick_array[];
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,current_time,100);
ArraySetAsSeries(tick_array,true);
int ticks=ArraySize(tick_array);
for(int i=0;i<ticks;i++)
{
Print("flags: ",tick_array[ticks-1].flags, " Ticks: ",ticks, " Volume: ", tick_array[ticks-1].volume, " Time: ",current_time);
}
}
resultado:
2018.03.05 20:48:05.354 2018.03.01 09:09:30 flags: 30 Ticks: 92 Volume: 2 Time: 2018.03.01 09:09:29
Mesmo alterando o horario de busca, mudando candle, o valor é sempre o mesmo do retorno.
Sabe pq?
Alterei a linha para me mostrar os valores, estava sempre com o mesmo valor, porem o resultado não alterou.
Print("flags: ",tick_array[i].flags, " Posição: ",i, " Volume: ", tick_array[i].volume, " Time: ",current_time);
Agora mostra cada item do array, porem sempre com os mesmos dados.
2018.03.05 20:54:03.912 2018.03.01 09:04:30 flags: 30 Posição: 0 Volume: 2 Time: 2018.03.01 09:04:30
Pessoal consegui recuperar os dados, agora o problema é que flags sempre me retorna 30 e as vezes 24, porem muito raro, mesmo alterando os outros dados do tick.
Código:
void OnTick()
{
// Flags 24 Compra
// Flags 30 Venda
MqlTick last_tick[];
int received=CopyTicks(_Symbol,last_tick,COPY_TICKS_TRADE,0,1);
int ticks=ArraySize(last_tick);
for(int i=0;i<ticks;i++)
{
//MqlTick last_tick;
//if (SymbolInfoTick(_Symbol,last_tick))
//{
bool buy_tick = (last_tick[i].flags == 24);
bool sell_tick = (last_tick[i].flags == 30);
//bool buy_tick = (last_tick.last == last_tick.ask);
//bool sell_tick = (last_tick.last == last_tick.bid);
//bool buy_tick = (last_tick[i].flags == TICK_FLAG_BUY);
//bool sell_tick = (last_tick[i].flags == TICK_FLAG_SELL);
//bool buy_tick=((last_tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);
//bool sell_tick=((last_tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);
if (buy_tick) //(tick_array[i].flags == 24)
{
AgressaoCompra = AgressaoCompra + last_tick[i].volume;
}
else if (sell_tick)
{
AgressaoVenda = AgressaoVenda + last_tick[i].volume;
}
//else
// {
// Print(last_tick.flags, " : Volume: " ,last_tick.volume);
// }
Print(" Time: ",last_tick[i].time," Flags: ",last_tick[i].flags, " : Volume: " ,last_tick[i].volume, " : Last: " ,last_tick[i].last, " : Ask: " ,last_tick[i].ask, " : Bid: " ,last_tick[i].bid);
}
Agressao = (AgressaoCompra - AgressaoVenda);
Comment("Agressão Compradora: ", AgressaoCompra," : Agressão Vendedora: ", AgressaoVenda, " : Saldo: ", Agressao);
if (isNewBar())
{
Agressao = 0;
AgressaoCompra = 0;
AgressaoVenda = 0;
}
}
Tentei varias combinações de condição, porem sem sucesso, somente comparando com 30 e 24 que funciona, mas testei em vários dias e sempre vem muitos 30, mesmo o preço subindo ou descendo.
Alguem sabe o que pode ser?
Obrigado.
Galera consegui resolver o problema.
No simulador o retorno dos dados não continham as agressões, mas usando com o mercado aberto, mesmo na conta demo, funcionou, tanto xp, modal e rico.
Ficou assim o código.
//---Verifica agressão
MqlTick last_tick[];
int received=CopyTicks(_Symbol,last_tick,COPY_TICKS_TRADE,0,1);
int ticks=ArraySize(last_tick);
for(int i=0;i<ticks;i++)
{
bool buy_tick=((last_tick[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);
bool sell_tick=((last_tick[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);
if (buy_tick)
{
AgressaoCompra = AgressaoCompra + last_tick[i].volume;
}
else if (sell_tick)
{
AgressaoVenda = AgressaoVenda + last_tick[i].volume;
}
}
Olá,
Estou tentando fazer esse Saldo Agressor do Candle, já li vários posts, porém, não estou conseguindo fazer o negócio funcionar. No código abaixo estou tentando fazer a separação entre agressão de compra e de venda, para posteriormente calcular o saldo, mas não estou conseguindo fazer o MT5 plotar essas informações. Há algo de errado? É necessário fazer algo mais? Estou usando o MT5 da Modal. Obrigado.
#property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 1 #property indicator_label1 "Buy" #property indicator_type1 DRAW_HISTOGRAM #property indicator_color1 C'17,134,225' #property indicator_style1 STYLE_SOLID #property indicator_width1 5 #property indicator_label2 "Sell" #property indicator_type2 DRAW_HISTOGRAM #property indicator_color2 C'234,55,0' #property indicator_style2 STYLE_SOLID #property indicator_width2 5 double BuyBuffer[]; double SellBuffer[]; int OnInit() { SetIndexBuffer(0,BuyBuffer,INDICATOR_DATA); SetIndexBuffer(1,SellBuffer,INDICATOR_DATA); return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { MqlTick last_tick[]; int received=CopyTicks(_Symbol,last_tick,COPY_TICKS_TRADE,0,1); int ticks=ArraySize(last_tick); for(int i=0;i<ticks;i++) { bool buy_tick=((last_tick[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); bool sell_tick=((last_tick[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); if(buy_tick) { BuyBuffer[i]=BuyBuffer[i]+last_tick[i].volume; } else if(sell_tick) { SellBuffer[i]=SellBuffer[i]+last_tick[i].volume; } } return(rates_total); }
Olá,
Estou tentando fazer esse Saldo Agressor do Candle, já li vários posts, porém, não estou conseguindo fazer o negócio funcionar. No código abaixo estou tentando fazer a separação entre agressão de compra e de venda, para posteriormente calcular o saldo, mas não estou conseguindo fazer o MT5 plotar essas informações. Há algo de errado? É necessário fazer algo mais? Estou usando o MT5 da Modal. Obrigado.
Olá, tem um monte de problema nesse código aí:
1º - você está plotando apenas 1 buffer: #property indicator_plots 1
deveriam ser 2, ou então você cria um 3º Buffer que armazene a diferença entre os dois.
2º Melhor escolher uma cor padrão, também pode dar algum problema. ClrRed x ClrBlue por exemplo.
3º Seu Buffer indexado em i recebe o volume em i, porém no momento i o Buffer não tem valor algum, você pode usar uma variável estática e zerar ela a cada novo candle.
Sugiro copiar o código do amigo acima e fazer as alterações que quiser. O seu tá meio estranho
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Boa Noite, gostaria de saber como faço para capturar o saldo agressor por candle.
Tenho visto alguns posts no forum, porem não consegui rodar o script, não retorna o valor e também gostaria de saber como capturar o valor do saldo por candle.
Preciso do saldo em um número, positivo comprador, negativo vendedor, para ser uma base para meu EA.
Segue script:
//--- requesting ticks (Agressão)
MqlTick tick_array[];
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,0,_INPticks);
ArraySetAsSeries(tick_array,true);
//--- Faz 3 tentativas de receber ticks
while(attempts<3)
{
if (received > 0)
{
if(GetLastError()==0)
{
success=true;
break;
}
}
else
PrintFormat("%s: Ticks ainda não estão sincronizados, %d ticks recebidos por %d ms. Error=%d",
_Symbol,received,GetTickCount(),_LastError);
//--- Contagem de tentativas
attempts++;
//--- Uma pausa de um segundo para aguardar o fim da sincronização da base de dados de ticks
Sleep(1000);
}
//--- A recepção de ticks solicitados no início do histórico de ticks falhou em três tentativas
if(!success)
{
PrintFormat("Error! Falha em receber %d ticks do %s em três tentativas",_Symbol);
return;
}
else
{
int ticks=ArraySize(tick_array);
MqlTick tick=tick_array[ticks];
buy = tick.flags == 24 && tick.last >= tick.ask;
sell = tick.flags == 24 && tick.last <= tick.bid;
}
Muito Obrigado.