[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 514

 
Jony5Proz:

Olá,

Por favor, tenha esta pergunta sobre a EA:

Tenho uma abertura de pedido em um baloiço, por exemplo, se MA_1 > MA_2 então compramos. Mas quando eu saio do comércio, esta regra é acionada novamente.

Como posso dizer ao EA para abrir uma posição somente se o preço não tiver se afastado mais de 4 barras de MA_2?


Obrigado!

Se algo estiver errado ou errado no lugar, não me chute. Este é meu primeiro post neste enorme fórum.

https://book.mql4.com/ru/samples/expert
 

Obrigado, estou apenas nesse nível de conhecimento. Há o mesmo problema com o roteiro no exemplo. É inconveniente quando se liga o roteiro e ele entra no final da tendência.

Como dizer ao roteiro para acionar somente se houver menos de 4 barras após o cruzamento de duas barras?

 
https://www.mql5.com/ru/code/10773 última vez que tomei banho
 
Jony5Proz:

Obrigado, estou apenas nesse nível de conhecimento. Há o mesmo problema com o roteiro no exemplo. É inconveniente quando se liga o roteiro e ele entra no final da tendência.

Como dizer ao roteiro para acionar somente se houver menos de 4 barras após o cruzamento de duas barras?

O roteiro não entende as palavras. Está em suas mãos - execute o roteiro o mais tardar 4 barras depois de 2 MAs terem sido cruzados.
 

Pessoal, eu já perguntei aqui como fazer um pedido aberto somente quando uma vela nova aparece. Estou usando um cronograma D1.

Decidi colocar pedidos pendentes em certos níveis (buyystop_lvl e selltop_lvl), com base na análise dos castiçais anteriores.

Não importa se as ordens pendentes foram ativadas ou não, se foram ativadas, então as ordens de mercado também devem ser fechadas. Em no máximo 2 pedidos, compra e vende em cima.

Eis o que eu escrevi:

1. Primeiro verifico se as ordens de mercado ou as ordens pendentes estão ativas e, se estiverem, as excluo/encerro.

int total=OrdersTotal();
   if (total!=0 && NewBar()==true){
                 for (int i=0; i<total; i++)
                    {
                     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
                     if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,10);
                     if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,10);
                     if(OrderType()==OP_BUYSTOP)  OrderDelete(OrderTicket());
                     if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
                    }
                }

2. Em seguida, coloco pedidos pendentes por níveis calculados:

if(NewBar() == True && OrdersTotal()==0)
    {
     OrderSend(Symbol(),OP_BUYSTOP ,Lot,buystop_lvl ,10,buystop_SL ,buystop_TP,"Expert buystop\sellstop");
     Sleep(10000);
     OrderSend(Symbol(),OP_SELLSTOP,Lot,sellstop_lvl,10,sellstop_SL,sellstop_TP,"Expert buystop\sellstop");
     
    }

3. Minha função NewBar implementada (NewBar):

//Функция нового бара
bool NewBar()
{
  static datetime lastbar = 0;
  datetime curbar = iTime(Symbol(),1440,0);
  if(lastbar != curbar)
  {
    lastbar = curbar;
    return(true);
  }
  else return(false);
}

Como resultado, quando uma nova vela se abre, os pedidos são colocados e imediatamente apagados. Os pedidos são feitos e imediatamente eliminados.

Quando comentei o código do ponto (1), não consegui que ele abrisse ordens no testador, mas as ordens não abriram, ou seja, as ordens não se tornaram ordens de mercado.

Você pode me dizer qual pode ser o problema?

 

Esta função NewBar() não pode ser usada duas vezes seguidas

Algo como isto é melhor:

bool newBar = NewBar();

// e ainda no texto, substituindo NewBar() por NewBar()

 
Merda, eu ainda não entendo como fazer isso. Preciso do código para apagar e fechar os pedidos apenas no próximo castiçal. Mas também haverá outros para abrir sobre ela. Isto significa que o programa entrará novamente na eliminação. Preciso de uma bandeira, mas meu cérebro já está suando para entender como fazê-lo :)
 
Noterday:
Em geral, você joga fora a NewBar, olha a hora da abertura do último pedido e a compara com a Time[0]. Se for maior, o caso é seu, você pode apagar tudo.
 
trend_lab:
E em geral, você joga fora a NewBar, olha a hora da última abertura do pedido e a compara com a Time[0]. Se for mais do que isso, o caso é seu, você pode apagar tudo.

Sim, acho que vou ter que fazer isso. Obrigado por isso :)
 
Noterday:
Cara, eu ainda não entendo como fazer isso. Preciso que o código com exclusão e fechamento dos pedidos seja acionado somente no próximo castiçal. Mas outros castiçais também devem ser abertos neste aqui. Isto significa que o programa entrará novamente na eliminação. É necessário algum tipo de bandeira, mas meu cérebro já está suando para entender como fazer isso :)

Leia atentamente a função OrderSend(). Ele tem um parâmetro para as ordens pendentes:

expiration - Срок истечения отложенного ордера.

Se você abrir uma ordem pendente no início do dia atual = iTime (Symbol(), PERÍODO_D1, 0), acrescente mais um dia a este horário - 1440 * 60. Se as ordens pendentes não forem acionadas, elas serão apagadas por elas mesmas no início do dia seguinte.

P.S. O fim da barra atual também pode ser controlado através da função iBarShift():

    if (iBarShift (Symbol(), PERIOD_D1, OrderOpenTime()) == 0) return(0);

ou qualquer outro "movimento do corpo" nesta condição, rastreando o OrderTicket() da última ordem.