[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 346

 
hoz Vadim, perché ricreare l'oggetto quando puoi usare ObjectSet()?

Perché chiedere un consiglio e poi contestarlo? È questa la corrente principale?
 
FAQ:

Penso che non abbia senso discutere ulteriormente. Ho spiegato tutto in dettaglio passo dopo passo. continuate a fare quello che avete fatto.

Che tipo di discussione può esserci? Dovremmo chiudere l'ordine con la massima deviazione di prezzo. Il che significa che siamo interessati al prezzo... Cioè dovremmo trovare un ordine pendente estremo (con il prezzo massimo o minimo aperto). Se non siete d'accordo, potete discutere. Altrimenti ho ragione, dopo tutto! So esattamente quello che dico.
 

Il codice cancella ST e TP. Aggiungo una condizione per la cancellazione selettiva

Cosa non è scritto correttamente? Continua a cancellare tutto :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

O non c'è altra soluzione e bisogna scrivere il codice di cancellazione per ogni condizione?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim, perché creare nuovamente l'oggetto quando puoi usare ObjectSet()?

In quel caso, c'era una funzione in cui l'oggetto grafico era completamente creato e configurato. In esso, la funzione di creazione è ottimizzata. Se l'oggetto esiste già, non viene creato. Controllate voi stessi. Misura il tempo per creare gli oggetti, poi per cambiare le proprietà. La seconda chiamata sarà molto più breve. Cioè niente viene ricreato.

Come risultato, abbiamo una funzione universale che non solo crea un oggetto, ma può anche personalizzarlo cambiandone le proprietà senza molto tempo.

 
Potete suggerire uno script per un EA per determinare la tendenza del mercato?
 

Ho scritto una funzione che cancelleràgli ordini di vendita con i prezzi più bassi. Ilnumero di ordini short da chiudere è uguale alnumero di ordini di acquisto che si sono attivati, cioè sono diventati ordini a mercato.

Quindi se un ordine di acquisto è scattato, allora chiudiamo un ordine di vendita, se 2 ordini di acquisto sono scattati, allora chiudiamo 2 ordini di vendita.

Ecco il codice:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   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;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

amountOfCurrPending - quantità di ordini di acquisto in sospeso.

Livello- numero di ordini pendenti inviati inizialmente a ciascun lato.

OOP- prezzo aperto dell'ordine pendente, ho preso qualsiasi valore irraggiungibile.

La nostra condizione è la seguente: se il contatore è inferiore aordersToDelete, cancelliamo l'ordine pendente con il prezzo più basso. Ma tutte le posizioni corte vengono cancellate. Cosa c'è di sbagliato in me?

 
hoz:

Ho scritto una funzione che cancelleràgli ordini di vendita con i prezzi più bassi. Ilnumero di ordini short da chiudere è uguale alnumero di ordini di acquisto che si sono attivati, cioè sono diventati ordini a mercato.

Quindi se un ordine di acquisto è scattato, allora chiudiamo un ordine di vendita, se 2 ordini di acquisto sono scattati, allora chiudiamo 2 ordini di vendita.

Ecco il codice:

amountOfCurrPending - quantità di ordini di acquisto in sospeso.

Livello- numero di ordini pendenti inviati inizialmente a ciascun lato.

OOP- prezzo aperto dell'ordine pendente, ho preso qualsiasi valore irraggiungibile.

La nostra condizione è la seguente: se il contatore è inferiore aordersToDelete, cancelliamo l'ordine pendente con il prezzo più basso. Ma tutte le posizioni corte vengono cancellate. Cosa c'è di sbagliato in me?

Non capisco la vostra logica. Perché no: l'ordine è stato trasformato in una posizione di mercato - l'ordine pendente opposto più lontano è stato cancellato.
Questo è tutto. O hai un mucchio di ordini su un prezzo?
 
artmedia70:

Questo è tutto. O avete un pacchetto di ordini a un prezzo?


No, ordini a scaglioni...
artmedia70:
Non capisco la tua logica... Perché no: l'ordine è stato convertito in una posizione di mercato - l'ordine pendente opposto più lontano è stato rimosso.

È così che cancello la posizione opposta più lontana, cioè, dato che è una posizione corta, significa la posizione con il prezzo di apertura più basso. Qui ho riscritto la funzione, tutto dovrebbe essere chiaro. Ho eliminato le stampe e rimosso una variabile extra.

La variabileamountOfCurrPending trasferisce il numero di compravendite rimanenti in acquisto. Cioè, se l'importo iniziale è il livello eamountOfCurrPending è l'importo attuale degli ordini, allora sottraendo l'importo iniziale degli ordini da quello attuale, otterremo la differenza e questo è l'importo necessario per eliminare gli short. Vedi?

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

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   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;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
C'è un errore dove ho segnato in rosso? Come risolverlo?
 
hoz:

No, ordini a scaglioni.

Questo è il modo in cui rimuovo la posizione più lontana, cioè, dato che è una posizione corta, significa la posizione con il prezzo di apertura più basso. Qui ho riscritto la funzione, dovrebbe essere chiaro. Ho eliminato le stampe e rimosso una variabile extra.

La variabileamountOfCurrPending trasferisce il numero di compravendite rimanenti in acquisto. Cioè, se l'importo iniziale è il livello eamountOfCurrPending è l'importo attuale degli ordini, allora sottraendo l'importo iniziale degli ordini da quello attuale, otterremo la differenza e questo è l'importo necessario per eliminare gli short. Vedi?

C'è un errore dove ho segnato in rosso? Come risolverlo meglio?
 Ищется ордер, с минимальной ценой открытия

Specificherei nel commento di un ordine pendente il suo numero d'ordine nella griglia e scriverei lo stesso numero nel corrispondente ordine pendente opposto. Quindi, quando si trova una posizione di mercato, dopo aver letto il numero nel suo commento, si può trovare la corrispondente posizione opposta con un numero identico nel suo commento. Dal momento che i magiks sono usati per qualcos'altro.

ZS. Non ho ancora il tempo di leggere/parsare il tuo codice

 
artmedia70:

Scriverei nel commento della posizione pendente il suo numero di sequenza nella griglia e scriverei lo stesso numero nella corrispondente posizione pendente opposta. Quindi, quando si trova una posizione di mercato, dopo aver letto il numero nel suo commento, la corrispondente posizione pendente opposta può essere trovata senza problemi con un numero identico nel suo commento. Dal momento che si usano i maghi per qualcos'altro.

ZS. Non ho ancora il tempo di leggere/parsare il tuo codice



Hmm. Sì, nessun problema a trovare l'ordine pendente corrispondente in questo modo, se il numero di ordini pendenti in ogni direzione è lo stesso. E se è diverso, allora questo non funzionerà, come ho capito.