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

 
Sergstuddek:


(La classe è buona, ma c'è ancora un problema))

Lo capisco teoricamente, ma in pratica non funziona, potete guardare il mio codice e dirmi cosa c'è di sbagliato

Capisco che questo è un EA molto semplice, ma sto appena iniziando il mio viaggio)))) e ho già un problema

// L'essenza dell'Expert Advisor è che prima apre il primo ordine di acquisto
// poi mette gli stop in due direzioni
// in un lato come continuazione di un ordine aperto
// dall'altra parte altre due volte in caso di inversione del grafico
// gli stop sono posizionati in relazione all'ultimo ordine aperto dal consulente
// ad ogni nuova apertura di un nuovo ordine pendente, tutti i precedenti vengono cancellati
// e i nuovi stop in sospeso sono già aperti rispetto a un nuovo ordine aperto.


Gli stop possono essere intesi come due cose - ordini di stop (Take Profit e Stop Loss) e ordini di stop (Bystop e Sell Stop). Ciò che si intende per "fermate" qui è probabilmente compreso solo da voi. Si prega di essere precisi con i termini. Devi dare istruzioni precise al computer. La descrizione deve anche essere il più precisa possibile
 
drknn:
Gli stop possono essere intesi come due cose: ordini di stop (Take Profit e Stop Loss) e ordini di stop (Bystop e Sell Stop). Ciò che si intende per "fermate" qui è probabilmente compreso solo da voi. Si prega di essere precisi con i termini. Bisogna dare istruzioni precise al computer. La descrizione deve anche essere il più precisa possibile

Mi dispiace per l'imprecisione, ma gli ordini stop sono ordini stop (Buy Stop e Sell Stop)
 
Sergstuddek:

Mi scuso per l'imprecisione: intendo ordini di stop (Buy Stop e Sell Stop).
void DeleteStopOrders()
{
  int res;
  for(int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
     }
  }
}


Questa funzione è scritta in modo errato. Gli ordini devono essere cercati dall'ultimo al primo nella lista degli ordini. Il tuo metodo farà saltare 1 ordine perché dopo la sua cancellazione la lista degli ordini si sposterà per le sue posizioni. Il ciclo dovrebbe essere organizzato come segue:

for (int i=OrdersTotal()-1;i>=0;i--){

Inoltre, se l'ordine non è selezionato, non hai bisogno di fare un brek - non hai bisogno di uscire dal ciclo - hai bisogno di scoprire il motivo per cui l'ordine non è selezionato. Questo è il seguente:

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
  Print("При выборе ордера № ",i," произошла ошибка № ",GetLastError());

res=OrderDelete(OrderTicket()); - anche questo non è abbastanza corretto. La funzione OrderDelete() ha un tipo booleano. E oltre a dare l'ordine di cancellare l'ordine, dobbiamo anche gestire la situazione se l'ordine non può essere cancellato. In altre parole, va così:

res=OrderDelete(OrderTicket());
if(!res){
  Print("Ордер № ",OrderTicket()," удалить не получилось - ошибка № ",GetLastError());
}

Guarderò il resto più tardi.

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (CalculateCurrentOrders1(Symbol())==0)
   OpenBuy();
  if (CalculateCurrentOrders2(Symbol())<=1)
  DeleteStopOrders();
  if (CalculateCurrentOrders2(Symbol())<=1)
   OpenStops();
//----
   return(0);
}

Il codice della funzione di avvio non è scritto correttamente.

Con la prima funzione si sommano gli ordini di acquisto e di vendita. Devi contare gli ordini di acquisto separatamente e gli ordini di vendita separatamente. Ecco il punto. Se c'è 1 ordine di acquisto nel mercato, allora il buy stop dovrebbe essere impostato con un lotto più grande. Giusto? E se c'è un ordine di vendita nel mercato, allora il buystop dovrebbe essere impostato con un lotto normale e il sell stop con uno più grande. Quindi come si fa a rilevare quale ordine è aperto nel mercato se si sommano entrambi gli ordini di acquisto e vendita in una funzione? Provate a rifare il codice alla luce di questi fatti.

 

Potete dirmi come scaricare automaticamente la cronologia dal broker? È un po' scomodo premere a casa per un'ora.

 
_dude_:

Potete dirmi come scaricare automaticamente la cronologia dal broker? È un po' scomodo premere a casa per un'ora.

Vadim Junko se ne è occupato per te. Script per caricare la storia. Ce ne sono alcuni altri nella base (sezione Scripts).
 
gince:

Domanda sull'indicatore.

L'indicatore è un indicatore a croce. Attira molte frecce da una parte, poi molte dall'altra. Come rendere solo i primi ad essere disegnati. Ho provato nel modo descritto nel codice, ma le frecce cambiano quando cambio Frames.

Per favore, consigliatemi come farlo correttamente.


Dovrei guardare l'indicatore. Forse c'è una soluzione
 
nemo811:
Per favore aiutatemi a correggere il mio Expert Advisor. È necessario farlo funzionare con gli ordini (propri e aperti dall'utente) della coppia di valute sul grafico in cui è installato. Intendiamo il momento della fissazione del profitto o della perdita. Nella versione attuale, quando si verifica una condizione (cattura di una % di deposito), cerca di chiudere tutte le posizioni (con MAGIC=0) per tutte le coppie di valute e non ne ho bisogno. È necessario delimitare completamente tutte le coppie di valute. I miei ringraziamenti in anticipo.

La stessa cosa devi fare in altre bacheche - questo è spam, e potresti essere bannato.
 
Vinin:

E scrivere la stessa cosa in thread diversi - è spam e può ottenere un ban

Mi scuso - come sempre voglio fare tutto in una volta))
 

Grazie per la vostra attenzione e comprensione ))

Sono stato in grado di risolvere il problema da solo:

Inserita una linea difficile if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC) continua;

in un luogo altrettanto complicato. Dopo di che, tutto ha funzionato come previsto.

Grazie per la dritta con il mago. Non sono un programmatore, quindi a volte e non pensare a qualcosa per mancanza di conoscenza.