[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 294

 
CreAndr:
Ho una domanda sulla pesca a strascico, chi mi sa dire. Sembra essere lo strascico giusto per raggiungere il pareggio, ma non funziona.

Ecco una ricerca: https://www.mql5.com/ru/forum/131859

Per inserire il codice nel testo, premi il pulsante SRC sopra il campo di inserimento del testo.

 
DhP:

Ecco una ricerca: https://www.mql5.com/ru/forum/131859

Per inserire il codice nel testo, premi il pulsante SRC sopra il campo di inserimento del testo.


Grazie.
 
CreAndr:
Ho una domanda sulla pesca a strascico, chi può dirmelo? Sembra che sia corretta la pesca a strascico fino al pareggio, ma non funziona.


Elenco delle ragioni in ordine decrescente di importanza:

1. Il computer non è acceso

2. Metatrader non è acceso.

3. Lo script sul grafico non è installato

4. Expert Advisors non abilitato

5. Niente da strascicare.

6. Qualcosa nel codice è sbagliato.

 
Roger:


Elencare le ragioni in ordine decrescente di importanza:

1. Il computer non è acceso

2. Metatrader non è acceso.

3. Lo script sul grafico non è installato

4. Expert Advisors non abilitato

5. Niente da strascicare.

6. Qualcosa nel codice è sbagliato.

Ottima risposta, Roger, ma il computer è acceso, così come Metatrader, l'EA è collegato al grafico, gli EA sono abilitati, i trade si aprono e quindi c'è qualcosa da tracciare! Ma cosa c'è di sbagliato nel codice, questa era la domanda.
 
artmedia70:
Utilizzare OrderOpenTime()
Per - perché ne abbiamo bisogno allora?


Quindi, sì, ma per numero d'ordine sono arrivato abbastanza corto, ma con OrderOpenTime non capisco cosa fare, devo mettere il tempo aperto da qualche parte, confrontare con l'ordine successivo nella lista, se il tempo è più lungo, riscrivere la variabile, ecc. Non capisco ancora l'algoritmo.


bool DeleteOrders()
{
   for(int i=0 ; i <=OrdersTotal() ; i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(Symbol()==OrderSymbol())
            {
            if(OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return(true);
               }
            }
         }
      }
return(false);
} 
 
CreAndr:
Ottima risposta, Roger, ma il computer è abilitato, così come MetaTrader, l'EA è attaccato al grafico, gli EA sono abilitati, i trade sono aperti e quindi c'è qualcosa da tracciare! Ma cosa c'è di sbagliato nel codice, questa era la domanda.


All'inizio non c'era nessun codice, l'hai attaccato dopo.

Probabilmente perché hai messo il trailing nella funzione di apertura dell'ordine, cioè le condizioni per aprire un ordine arrivano, l'ordine viene aperto, ma potrebbe non andare oltre.

 
Pyro:

Quindi, sì, ma per numero d'ordine sono arrivato abbastanza corto, ma con OrderOpenTime non capisco cosa fare, devo mettere il tempo aperto da qualche parte, confrontare con l'ordine successivo nella lista, se il tempo è più lungo, riscrivere la variabile, ecc. Non capisco ancora l'algoritmo.


Il numero di serie non è affidabile, nulla è garantito in questa numerazione, solo per il tester. Un paio di pagine prima, avevo scritto del codice per cercare l'ultimo ordine chiuso. È molto semplice, abbiamo guardato il biglietto, poi abbiamo scelto l'ordine o la posizione dal biglietto, e questo è tutto:

  int lastclosetime=-1;
  int lastcloseticket=-1;
  int lastdealtype=0;

  for (int i=0; i<OrdersHistoryTotal(); i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; 
    if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
      if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

  if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
    if (OrderType()==OP_BUY) lastdealtype=1;
    if (OrderType()==OP_SELL) lastdealtype=-1;   
  }
 
Figar0:


Il numero d'ordine è inaffidabile, nessuno garantisce nulla in questa numerazione, solo per il tester. Un paio di pagine prima ho scritto del codice per trovare l'ultimo ordine chiuso, lo stesso per quelli aperti. Tutto è semplice, ci siamo passati attraverso, abbiamo ricordato il biglietto, poi abbiamo scelto un ordine o una posizione in base al biglietto, e questo è tutto:

Grazie, è davvero semplice. Ci darò un'occhiata.
 
Roger:


All'inizio non c'era nessun codice, l'avete aggiunto dopo.

Probabilmente perché hai messo il trailing nella funzione di apertura dell'ordine, cioè le condizioni per l'apertura dell'ordine si verificano, l'ordine viene aperto, ma potrebbe non andare oltre.

Capisco, grazie.
 
Figar0:


Il numero d'ordine è inaffidabile, nessuno garantisce nulla in questa numerazione, solo per il tester. Un paio di pagine prima ho scritto del codice per trovare l'ultimo ordine chiuso, lo stesso per quelli aperti. È molto semplice, abbiamo guardato il biglietto, poi abbiamo scelto un ordine o una posizione dal biglietto e questo è tutto:

Il codice è sbagliato.

Prima di tutto, ecco questo:

if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 

Se il simbolo dell'ordine è uguale al simbolo dato nella variabile simbolo o la magia dell'ordine è uguale alla magia... Quindi, se un qualsiasi ordine con il simbolo è selezionato e la magia è diversa o mancante, la condizione sarà soddisfatta. Perché o questo o quello. Di conseguenza, dovremmo sostituire o con o, o, meglio, separare i controlli in stringhe separate - il ciclo sarà più veloce, il che è cruciale per l'ottimizzazione.

Inoltre... Pick by ticket: il parametro pool è ignorato, cioè non ha senso scriverlo qui.

if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 

Dopo che l'ordine è stato selezionato con successo dal ticket, dobbiamo controllare da quale lista di ordini è stato selezionato - quelli di mercato o quelli chiusi. Per fare questo, dobbiamo controllare il tempo di chiusura dell'ordine, e se è superiore a zero, allora l'ordine è stato sicuramente chiuso. Questo parametro è sempre uguale a zero per le posizioni aperte. IMHO, dopo che l'ultimo ordine è stato scelto, dovremmo controllare il suo tipo immediatamente e scriverlo nella variabile.

La funzione sarà ora simile a questa:

int   GetTypeLastClosePos(int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int   i, lastclosetime=0, 
         lastdealtype=-1;

   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)          continue;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)      continue;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()>1)                  continue;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();              // ... запишем его как предыдущее
            lastdealtype=OrderType();                    // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
      else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError());  // Посмотрим номер ошибки
         break;                                                // Выходим из цикла перебора ордеров
         }
      }
   return(lastdealtype);
}

Ora, se vogliamo controllare solo Buy o Sell del grafico corrente e quale di essi è stato l'ultimo chiuso, dovremmo chiamare questa funzione in questo modo:

int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else {// ... код обработки ошибки ... }

Per la gestione degli errori possiamo, in linea di principio, creare una variabile globale, ad esempio int err; e nel corpo della funzione stessa memorizzare il numero di errore in questa variabile:

else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err=GetLastError();                                                     // Посмотрим номер ошибки
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break;                                                                  // Выходим из цикла перебора ордеров
         }

Poi per elaborare l'errore dopo aver chiamato la funzione ...

GetTypeLastClosePos(Symbol(), Magic);

... e si verifica un errore, il suo numero sarà memorizzato nella variabile err e nel blocco di elaborazione questo numero sarà elaborato.

else {
   if (err==???) {
      // обработка этой ошибки
      }
   if (err==???) {
      // обработка этой ошибки
      }
// ... и т.д. ...
   }

Meglio ancora, usa l'interruttore

Motivazione: