[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 347

 

Salve, ecco una domanda. Come posso scrivere nel codice per eseguire un'operazione solo su un frattale fisso?

Se il frattale è fisso, è ....

il mio frattale

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. Sì, nessun problema a trovare l'ordine pendente appropriato in questo modo, se il numero di ordini pendenti in ogni direzione è lo stesso. E se è diverso, allora questo non funzionerà, come ho capito.

Quindi determinare il fatto dell'innesco di un ordine pendente e cancellare quello opposto più lontano.

Tutto questo viene fatto solo per un fatto e un ordine pendente in un momento. Non c'è bisogno di creare un numero di attivati e un numero di cancellati, come stai cercando di fare tu. Si coglie il fatto della trasformazione degli ordini pendenti in un tick. Tutti gli altri trigger (se ce ne sono) saranno determinati dal prossimo tick.

 
Può dirmi chi lo sa? Perché il risultato del tester è diverso in un giorno feriale che in un fine settimana? Alpari
 

berezhnuy a causa della diffusione, che è diverse volte più grande nei fine settimana.

 

Cari programmatori, ecco il codice per contare gli ordini di acquisto e di vendita per aprire un solo ordine di acquisto o di vendita:

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)
count++;
}

}
return(count)
}
//+------------------------------------------------------------------+
int CountSell()
{
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_SELL)
count++;
}

}
return(count);
}

E tutto sembra funzionare, ma nel mio EA, ci sono condizioni per comprare e vendere su alcuni modelli di candela usando TP e SL. Ma quando questa condizione è soddisfatta e il TP è attivato, allora alla formazione della candela 0 le condizioni per l'apertura dell'ordine rimangono ancora vere e vengono aperti nuovi ordini, cosa che non dovrebbe essere fatta in quel momento. Potresti dirci quale codice usare per disabilitare ulteriori aperture di ordini? L'EA stesso è allegato.

File:
expert.mq4  4 kb
 
artmedia70:

Quindi determinare il fatto di un ordine pendente innescato e cancellare il più lontano opposto.

Tutto questo viene fatto solo per un fatto e per una volta. Non c'è bisogno di creare un numero di attivati e un numero di cancellati, come stai cercando di fare tu. Si coglie il fatto della trasformazione degli ordini pendenti in un tick. Tutti gli altri trigger (se ce ne sono) saranno determinati dal prossimo tick.



E se ce ne fossero di più per ogni zecca? Se, diciamo, il passo tra gli ordini è molto piccolo, allora può scattare più di un ordine. Naturalmente, non saremo in grado di eseguire le azioni necessarie in tempo.
 
hoz:

E se ne passano di più in una zecca? Se, diciamo, il passo tra gli ordini è molto piccolo, allora più di un ordine può essere attivato. Naturalmente, non saremo in grado di eseguire le azioni richieste in tempo.
Un ciclo sulle posizioni aperte alla ricerca di ordini attivati sulla barra corrente e cancellare gli ordini pendenti nello stesso ciclo
 
artmedia70:
Il ciclo sulle posizioni aperte alla ricerca di ordini attivati sulla barra corrente e la cancellazione delle posizioni nello stesso ciclo.


Bene, questo ciclo sarà ripetuto e tutto sarà cancellato di nuovo. Ho anche una condizione nella variante che ho al momento:

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

Cioè dovrebbe cancellare fino a quandoordersToDelete è zero. Ma distrugge tutto. Sembra elementare, ma succede qualche scandalo. Non c'è assolutamente nulla di questi momenti in un tutorial senza valore. Ho già provato in entrambi i modi e l'ho riscritto in modi diversi, non ha funzionato come avrei dovuto.

 

Riscritto in modo diverso:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
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, anche alla ricerca dello stesso modo. Ha trovato un ordine con un prezzo di apertura minimo, ha definito la sua posizione e ha selezionato questo ordine, ha definito il suo ticket e lo ha cancellato. Ma non viene cancellato.

 
Perché non si ricorda il ticket dell'ordine e non la sua posizione. e cosa succede in un trasferimento diretto se non c'è un ordine simile? si cancella l'ordine zero?
Motivazione: