[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 182
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
Como pedir um assessor
Por que este é o caso?
A EA processa cada tick, e em cada tick há uma verificação e abertura de um pedido.... Você precisa lembrar o tempo da última posição aberta e fazer uma pausa de 15 minutos, ou pode trabalhar pela abertura ou fechamento de um bar. É melhor estar ligado ao tempo de barra no código.
Como pedir um assessor
algo assim...
Mau exemplo. Porque o preço de abertura das velas pode ser repetido. Mas o momento não.
Eu concordo:))))
Estou tentando aprender o mcl4 e escrever um EA para testes. Algumas questões surgiram.
1) Existe algum procedimento para verificar o histórico analisado para velas de minutos em falta para este ou aquele par? Talvez o procedimento já esteja escrito e disponível na rede?
2) Se houver lacunas ou apenas uma pequena quantidade de história, como a EA pode baixar os castiçais de minutos inteiros para este ou aquele par a partir da data necessária ou preencher as lacunas?
A idéia é que a EA verifique a exatidão do histórico enquanto trabalha e corrija as lacunas ou um pequeno número de barras, se necessário.Estou aprendendo uma linguagem de programação, e estou tendo dificuldades para entender o comportamento do programa. Escrevi um EA com base no livro didático, mas o torci para um princípio de funcionamento ligeiramente diferente.
O Expert Advisor se baseia na média de 2 muwings. A idéia é simples, as médias móveis cruzam-se, a ordem é fechada e a oposta é aberta. Eu escrevi um EA e funciona bem. É claro que está em pequena desvantagem, mas de acordo com a idéia. Todo o problema é o seguinte (em negrito):
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D
Se eu mudar a maneira de calcular as médias móveis (pode mostrar mais sinal) e colocar o método exponencial( MODE_SMA) em vez de um simples(MODE_EEMA ) e mais um(MODE_SMMA), o chamado método suavizado, tudo dá errado. O princípio de trabalho se torna ainda mais divertido (no testador de estratégia) à medida que a EA abre uma ordem logo no início do período estabelecido e a fecha no final. Isto é, durante um ano abre um único comércio no início do período, e o fecha no final. Como resultado, o Expert Advisor me mostrou uma vantagem, mas eu não preciso de tal vantagem. Eu mesmo posso atirar uma moeda ao ar e abrir um pedido de compra ou venda e olhar, quer eu esteja ganhando ou perdendo em um ano. A propósito, se eu definir MODE_SMA como MODE_LWMA (Linear Weighted Moving Average), o programa funciona bem.
Por favor, me avise, o que está errado? O princípio é o mesmo; apenas a forma como as médias móveis são calculadas foi um pouco alterada.
Aqui está o código completo do programa:
//+------------------------------------------------------------------+
// Baseado em duas médias móveis.mq4
//| Copyright © 2011, MetaQuotes Software Corp.
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#direitos autorais "Copyright © 2011, MetaQuotes Software Corp.
#link da propriedade "http://www.metaquotes.net"
//--------------------------------------------------------------- 1 --
// Valores numéricos para M15
int int externo Período_MA_1=6; // Período MA1
externo int Período_MA_2=15; // Período MA 2
Lotes duplos externos =0,1; // Número fixo de lotes
bool Work=true; // Expert Advisor will work.
Symb; // Nome do instrumento financeiro
//--------------------------------------------------------------- 2 --
int start()
{
int
Total, // Número de pedidos na janela
Dica=-1, // Tipo de pedido selecionado (B=0,S=1)
Bilhete; // Número do pedido
duplo
A, //Valor. Valor MA_1 para a primeira barra a partir do final
Valor MA_2 para a primeira barra a partir do final
Preço, // Preço do pedido selecionado
C, //Valor. MA_1 para a segunda barra a partir do final
D, // Significado. Valor MA_2 para a segunda barra a partir do final
Lote; // Número de lotes na ordem selecionada
bool
Ans =falso, // Resposta do servidor após o fechamento
Cls_B=falso, // Critério de fechamento da compra
Cls_S=falso, // Critério de fechamento de Venda
Opn_B=falso, // Critério de abertura da compra
Opn__S=falso; // critério de abertura Vender
//--------------------------------------------------------------- 3 --
//Pré-processamento
if(Bars < Período_MA_2) // Não há barras suficientes
{
Alerta("Não há barras suficientes na janela. O Expert Advisor não está funcionando");
retorno; // Saída início()
}
if(Trabalho==falso) // Erro crítico.
{
Alerta("Erro crítico. O Expert Advisor não está funcionando");
retornar; // Sair do início()
}
//--------------------------------------------------------------- 4 --
// Contagem de pedidos
Symb=Símbolo(); // Nome do instrumento financeiro.
Total=0; // Número de pedidos
for(int i=1; i<=OrdensTotal(); i++) // Laço de encomenda
{
if(OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // Se o seguinte
{ // Análise de pedidos:
se (OrderSymbol()!=Symb)continuar; // Não nosso instrumento financeiro
se (OrderType()>1) // Temos um pedido pendente
{
Alerta("Ordem pendente detectada. O Expert Advisor não está funcionando;)
retorno; // Saída()
}
Total++; // Contador de ordens de mercado
se (Total>1) // Não mais de um pedido
{
Alerta("Várias ordens de mercado. O Expert Advisor não está funcionando;)
retorno; // Saída()
}
Ticket=OrderTicket(); // Número do pedido selecionado.
Dica =OrderType(); // Tipo da ordem selecionada.
Preço =OrdemPreço Aberto(); // Preço da ordem selecionada.
Lote =OrderLots(); // Número de lotes
}
}
//--------------------------------------------------------------- 5 --
// Critérios comerciais
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D
se (A<C&C>D&B>==A) // МА1 linha vai para baixo,
{ // MA1 cruzes MA2
Opn_B=verdadeiro; // de cima para baixo
Cls_S=verdadeiro; //
}
se (B<D&D>C&&A>=B) // Linha MA2 vai para baixo
{ // MA2 cruzes MA1
Opn_S=verdadeiro; // de cima para baixo
Cls_B=verdadeiro; //
}
//--------------------------------------------------------------- 6 --
// Encerrar pedidos
enquanto(true) //Order closing loop.
{
if (Tip==0 && Cls_B===verdadeiro) //Open Buy order.
{ //é um critério de fechamento
Alerta("Tentando fechar Comprar ",Ticket";)
RefreshRates(); // Atualização de dados
Ans=OrderClose(Ticket,Lot,Bid,2); // Fechar Compra
se (Ans===verdadeiro) // Funcionou :)
{
Alerta ("Pedido Fechado de Compra", Ticket;)
pausa; // Saída do circuito fechado
}
if (Fun_Error(GetLastError())==1) // Tratamento de erros
continuar; // tentar novamente
retornar; // Sair do início()
}
se (Tip===1 && Cls_S===verdadeiro) // Ordem de venda aberta.
{ // há um critério próximo
Alerta("Tentando fechar Vender ",Bilhete";)
RefreshRates(); // Atualização de dados
Ans=OrderClose(Ticket,Lot,Ask,2); // Fechar Venda
se (Ans===verdadeiro) // Funcionou :)
{
Alerta ("Pedido de venda fechado", Ticket;)
pausa; // Saída do circuito fechado
}
if (Fun_Error(GetLastError())==1) // Tratamento de erros
continuar; // tentar novamente
retornar; // Sair do início()
}
pausa; // Sair enquanto
}
//--------------------------------------------------------------- 7 --
//--------------------------------------------------------------- 8 --
/Obertura de pedidos
enquanto(true) //Order closing loop.
{
se (Total==0 && Opn_B===verdadeiro) // Sem ordens em aberto
{ //abrir critério de compra.
RefreshRates(); // Atualizar dados
Alerta("Tentando abrir a Buy. Waiting for reply...");
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA");//Open Buy
se (Bilhete > 0) // funcionou :)
{
Alerta ("Pedido de compra aberto", Ticket;)
devolução; //Ordem de saída
}
if (Fun_Error(GetLastError())==1) // Tratamento de erros
continuar; // tentar novamente
retornar; // Sair do início()
}
se (Total==0 && Opn_S===verdadeiro) // sem ordens em aberto
{ // critério de Venda Aberta.
RefreshRates(); // Atualizar dados
Alerta ("Tentativa de abrir Sell. Waiting for reply...");
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//Open Sel.
se (Bilhete > 0) // funcionou :)
{
Alerta ("Pedido de venda aberto", Ticket;)
retorno; // Saída desde o início()
}
if (Fun_Error(GetLastError())==1) // Tratamento de erros
continuar; // tentar novamente
retornar; // Sair do início()
}
pausa; // Sair enquanto
}
//--------------------------------------------------------------- 9 --
retorno; //saída do início()
}
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error) // Tratamento de erros fie
{
interruptor(Erro)
{ // Erros intransponíveis.
caso 4: Alerta("O servidor comercial está ocupado. Tente novamente...");
Sleep(3000); // Solução simples.
retorno(1); // Função de saída.
caso 135:Alerta ("Preço alterado. Tente novamente...");
RefreshRates(); // Atualização de dados.
retornar(1); // Sair da função.
caso 136:Alerta ("Sem preço. À espera de um novo tique...");
while(RefreshRates()==false) // Até um novo tick
Dormir(1); // Atraso no laço
retornar(1); // Sair da função
caso 137:Alerta("Corretor está ocupado. Tente novamente...");
Sleep(3000); // Solução simples.
retornar(1); // Sair da função.
caso 146:Alerta("O subsistema comercial está ocupado. Tente novamente...");
Dormir(500); // Decisão simples
retornar(1); // Sair da função
// Erros críticos
caso 2: Alerta("Erro geral;)
retornar(0); // Sair da função.
caso 5: Alerta ("Versão mais antiga do terminal");
Trabalho=falso; // Não funciona mais
retornar(0); // Sair da função
caso 64: Alerta("Conta bloqueada.");
Trabalho=falso; // Não funciona mais
retornar(0); // Sair da função
caso 133:Alerta ("Comércio proibido");
retornar(0); // Sair da função
caso 134:Alerta("Não há dinheiro suficiente para executar a transação");
retornar(0); // Sair da função
default: Alert("Ocorreu um erro ",Error); // Outras opções
retornar(0); // Sair da função
}
}
//-------------------------------------------------------------- 11 --
Estou aprendendo uma linguagem de programação, e estou tendo dificuldades para entender o comportamento do programa. Escrevi um EA com base no tutorial, mas o mudei para um princípio ligeiramente diferente.
Ao fechar o pedido, seria bom diminuir o Total, ou, melhor ainda, não nos preocupemos com isso e façamos uma função que devolva o número de pedidos abertos para o símbolo e o número mágico.
Quatro médias móveis são demais e é melhor mostrá-las em dois períodos e com diferentes compensações. É recomendado exibi-los na tela e ver como se comportam.