Discussão do artigo "A Implementação de um Modo Multi-currency (múltiplas moedas) no MetaTrader 5" - página 5
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Diga-me,
1. se eu precisar apenas de Bid e Ask de outras moedas, é justo usar "espiões"?
2. é apenas uma ideia, não há possibilidade na função onChartEvent de verificar eventos de outras moedas e não apenas da moeda atual?
3. é possível definir o valor do cronômetro como menor que um no evento onTimer, de modo que ele baixe o valor das cotações com muito mais frequência e, consequentemente, fique atrasado em relação à hora do último tique pelo tempo mínimo?
4. ou é possível usar "CHARTEVENT_CUSTOM+n" para verificar, no meu caso, o cruzamento de mashes em outros gráficos?
1. Usando.
2. Há uma opção. O evento de outra moeda deve ser enviado para o gráfico em que o EA com OnChartEvent() está definido.
3. Não. Um é o mínimo.
4. Pode.
Criei um simples "indicador espião" SendEvent.mq5, que envia um evento quando chega uma nova cotação:
Criei um Expert Advisor simples que recebe eventos desse indicador e tenta fazer uma operação de negociação (aqui está uma parte, o texto completo está no arquivo anexo):
O Expert Advisor recebe eventos do indicador, mas no testador (com e sem visualização) não consegue realizar uma operação de negociação - o erro "Invalid Request" é retornado, código de retorno 10013. Em tempo real, ele funciona normalmente. Se a operação de negociação no Expert Advisor for executada a partir de OnTick() em vez de OnChartEvent(), também funcionará bem.
Inseri o envio da solicitação de negociação no modelo do Expert Advisor oferecido pelo autor do artigo no CodeBase - as operações de negociação também não funcionam (o mesmo erro).
Alguém pode me dizer qual é o motivo? Li neste tópico que OnChartEvent() não é processado no testador, mas, nesse caso, os eventos enviados pelo indicador são processados no testador, mas é impossível executar uma operação de negociação a partir de OnChartEvent() no testador.
Criei um simples "indicador-espião" SendEvent.mq5, que envia um evento quando chega uma nova cotação:
Criei um Expert Advisor simples que recebe eventos desse indicador e tenta fazer uma operação de negociação (apresento uma parte dele, o texto completo está no arquivo anexo):
O Expert Advisor recebe eventos do indicador, mas no testador (com e sem visualização) não consegue realizar uma operação de negociação - o erro "Invalid Request" é retornado, código de retorno 10013. Em tempo real, ele funciona normalmente. Se uma operação de negociação no Expert Advisor for executada a partir de OnTick() em vez de OnChartEvent(), também funcionará bem.
Inseri o envio da solicitação de negociação no modelo do Expert Advisor oferecido pelo autor do artigo no CodeBase - as operações de negociação também não funcionam (mesmo erro).
Alguém pode me dizer qual é o motivo? Li neste tópico que OnChartEvent() não é processado no testador, mas, nesse caso, os eventos enviados pelo indicador são processados no testador, mas é impossível executar uma operação de negociação a partir de OnChartEvent() no testador.
Tente trazer meu peixe à minha mente. É claro que a lógica não está completa e é muito burra, mas parece ser muito semelhante ao que você precisa.
Pelo menos as posições do mercado são abertas tanto no testador quanto na demonstração.
Não sei por que (estou com preguiça de descobrir), mas seu exemplo me deu 10013 em qualquer situação.
PS
É melhor vincular-se a objetos padrão (como CAccountInfo e CTrade). Mas se você tiver paciência para escrever tudo sozinho, ficarei muito feliz.
A propósito, é melhor pegar a implementação do espião no artigo ou fazer uma cópia modificável (eu, por exemplo, sugiro substituir este ano "(long)_Period" pela data-hora do envio do evento ou outras informações úteis). Sua variante é, de certa forma, bastante "crua".
Veja se você consegue fazer meu peixe funcionar. A lógica está incompleta e é muito obtusa, mas parece ser muito semelhante ao que você precisa.
Estou tentando obter preços para três pares: EURUSD, EURGBP e GBPUSD. Tudo funciona bem quando seleciono "Todos os ticks" ou "Somente preços de abertura" no testador de estratégia. Mas se eu escolher "Every tick based on real ticks", por algum motivo, vários eventos "New Bar" podem ocorrer em um minuto para um instrumento.
Para repetir, você pode selecionar um intervalo, por exemplo, de 2016.07.15 a 2016.07.19. Aqui está um exemplo de registro, observe o 7º minuto e o 9º minuto:
2016.07.15 00:05:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333
2016.07.15 00:05:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119
2016.07.15 00:05:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399
2016.07.15 00:06:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334
2016.07.15 00:06:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119
2016.07.15 00:06:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384
2016.07.15 00:08:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329
2016.07.15 00:08:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167
2016.07.15 00:08:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394
2016.07.15 00:09:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327
2016.07.15 00:09:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166
2016.07.15 00:09:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396
2016.07.15 00:09:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327
2016.07.15 00:09:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166
Estou tentando obter preços para três pares: EURUSD, EURGBP e GBPUSD. Tudo funciona bem quando seleciono "Todos os ticks" ou "Somente preços de abertura" no testador de estratégia. Mas se eu escolher "Every tick based on real ticks", por algum motivo, vários eventos "New Bar" podem ocorrer em um minuto para um instrumento.
Para repetir, você pode selecionar um intervalo, por exemplo, de 2016.07.15 a 2016.07.19. Aqui está um exemplo de registro, observe o 7º minuto e o 9º minuto:
Qual é a razão para esse comportamento ao selecionar o modo "Todos os ticks baseados em ticks reais"?Como você captura o evento "Nova barra"? Na versão 1375, a precisão da chegada do tique foi aprimorada para milissegundos:
Testador: Adicionado suporte para tempo com precisão de milissegundos. Anteriormente, no testador de estratégia, o quantum de tempo era de um segundo.
Ao testar com ticks reais, os milissegundos são retirados dos dados originais do tick. Ao gerar ticks, os milissegundos são soletrados de acordo com o volume do tick. Por exemplo, se houver 3 ticks em um segundo, serão atribuídos a eles os tempos 000, 333 e 666 milissegundos.
Eu pego umanova barra da forma como está escrito no artigo. Ou seja, o indicador envia o evento "New Bar" dessa forma (em comparação com o tempo anterior, minutos, horas, dias, meses):
double price_current=price[rates_total-1];
TimeCurrent(time);
if(prev_calculated==0)
{
EventCustom(CHARTEVENT_INIT,price_current);
prev_time=time;
return(rates_total);
}
//--- new tick
if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);
//--- check change time
if(time.min==prev_time.min &&
time.hour==prev_time.hour &&
time.day==prev_time.day &&
time.mon==prev_time.mon) return(rates_total);
//--- new minute
if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current);
ATUALIZAÇÃO: O problema desapareceu ao instalar a compilação 1375.
Obrigado por esse artigo enorme. Até agora, eu não tinha ouvido falar do EventChartCustom. Eu estava tentando outros eventos de gráfico, mas eles só levavam em conta eventos causados por ação humana. Isso resolve muitas coisas.
A propósito, eu trabalho com MQL4, e 98% das vezes é a mesma coisa.
Abraços
Muito obrigado por isso, é muito útil. Excelente trabalho!