Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 248
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
A Internet está de volta! Posso escrever para os correios?
Sim, estou em contato. Mande-me uma mensagem de texto.
Ajuda para refinar a EA Eu sou um programador novato, descrição:
O consultor trabalha em dois pares de moedas EURUSD e USDCHF, só abre duas operações de compra quando há uma divergência de 10pp (essencialmente um árbitro padrão).
Aqui está a condição: if ((ind2>ind1+impulso*Ponto && ind3<ind4-impulso*Ponto) || (ind2<ind1-impulso*Ponto && ind3>ind4+impulso*Ponto))
E se fecha quando o lucro/perda total atinge um determinado valor: se ((AccountProfit()>=10)|||(AccountProfit()<=-20))
O PROBLEMA: Nem sempre abre 2 ofícios, às vezes abre 3. Ou abre dois negócios com a mesma moeda. Precisa: sempre abre 2 transações em diferentes moedas (uma - em EURUSD; outra - em USDCHF).
Aqui está o próprio código:
duplo impulso externo = 10; // Variáveis globais
Lotes duplos externos = 1;
int start()
{
duplo ind2=iClose("EURUSD",PERÍODO_M1,0);
duplo ind1=iOpen("EURUSD",PERÍODO_M1,0);
duplo ind3=iClose("USDCHF",PERÍODO_M1,0);
duplo ind4=iOpen("USDCHF",PERÍODO_M1,0);
duplo oper1=ind2-ind1;
double EUR=(int)DoubleToStr(oper1*100000,0);
dupla oper2=ind3-ind4;
double CHF=(int)DoubleToStr(oper2*100000,0);
Comentário(StringFormat("Dados de saída\nEUR = %G\nCHF =%G",EUR,CHF))
se ((AccountProfit()>=10)|||(AccountProfit()<=-20)) // Condição de Fechamento
Alerta3();
if ((ind2>ind1+impulso*Ponto && ind3<ind4-impulso*Ponto) || (ind2<ind1-impulso*Ponto && ind3>ind4+impulso*Ponto) // condição aberta
se (OrderTotal() == 0)
Alerta1();
se (OrderTotal() == 1)
Alerta2();
retorno(0);
}
int Alert1()
{
se (OrderTotal() == 0)
int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0)
retorno(0);
}
int Alert2()
{
if(OrdersTotal() == 1)
int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0);
retorno(0);
}
int Alert3()
{
enquanto (OrdensTotal()>0)
se (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) //Close
int cl1=OrderClose (OrderTicket(),OrderLots(),Bid,3);
int cl1=OrderClose (OrderTicket(),OrderLots(),Ask,3);
retorno(0);
}
Alexey Belyakov: CУТЬ ПРОБЛЕММЫ: Не всегда открывает 2 сделки, а бывает открывает 3. Или открывает две сделки по одной валюте. Нужно чтобы: открывал всегда 2 сделки по разным валютам ( одна - по EURUSD; другая- по USDCHF)
O servidor é ordenado para abrir o Euro. No momento em que chega ao servidor, no momento em que o servidor ... Até o momento, não há ordens. No próximo tick, a condição é cumprida novamente e novamente a ordem de abertura do Euro. O servidor abriu o primeiro pedido. Como há 1 ordem, o comando para abrir uma segunda (e já é a terceira!) ordem é enviado.
Eu tornei todas as funções nulas e removi o retorno. Aqui está esta parte do programa (pressionamos o botão SRC para inseri-lo)
e substituiu-o (um pouco áspero, mas IMHO é melhor que o original) por
Há uma linha extra na função Alert3
Ao invés de duplo CHF=(int)DoubleToStr(oper2*100000,0); tente int CHF=oper2/_Point;substituído (bruto, mas IMHO melhor do que o original) por
É claro que você está absolutamente certo. Além disso, este erro estava no código fonte, mas foi disfarçado pelo uso de funções tanto do autor como de você, assim como de mim, um pecador. Depois de remover as funções, o erro tinha se tornado óbvio. Penso que as posições serão abertas somente pelo símbolo em cujo gráfico a EA está localizada. Certo?
É claro que você está absolutamente certo. E este erro foi contido no código fonte, mas foi mascarado pelo uso de funções do autor, de você e de mim pecador. Depois de remover as funções, o erro tinha se tornado óbvio. Penso que as posições serão abertas somente pelo símbolo em cujo gráfico a EA está localizada. Certo?
Olá a todos. A questão é ingênua, diz respeito à função OrdensTotal(). É claro que ele retorna o número de pedidos e a numeração dos pedidos vai de 0 a N. Mas se as barras forem numeradas a partir da recém-aberta na história, ou seja, uma barra "fresca" é numerada 0 e uma antiga - N. E na função OrdersTotal(), entendo que tudo acontece o contrário - a ordem aberta mais antiga é numerada 0 e a "fresca" é numerada como N. Eu acertei?
Bastante, mas há nuances.
Houve uma época em que a triagem dependia da triagem no terminal. Nenhum usuário pode dizer com certeza se esse tempo voltará "de repente" quando a triagem dependerá novamente da triagem do terminal. É por isso que seria muito mais seguro coletar pedidos em uma matriz e classificá-los por seu tempo de abertura/fecho - então você saberia com certeza que sua classificação depende do tempo e não "de repente" na classificação no terminal.
Bastante, mas há nuances.
Houve uma época em que a triagem dependia da triagem no terminal. Nenhum usuário pode dizer com certeza se esse tempo voltará "de repente" quando a triagem dependerá novamente da triagem do terminal. É por isso que é melhor coletar os pedidos em ordem e ordená-los por tempo de abertura/fecho - então você saberá com certeza que sua ordenação depende do tempo e não "de repente" da ordenação no terminal.
Olá. Obrigado por sua resposta. Primeiro quero voltar à sua resposta anterior à minha pergunta, sobre o ciclo inverso. Ontem, antes de partir para o trabalho, escrevi uma resposta, e hoje, não consegui encontrar meus (e seus) postos. Tanto quanto entendi, eu perguntei em um ramo errado. O ciclo reverso é i...?
"É por isso que é mais confiável coletar pedidos em uma matriz e ordená-los por tempo de abertura/fecho" - isto é muito interessante, e eu acho que é mais confiável e correto (e me parece que, quando você define o último pedido, nem sempre obtém o que precisa). Se não for difícil, como faço isso (criar uma matriz por tempo aberto)?
E mais uma coisa. Eu ainda não experimentei. Temos uma ordem lucrativa e de perda (travamento). As ordens de lucro são fechadas utilizando o trailing stop. Gostaria de ter uma nota que as ordens foram fechadas para comparar seu lucro total com o da perda de ordens e para fechar as ordens perdidas, se o saldo for positivo. Estou interessado em saber exatamente que ordens foram fechadas.
Assumo que as posições só serão abertas no símbolo em cujo mapa a EA está localizada. Certo?
Se seu consultor especializado está trabalhando no EURUSD, mas você quer fazer um pedido de compra em USDCHF
então você deve usar MarketInfo("USDCHF",MODE_ASK); ao invés de Ask (será para EURUSD) em OrderSend