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

 

È una domanda semplice, ma non mi viene in mente niente.

Ci sono 4 posizioni aperte in un determinato momento. Sto cercando di chiuderli tutti nel seguente modo:

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

Ma sono chiusi non tutti, ma attraverso uno. Infatti hanno i seguenti numeri: 2,4,6,7. Quindi la 2a e la 6a posizione sono chiuse.

Qual è il trucco?

 
usver:

È una domanda semplice, ma non mi viene in mente niente.

Ci sono 4 posizioni aperte in un determinato momento. Sto cercando di chiuderli tutti nel seguente modo:

Ma sono chiusi non tutti, ma attraverso uno. Infatti hanno i seguenti numeri: 2,4,6,7. Quindi la 2a e la 6a posizione sono chiuse.

Qual è la fregatura?


Il trucco è che dopo che la posizione è chiusa, la numerazione cambia in OrderSelect(i,SELECT_BY_POS,MODE_TRADES) e contemporaneamente non tutti possono essere chiusi

HH: Sono stato molto aiutato da fts I. Kim, ho cambiato un po' - rimosso le parentesi extra e tirato in una riga:

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

cerca nel forum - troverai gli originali

 
IgorM:


è che dopo aver chiuso una posizione, la numerazione cambia in OrderSelect(i,SELECT_BY_POS,MODE_TRADES) e tutti non possono essere chiusi simultaneamente

SZY: Sono stato molto aiutato da fts I. Kim, ho cambiato un po' - rimosso le parentesi extra e tirato dentro una linea:

cerca nel forum - troverai l'originale


Grazie per il suggerimento e l'esempio. Ci darò un'occhiata.

Lungo la strada farò un'altra domanda.

Il compito è il seguente: ho bisogno di determinare quale tipo di ordine attivato da uno stop loss è stato chiuso, e di confrontare un ordine futuro chiuso da uno stop loss con uno precedente (cioè confrontare i loro tipi). Avendo cercato nella documentazione, non ho trovato nulla relativo all'elaborazione dell'ultimo evento.

A questo punto, ho implementato questa operazione come una chiusura di un ordine quando raggiunge un limite stabilito (Bid-OrderOpenPrice() >=TP*Point). Questo mi ha permesso di memorizzare in una variabile il tipo dell'ultimo ordine chiuso e confrontarlo con quello appena chiuso ( if(type==OrderType()) ). Tutto funziona bene durante i test, ma vorrei implementarlo utilizzando gli stop-loss.

Ho provato a selezionare un ordine chiuso dalla storia usando OrderSelect() e l'argomento MODE_HISTORY. Dato che non ci sono condizioni per chiudere gli ordini, allora un cambiamento nella variabile OrdersTotal() può essere considerato come un trigger di uno stop loss. Ma mi sono imbattuto in un problema: non riesco a trovare il numero dell'ultimo ordine chiuso (poiché il loro numero cambia costantemente), o semplicemente non ho capito come farlo.

La domanda è: come implementarlo usando gli stop-loss? Forse ci sono modi molto più semplici? Bene, se la direzione del pensiero è corretta, allora come facciamo a trovare l'ultimo ordine chiuso?

 
IgorM:


la numerazione viene cambiata in OrderSelect(i,SELECT_BY_POS,MODE_TRADES) dopo aver chiuso una posizione e tutte le posizioni non possono essere chiuse simultaneamente

SZS: Sono stato molto aiutato dalle funzioni di I. Kim, le ho cambiate un po' - ho tolto le parentesi extra e le ho tirate in una sola riga:

cerca nel forum - troverai l'originale

Hai detto abbastanza... tutti in una pila.
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

È una domanda semplice, ma non mi viene in mente niente.

Ci sono 4 posizioni aperte in un determinato momento. Sto cercando di chiuderli tutti nel seguente modo:

Ma sono chiusi non tutti, ma attraverso uno. Infatti hanno i seguenti numeri: 2,4,6,7. Quindi la 2a e la 6a posizione sono chiuse.

Qual è il problema?

Stai parlando di numeri in ordine, o di biglietti?

 
abolk:

Stai parlando di numeri in ordine, o di biglietti?


Io stesso sono già confuso. Sono biglietti, ma li ho dati per chiarire la situazione. Si chiudono uno ad uno.
 

Urrà, l'ho fatto funzionare!!!


Victor grazie mille, ho avuto un errore, non ho scritto correttamente il nome dell'indicatore.

 
abolk:
Quello che hai appena detto... tutto in una pila
https://docs.mql4.com/ru/trading/OrderSelect


Provate a cambiare/rimuovere takeaway o stop in un gruppo di ordini - il compito è semplice, ma ho riscontrato che, quando la selezione dell'ordine è stata fatta utilizzando OrderSelect(i,SELECT_BY_POS,MODE_TRADES), la numerazione dell'ordine è cambiata proprio nel corpo del ciclo e sono riuscito a modificare un ordine già modificato (senza takeaway) diverse volte - errore #1, motivo per cui ho suggerito che wever ha avuto un problema simile

Per favore, consigliate - come far ricalcolare l'indicatore alla chiusura di diverse barre, per esempio: voglio che l'indicatore sia ricalcolato ogni 5 nuove barre

 
IgorM:


Per favore consigliate - come far ricalcolare un indicatore alla chiusura di diverse barre, per esempio: voglio che l'indicatore sia ricalcolato ogni 5 nuove barre

Lei conosce la programmazione.

Questo è un compito logico e non bisogna essere molto intelligenti per risolverlo. Pensa con la tua testa.

Ci sono diversi casi. Dove esattamente dovrebbe essere ri-risciacquata, su quale TF, come dovrebbe avvenire la ri-risciacquatura, ecc. Come rispondere alla sua domanda.

Annotate il tempo della barra e dopo cinque barre azzerate questo tempo e annotatelo di nuovo. Al momento dell'azzeramento si può mettere una condizione per ricalcolare. La funzione iTime(NULL,0,0) vi aiuterà. Il resto è tutta logica.

 
IgorM:


Per favore consigliate - come far ricalcolare un indicatore alla chiusura di diverse barre, per esempio: voglio che l'indicatore sia ricalcolato ogni 5 nuove barre


Il metodo non è il più affidabile, probabilmente, ma funzionerà solo per provare l'idea (per esempio, una bozza).

Usate la variabile Bars e tenete traccia del suo cambiamento. Aumentato di 5, ricordato, ecc.