Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 218
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
Completei seu código com bloco para abrir ordem com volume 0,1 (logo após a função void start())
Mas por alguma razão o programa não abre nenhuma ordem de aumento de volume (0,3 lotes cada) em resposta ao fechamento dessas ordens
AS COISAS QUE EU NÃO ENTENDO EM SEU CÓDIGO
1. Se entendi corretamente, você está atribuindo МН=123 somente aos pedidos com volume de 0,3 lote.
Na função de data/hora SearTim (int s) você está procurando um pedido com MH=123 mas com um volume de 0,1.
Mas o pedido com volume 0,1 não pode ter МН=123, porque este MM é atribuído apenas a pedidos com volume 0,1
Nos corpos das funções SearTim(int s) e int search(), e especificamente nos comentários, é necessário abrir uma ordem com um volume de 0,3
Não entendo porque tenho que abrir um pedido com um volume maior sob as mesmas condições mais de uma vez.
Você já abriu pedidos com volume aumentado no primeiro bloco.
Eu ficaria muito grato se você pudesse escrever algum código que abrisse um pedido com 0,3 volume após fechar cada pedido 0,1 e manter o valor de 0,1.
Neste caso, farei meu melhor para encontrar todas as respostas às minhas perguntas em seu código com a ajuda da função Imprimir (), meus modestos conhecimentos e livros de referência.
NOTA:
Tenho o mesmo tipo de pedidos com volume 0,1 e 0,3 - apenas SEL. É por isso que se não estou enganado, não temos que calcular o tipo de pedido (BAY ou SEL) na função int search().
Gostaria de lembrar mais uma vez que o objetivo final do meu programa é memorizar o valor da hora (não um minuto, nem um segundo, mas apenas uma hora) da abertura da ordem 0,1 após ter sido fechada pelo preço de fechamento por uma ordem 0,3 que fechou no SL
Peço desculpas por não poder explicar muito a vocês, pois vocês devem conhecer a linguagem de programação. Acho que você já é um programador e eu estava confiando em alguém que conhece programação.
Você tem que aprender programação primeiro. Se eu lhe explicar o quê e como, será o aprendizado de uma linguagem de programação.
Veja os exemplos de EAs, como eles são escritos e tente escrever programas desde o início. E você está tentando escrever um programa que já é complicado.
Veja o tutorial e exemplos de como escrever comandos e exemplos de módulos.
Abordo esta questão sem complicações, aqui está o bloco final.
Quando o lucro de uma ordem se torna positivo, ela encerra essa ordem e sobre todo esse lucro quanto de uma posição perdedora é possível. Se Perekr estiver habilitado.
Temos que mudá-lo para que feche ambas as posições somente quando o lucro de uma posição lucrativa cobre TODAS as perdas de uma posição perdedora, ou seja, para que o lucro de uma ordem seja igual ou maior do que a perda da outra.
if(Mas_Tip[1]>0)
{
if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))
{
Profit=AccountBalance()-StartProfit;
Askt=NormalizeDouble(Ask,Digits);
Bidt=NormalizeDouble(Bid,Digits);
for(int i=1; i<=OrdersTotal(); i++)
{
if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL &&
OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(Razn<2)
{
if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие
{
double profit=OrderProfit();
Print("закрываю по перекрытию");
ClosePosBySelect(OrderLots());
for(int f=OrdersTotal()-1;f>=0;f--)
{
if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY &&
OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()<0)
{
if(profit>=MathAbs(OrderProfit()))
{
Print("закрываю по перекрытию");
ClosePosBySelect(OrderLots());
}
Amigos, olá. Preciso de alguma ajuda de um novato.
Quero ser notificado por e-mail sobre o cruzamento de algum indicador por preço. Eu entendi como fazer isso, mas assim que a traição de preços acontece, recebo centenas de e-mails, e eles continuam enviando indefinidamente até que a vela atual se feche. O que fazer para enviar apenas uma mensagem? Aqui está um exemplo:
if((iSAR(NULL, 0,Passo,Máximo, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Passo,Máximo, 2)>iClose(NULL,0,2))){
bool res = SendMail("Buy Signal", "Sinal de Compra", "Buy Signal");
}
if((iSAR(NULL, 0,Passo,Máximo, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Passo,Máximo, 2)<iClose(NULL,0,2))){
SendMail("Sell Signal", "Sell Signal", "Sell Signal");
}
Amigos, olá. Preciso de alguma ajuda de um novato.
Quero ser notificado por e-mail sobre o cruzamento de algum indicador por preço. Entendi como fazer isso, mas assim que a travessia é feita, recebo centenas de e-mails, e eles continuam a enviá-la indefinidamente até que a vela atual feche. O que fazer para enviar apenas uma mensagem? Aqui está um exemplo:
if((iSAR(NULL, 0,Passo,Máximo, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Passo,Máximo, 2)>iClose(NULL,0,2))){
bool res = SendMail("Buy Signal", "Sinal de Compra", "Buy Signal");
}
if((iSAR(NULL, 0,Passo,Máximo, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Passo,Máximo, 2)<iClose(NULL,0,2))){
SendMail("Sell Signal", "Sell Signal", "Sell Signal");
}
É simples com parabólico, colocar uma bandeira no estado. Ou uma variável simples do tipo int e o valor muda com cada sinal.
Bom dia a todos, poderiam me ajudar com o Trailing Stop. Escrevi um Trailing Stop com a condição de que eu tenha inicialmente SL = 100 e o Trailing Stop deve ser acionado quando o preço estiver 30 pips acima da abertura da posição. Mas ele se modifica imediatamente após a abertura da posição e muda o SL padrão para 30 e depois o move.
nulo Trailing()
{
int SLoss = 1;
duplo StopL = NormalizeDuplo (OrderOpenPrice() + SLoss*Point, Dígitos);
duplo StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Dígitos);
para (int i=OrdensTotal() - 1; i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
se (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)
{
if (Bid - StopL > TrailingStop*Point)
{
if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Ponto)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digitos), 0, 0))
Imprimir("Erro de modificação do pedido!");
}
}
}
if (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)
{
se (StopL2 - Pergunte > TrailingStop*Point)
{
if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Ponto)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digitos), 0, 0))
Imprimir("Erro de modificação do pedido!");
}
}
}
}
}
}
}
Com parabólico é simples, coloque uma bandeira no estado. Ou uma variável simples do tipo int e o valor muda com cada sinal.
Bom dia a todos, poderiam me ajudar com o Trailing Stop. Escrevi um Trailing Stop com a condição de que eu tenha inicialmente SL = 100 e o Trailing Stop deve ser acionado quando o preço estiver 30 pips acima da abertura da posição. Ele o modificará logo após a abertura da posição e mudará o padrão SL para 30 e depois o moverá.
...Esqueci-me apenas do resto - caso contrário, a variável estática permanece verdadeira após o primeiro sinal
Qual é o objetivo da elza ali dentro? Eu acho que bandeira == verdadeiro; ou bandeira == falso; que está no código
Se houver uma intersecção para um lado, esperamos uma intersecção para o outro. E assim o loop está fechado. Mas como conectá-lo corretamente no início, deixe-o pensar por si mesmo. Ou pergunte-lhe mais tarde...
Qual é o objetivo da elza ali dentro? Eu acho que bandeira == verdadeiro; ou bandeira == falso; que está no código
Quando atravessamos para um lado, esperamos a travessia para o outro lado. ...e assim o ciclo é fechado. Mas como conectá-lo corretamente na primeira partida, deixe-o pensar por si mesmo. Ou pergunte-lhe mais tarde...
Se houver dois sinais em barras diferentes em uma direção?
Você só tem balanço.
Mas os sinais devem sempre ser enviados quando há um sinal, mas a decisão de sinalizar é tomada separadamente.
Parece-me que para cada direção seria ideal ter sua própria bandeira, e trocá-la para frente e para trás. Mas não para que os sinais de uma direção dependam de sinais da direção oposta.
Se os dois sinais estiverem em barras diferentes na mesma direção?
Você só recebe um balanço.
Mas os sinais devem sempre ser enviados quando há um sinal, mas a decisão de sinalizar é tomada separadamente.
Parece-me que para cada direção é ideal ter sua própria bandeira, e mudá-la para frente e para trás. Mas não para que os sinais de uma direção dependam dos sinais da direção oposta.
Artem, eu comecei minha resposta a você com as seguintes palavras
Este é o fórum para o comércio, sistemas automatizados de comércio e testes de estratégias comerciais.
Qualquer pergunta de iniciantes sobre MQL4, ajuda e discussão sobre algoritmos e códigos
Alexey Viktorov, 2017.05.29 08:09
Com parabólico é simples,
O parabólico tem uma alternância estrita, dois sinais em uma direção são impossíveis mesmo em barras diferentes. E não há necessidade de inventar nada para isso, nem mesmo em barras zero como a MA.