Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 248

 
STARIJ:

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)

  if((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) ||
     (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))   // Условие открытия
     if(OrdersTotal() == 0) Alert1();
     if(OrdersTotal() == 1) Alert2();
}

void Alert1()
{
  if (OrdersTotal() == 0)  // Перед вызовом этой функции уже проверялось количество ордеров
  int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0);
}

void Alert2()
{
  if(OrdersTotal() == 1)  // Перед вызовом этой функции уже проверялось количество ордеров
  int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0);
}

e substituiu-o (um pouco áspero, mas IMHO é melhor que o original) por

  if((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) ||
     (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))   // Условие открытия
     if(OrdersTotal() == 0)
  {
    int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0); 
    int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0);
    Sleep(60); // Дождаться следующего бара, а то еще пооткрывает
  }
}

Há uma linha extra na função Alert3

  int cl1=OrderClose (OrderTicket(),OrderLots(),Ask,3);
Ao invés de duplo CHF=(int)DoubleToStr(oper2*100000,0); tente int CHF=oper2/_Point;
 
STARIJ:

substituído (bruto, mas IMHO melhor do que o original) por

Não é rude, mas funcionará com erros. Se pelo menos porque ambas as ordens passam por "Ask of the same character".
 
Alexey Kozitsyn:   Não é rude, mas funcionará com erros. Se pelo menos porque ambas as ordens passam por Ask of the same symbol.

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

 
STARIJ:

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

Sim, é claro, se as condições para a abertura forem cumpridas. O pedido do segundo símbolo deve ser obtido separadamente.
 
Olá a todos. A questão é ingênua, diz respeito à função OrdensTotal(). É claro que ele retorna o número de ordens, e as ordens são numeradas de 0 a N. Mas se as barras forem numeradas a partir da recém-aberta na história, isto é, a barra "fresca" é numerada 0 e a "antiga" é numerada 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?
 
Youri Lazurenko:
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.

 
Artyom Trishkin:

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.

 
STARIJ:

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

Razão: