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

 
a196012a:

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.

Arquivos anexados:
MQL4.zip  2226 kb
 

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");

}

 
ev85:

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.

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

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!");

}

}

}

}

}

}

}

 
Alexey Viktorov:

Com parabólico é simples, coloque uma bandeira no estado. Ou uma variável simples do tipo int e o valor muda com cada sinal.

Basta esquecer o resto - caso contrário, a variável estática permanece verdadeira após o primeiro sinal
 
AlGuru:

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

...
Como isso pode ajudar? Eu coloquei lá um modelo, a partir do qual você pode fazer o que quiser.
 
Artyom Trishkin:
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

if(flag && ****

if(! flag && ****

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

 
Alexey Viktorov:

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.

 
Artyom Trishkin:

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

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.

Razão: