Domanda per gli intenditori - pagina 13

 

Sì, - credo di sì! Grazie, TheXpert!

Ci proverò!

 
Cari esperti, per favore aiutatemi a capire la funzione OrderCloseBy(). Sono totalmente confuso. Ho un Expert Advisor, che apre e chiude le posizioni in base a condizioni invertite. Cioè, le condizioni OPEN BUY e CLOSE SELL sono le stesse, così come OPEN SELL e CLOSE BUY, il che significa che subito dopo l'uscita da una posizione allo stesso prezzo, si apre una posizione nella direzione opposta con la stessa dimensione. Così ho deciso di provare a sostituire OrderClose() aprendo una posizione nella direzione opposta con doppio volume e poi chiudendo gli ordini opposti con OrderCloseBy(). Cioè, lo stesso algoritmo avrebbe dovuto essere applicato ma avrebbe risparmiato uno spread per trade, ma il tester ha mostrato un risultato ben diverso. Non riesco a decidere se ho scritto male il codice o se ho frainteso l'idea... Vi sarei molto grato per un chiarimento...
 
Prima di tutto, controllate con il supporto tecnico della vostra società di intermediazione se questa funzione è supportata dal terminale. Non tutte le case di intermediazione permettono la funzione OrderCloseBy().
 
Nella demo OrderCloseBy() è supportato.
 

Non sono un esperto. Ho questa nota su questa funzione nella mia cartella "help", oltre a tutto ciò che è "normale" (l'ho copiata anche qui - non ricordo quale ramo) -

E la funzione OrderCloseBy è usata SOLO per chiudere 2 ordini simultaneamente, a quello spread è salvato.
Dovremmo camminare attraverso il terminale programmaticamente, memorizzare tutti i numeri di ordine aperti e le loro caratteristiche, selezionare il numero di ordine principale, abbinarlo con il desiderato (da disponibile) ordine contatore e incollare quel numero.


// Cioè, da quanto ho capito, con questa funzione si possono chiudere solo due posizioni di contatori, preselezionate.

Non c'è altro da dire.

 

Sì, beh...

Ecco perché si chiama così.

 

Permettetemi di riformulare la domanda se c'è qualche differenza economica nelle seguenti due possibilità di inversione di posizione:

1) Chiudere SELL con 1 lotto di volume usando la funzione OrderClose e poi aprire BUY con 1 lotto di volume

2) Mentre SELL è aperto in 1 lotto, prima aprite BUY in 2 lotti e poi chiudete SELL con la funzione OrderCloseBy, che lascerà anche una posizione BUY aperta in 1 lotto.

Secondo l'esempio nella cartella di lavoro, uno spread rimarrà nella variante 2).

 
In breve, lo spread 1+1 sarà compensato e l'1 rimanente sarà il normale spread di trading.
 
https://book.mql4.com/ru/trading/orderclose - ecco una descrizione della funzione OrderCloseBy(). Ho provato a fare lo stesso con la demo - riduce davvero di molto lo spread. Ma ancora non funziona su Expert Advisor... Sono così confuso...
 
Dmirtiy писал(а) >>
https://book.mql4.com/ru/trading/orderclose - qui potete vedere come funziona la funzione OrderCloseBy(). Ho provato a fare lo stesso su demo - ha davvero una diffusione minore. Ma ancora non funziona su Expert Advisor... Sono davvero confuso...

Sei stato in due thread con questa domanda. Sei curioso.

Non ci sono soluzioni semplici. Con il rilascio di MQL5 questo problema scomparirà completamente.

Posso suggerire un paio di procedure che uso nei miei EA.

//Rileva lo stato attuale degli ordini aperti:

void CheckOrders()
{
int i;
BuyOrder = false;
SellOrder = false;
BuyLots = 0.0;
SellLots = 0.0;

for ( i=0; i < OrdiniTotali(); i++)
{
OrderSelect(i, SELECT_BY_POS);
se ( OrderSymbol() == Symbol())
{
se ( OrderType() == OP_BUY )
{
BuyOrder = true;
LastBuyLots = OrderLots();
BuyLots += LastBuyLots; // somma delle posizioni Buy aperte
BuyTicket = OrderTicket();
}
se ( OrderType() == OP_SELL)
{
SellOrder = true;
LastSellLots = OrderLots();
SellLots += LastSellLots; // somma delle posizioni di vendita aperte
SellTicket = OrderTicket();
}
}
}
}

/Ordini di apertura (chiusura):

void TradeVariant( int variant )
{
interruttore ( variante )
{
// if (Pattern < 0 && !BuyOrder && !SellOrder && !FridayLastHour) variant = 1;
// segnale di vendere, nessun ordine è aperto e non è l'ultima ora di venerdì
// aprire un ordine di vendita
caso 1:
OpenSellOrder(Lots);
pausa;

// if (Pattern < 0 && BuyOrder && !SellOrder && !FridayLastHour) variant = 2;
// segnale di vendere, c'è un ordine di acquisto aperto, nessun ordine di vendita
// non è l'ultima ora del venerdì - stiamo girando
caso 2:
OpenSellOrder(Lots + BuyLots);
pausa;

// if (Pattern < 0 && BuyOrder && !SellOrder && FridayLastHour) variant = 3;
// segnale di vendere, c'è un ordine di acquisto aperto, nessun ordine di vendita
// è l'ultima ora del venerdì - chiudere l'ordine di acquisto
caso 3:
Chiudere gli ordini di acquisto();
pausa;

// if (Pattern > 0 && !SellOrder && !BuyOrder && !FridayLastHour) variant = 4;
// segnale di comprare, nessun ordine è aperto e non è l'ultima ora del venerdì
// aprire ordine di acquisto
caso 4:
OpenBuyOrder(Lots);
pausa;

// if (Pattern > 0 && SellOrder && !BuyOrder && !FridayLastHour) variant = 5;
// segnale di acquisto, c'è un ordine di vendita aperto, nessun ordine di acquisto
// non è l'ultima ora del venerdì - stiamo girando
caso 5:
OpenBuyOrder(Lots + SellLots);
pausa;

// if (Pattern > 0 && SellOrder && !BuyOrder && FridayLastHour) variant = 6;
// segnale di acquisto, c'è un ordine di vendita aperto, nessun ordine di acquisto
// è l'ultima ora del venerdì - chiudi l'ordine Sell
caso 6:
Chiudere gli ordini di vendita();
pausa;

caso 7:
// se (SellOrder && BuyOrder) variant = 7;
// hanno un ordine incrociato aperto
if (WaitBeforeTransaction(WaitSeconds) == 1) // pausa tra le richieste
{
if (LastBuyLots <= LastSellLots)
OrderCloseBy( BuyTicket, SellTicket);
else
OrderCloseBy( SellTicket, BuyTicket);
}
break

// in altre varianti non fare nulla
default:
pausa;
}
}

Spero che riuscirete a gestire le variabili.

>> Buona fortuna!