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

 
pr0fess0r64


1. Dobbiamo rimuovere &&OrderSymbol()==Symbol() dal codice.

2. Necessità di normalizzare l'offerta e l'aska.

3. È meglio non impostare lo slittamento a 10 punti, ma calcolarlo dinamicamente. Per esempio, se un ordine per l'oro e questo strumento transita 50 punti per tick, allora 10 punti di slippage causeranno requotes. Quindi è meglio calcolare la dimensione minima del tick e moltiplicarla per questo 10.

4. Dovete inserire la gestione degli errori nel vostro codice. Altrimenti, in caso di fallimento non capirete i motivi per cui gli ordini non sono stati chiusi.

 
drknn:


1. Dovresti rimuovere &&OrderSymbol()==Symbol() dal codice

2. È necessario normalizzare l'offerta e la domanda.

3. Lo slippage è meglio calcolarlo dinamicamente piuttosto che 10 pips. Per esempio, se un ordine sull'oro e questo strumento si muove di 50 punti per tick, allora 10 punti di slippage vi causeranno un sacco di requote. Quindi è meglio calcolare la dimensione minima del tick e moltiplicarla per questo 10.

4. Dovete inserire la gestione degli errori nel vostro codice. Altrimenti, in caso di fallimento non si capiranno i motivi per cui gli ordini non si sono chiusi

Questa è la visione generale, e si può pensare a tutta una serie di cose da fare.
 
pr0fess0r64:
Grazie mille, lo proverò nel tester, ma per quanto riguarda la modifica degli ordini hai qualche consiglio?
Ci sono errori nel registro quando si modifica?
 

Dove si spedisce il ritorno?

Chiaramente, alla linea 0 e attendere un tick

int start()
  {
//----
   
//----
   return(0);
  }

è chiaro anche qui - stop

   if(Lot_s<=0){
    Alert("Не выбран лот!");
    return;

E qui?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
Il valore del numero di ordini è ko, quindi la prossima funzione deve essere scritta usando ko? Cosa fa il ritorno qui?
 

return() non manda nessuno da nessuna parte.

L'operatore return termina la funzione corrente e restituisce il controllo al programma chiamante. L'uso di return(expression); termina la funzione corrente e invia il risultato. L'espressione operatore è racchiusa tra parentesi e non deve contenere un operatore di assegnazione.

 
Vinin:

return() non manda nessuno da nessuna parte.

L'operatore return termina la funzione corrente e restituisce il controllo al programma chiamante. L'uso di return(expression); termina la funzione corrente e invia il risultato. L'espressione operatore è racchiusa tra parentesi e non deve contenere un operatore di assegnazione.

Oh, quindi invece di assegnare esplicitamente il risultato di ko, lo passiamo attraverso return? Penso di aver capito, grazie.
 
Come, allora, è corretto interrompere il funzionamento dell'EA se le condizioni non sono soddisfatte? Non per addormentarlo, ma per fermarlo del tutto.
 
Abzasc:
Come, allora, è corretto interrompere il funzionamento dell'EA se le condizioni non sono soddisfatte? Non per addormentarlo, ma per fermarlo del tutto.

Cosa intendete per "mettere a dormire" e cosa per "smettere"?
 
Vinin:

Cosa significa "mettere a dormire" e cosa significa "smettere"?

Metti a dormire - metti a dormire, poi cercherà di ripartire.

Stop - completamente, in modo che l'Expert Advisor smetta di funzionare (cambia la sua "faccia").

Per esempio, l'Expert Advisor è sotto Eurobucks, ma è stato lanciato su EuroJPY. Controlla il simbolo e in caso di mancata corrispondenza, lancia l'allarme e non tenta più di lavorare prima del riavvio manuale.

 
Abzasc:

Metti a dormire - metti a dormire, poi cercherà di ripartire.

Stop - completamente, in modo che l'Expert Advisor smetta di funzionare (cambia la sua "faccia").

Per esempio, l'Expert Advisor è sotto Eurobucks, ma è stato lanciato su EuroJPY. Controlla il simbolo e in caso di mancata corrispondenza, lancia un allarme e non tenta di lavorare di nuovo prima del riavvio manuale.


Perché così complicato?

È sufficiente fornire la gestione delle condizioni nella funzione start()

int start(){
  if (Symbol()!="EURUSD") {
     Alert("Советник должен работать только на EURUSD");
     return(0);
  }
  // Далее обработка, принятие решений

}
In questo caso, se mettete l'EA sullo strumento sbagliato, sarete inondati di avvisi, finché non lo disabiliterete (l'EA) voi stessi

Si può anche aggiungere un suono di sirena, poi si può spegnere di sicuro

Motivazione: