Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 713

 
7Konstantin7:

Grazie, non posso farlo, ho solo pensato che forse qualcuno potrebbe scarabocchiare qualche riga in quella funzione o potrebbe far cadere un gufo, la versione finale. Non credo che sia difficile, ma è improbabile che qualcuno ci aiuti.

Ci sono 4 crediti sul sito mql5 potrebbe dare) se è possibile trasferire tra i partecipanti.

1. Trovare la prima posizione aperta possibile nel ciclo e restituire il suo biglietto?

 
artmedia70:

1. Puoi trovare la prima posizione aperta nel ciclo e restituirla al biglietto?

Non riesco a immaginare come sarebbe nel codice), ma in qualche modo sono stato in grado di aggiungere all'EA la rimozione degli ordini pendenti, non sono bravo nel codice, solo un po'.
 
7Konstantin7:
Non posso immaginare come sarà nel codice) ma per qualche miracolo sono riuscito ad aggiungere la rimozione degli ordini pendenti all'EA, non sono bravo con i codici, solo un po'.

Basta prenderlo e vedere come si chiude in un ciclo

1:

int i, total = OrdersTotal(); bool rez;

for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}

2:

//Всё тоже самое только поменяй направление цикла
for(i = 0; i < total; i++)
Allora capirete in quale ordine gli ordini vengono chiusi. Non posso dirlo con certezza perché non ho controllato. Non ne ho bisogno. Ma questa è un'altra questione, è stata discussa qui più di una volta e non voglio ripeterla di nuovo.
 
AlexeyVik:

Basta prenderlo e vedere come si chiude in un ciclo

1:

2:

allora saprete in quale ordine si chiudono gli ordini. Non posso dirlo, perché non ho controllato. Non ne ho bisogno. Ma questo è un altro argomento, è stato discusso qui molte volte e non voglio ripetere tutto.
Il problema è già stato risolto in privato...
 
artmedia70:
Abbiamo già risolto in privato...
Beh, io non leggo i vostri privati... Non so cosa stia succedendo.
 
AlexeyVik:
Beh, non leggo i tuoi messaggi privati... e non so cosa stia succedendo.
Sì, non legge... Cosa è successo alle mie pantofole? ;)
 
artmedia70:
Sì, non legge... Dove sono finite le mie pantofole?!?!! ;)

Ricorda quello che Ioann Vassilievich ha elencato che ha preso, e Shpak non ha preso... Quindi sono le tue pantofole.


Arrivederci. Vado a letto.

 
AlexeyVik:

Ricordate che Ioann Vassilievich ha elencato ciò che ha preso e non ha preso Shpak... Quindi sono le tue pantofole.


Addio. Vado a letto.

Vado a chiedere agli altri delle pantofole... Buona notte...
 
AlexeyVik:

Basta prenderlo e vedere come si chiude in un ciclo

1:

2:

Allora saprai in che ordine si chiudono gli ordini. Non posso dirlo perché non ho controllato. Non ne ho bisogno. Ma questa è un'altra questione, è stata discussa qui molte volte e non ho voglia di ripeterla tutta.

Grazie, ho già risolto il problema.

artmedia70:

Ho pensato che mi avrebbero mandato al cesso) Grazie per l'aiuto.

 

Ciao a tutti! Ho già fatto una domanda simile a pagina 711, purtroppo nessuno ha risposto, forse ora qualcuno...

Sto affrontando un problema con la chiusura dei contatori su un ordine a cinque cifre. Il fatto è che ho bisogno di chiudere, diciamo, 20 ordini in acquisto e 33 in vendita quando il profitto totale è raggiunto. E voglio chiudere 20 ordini di acquisto e 20 ordini di vendita usando la funzione OrderCloseBy(), e chiudere i rimanenti 13 ordini di vendita usando la funzione OrderClose().

Se abbiamo uno spread fisso a 4 cifre, non avremo alcun problema con la chiusura dello spread e salviamo anche lo spread quando usiamo la funzione OrderCloseBy(). Se abbiamo uno spread a 5 cifre, lo spread è fluttuante ed è per questo che, credo, gli ordini non vengono chiusi quando si raggiunge il profitto totale, e la funzione OrderCloseBy() sostiene nel log. Allo stesso tempo, se lo facciamo funzionare nel tester, tutto si chiude normalmente.

Gli ordini in una direzione, quando il profitto totale viene raggiunto, vengono chiusi senza problemi.

Chi ha incontrato un tale problema e quali sono le opzioni per risolverlo?

Vi darò la funzione per chiudere gli ordini.

Inoltre, la funzione OrderCloseBy() funziona anche su un ordine a cinque cifre.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}