[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
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Perché chiedere un consiglio e poi contestarlo? È questa la corrente principale?
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);
}
}
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.
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?
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?
Questo è tutto. O hai un mucchio di ordini su un prezzo?
Questo è tutto. O avete un pacchetto di ordini a un prezzo?
No, ordini a scaglioni...
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?
C'è un errore dove ho segnato in rosso? Come risolverlo?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
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.