[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 347

 

Olá, aqui vai uma pergunta. Como posso escrever no código para realizar uma operação apenas em um fractal fixo?

Se o fractal é fixo, é ....

meu fractal

int start()
  {
//----
    double CenBuy = High[isFractalUp()];
     double CenSell = Low[isFractalDn()];

   return(0);
}

int isFractalUp()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
 }
 return(-1);
}
 
int isFractalDn()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
 }
 return(-1);
}
 
hoz:

Hmm. Sim, não há problema em encontrar a ordem pendente apropriada desta maneira, se o número de ordens pendentes em cada direção for o mesmo. E se diferente, então isto não funcionará como eu entendo.

Em seguida, determinar o fato de acionar uma ordem pendente e apagar a ordem oposta mais distante.

Tudo isso é feito apenas para um fato e uma ordem pendente em um momento no tempo. Não há necessidade de criar um número de acionados e um número de apagados, como você está tentando fazer. Você vai perceber o fato da transformação das ordens pendentes em um só tique. Todos os outros gatilhos (se houver algum) serão determinados pelo próximo tick.

 
Você pode me dizer quem sabe? Por que o resultado do testador é diferente em um dia de semana do que em um fim de semana? Alpari
 

berezhnuy por causa da propagação, que é várias vezes maior nos fins de semana.

 

Caros programadores, aqui está o código para contar as ordens de compra e venda para abrir apenas uma ordem de compra ou venda:

int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
contagem++;
}

}
return(count)
}
//+
+
int CountSell()
{ int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; tradee--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
contagem++;
}

}
return(count);
}

E tudo parece funcionar, mas no meu EA, há condições para comprar e vender em alguns padrões de castiçais usando TP e SL. Mas quando esta condição é cumprida e TP é acionado, então com a formação da vela 0, as condições para abertura do pedido ainda permanecem verdadeiras e novas ordens são abertas, o que não deve ser feito naquele momento. Você poderia nos dizer qual o código a ser usado para desativar a abertura de novos pedidos? A própria EA está anexada.

Arquivos anexados:
expert.mq4  4 kb
 
artmedia70:

Em seguida, determinar o fato de uma ordem pendente acionada e apagar a ordem oposta mais distante.

Tudo isso é feito apenas por um fato e por uma vez. Não há necessidade de criar um número de acionados e um número de apagados, como você está tentando fazer. Você vai perceber o fato da transformação das ordens pendentes em um só tique. Todos os outros gatilhos (se houver algum) serão determinados pelo próximo tick.



E se houver mais do que isso por carrapato? Se, digamos, o passo entre as ordens é muito pequeno, então mais de uma ordem pode acionar. Naturalmente, não poderemos realizar as ações necessárias em tempo hábil.
 
hoz:

E se mais passar em um carrapato? Se, digamos, o passo entre as ordens for muito pequeno, então mais de uma ordem pode ser acionada. É claro que não seremos capazes de realizar as ações necessárias em tempo hábil.
Um loop em posições abertas em busca de ordens acionadas na barra atual e excluir as ordens pendentes no mesmo loop
 
artmedia70:
O loop em posições abertas em busca de ordens acionadas na barra atual e a eliminação de posições no mesmo loop.


Bem, este loop será repetido e tudo será apagado novamente. Também tenho uma condição na variante que tenho no momento:

 while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }

Isto é, deve apagar até queas ordensToDelete sejam zero. Mas isso destrói tudo. Parece ser elementar, mas acontece algum ultraje. Não há nada em tais momentos em um tutorial sem valor. Eu tentei de ambas as maneiras e o reescrevi de maneiras diferentes, não funcionou como eu deveria.

 

Re-escrito de forma diferente:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = -1,                                 // Тикет искомого ордера
       np = -1;                                       // Номер позиции искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                 // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);               // Если ничего удалять не нужно, выйдем из функции

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          np = i;
      }
   }
   if (OrderSelect(np,SELECT_BY_POS))
   {
      s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      OrderDelete(s_ticket,Black);
   }
   
   return (0);
}

Kim, também procurando o mesmo caminho. Encontrou um pedido com um preço mínimo de abertura, definiu sua posição e selecionou este pedido, definiu seu bilhete e o eliminou. Mas não é apagado.

 
Por que você não se lembra do bilhete da ordem e não de sua posição. e o que acontece em uma transferência direta se não houver tal ordem? você vai apagar a ordem zero?