[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

 
 
dent:
Como pedir um assessor
Você pode fazer seu pedido aqui: https://www.mql5.com/ru/job
 
NaVolne:


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.

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
Como pedir um assessor
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


algo assim...

Um mau exemplo. Porque o preço de abertura dos candelabros pode ser repetido. Mas o momento não.
 
MaxZ:
Mau exemplo. Porque o preço de abertura das velas pode ser repetido. Mas o momento não.

Eu concordo:))))
 
Muito obrigado pessoal, está começando a dar certo :)
 

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 --



 
neisseria:

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.