Spread trading in Meta Trader - pagina 144

 
Scorp1978 >>:

rid спасибо хорошая идея (от тиков придется тогда отказываться), фильтр от сильных убыточных движений ты имеешь ввиду "если сумарный профит меньше чего то, то закрыть все позиции".......

No. Intendevo la voce iniziale - "/if
//la dimensione della prima candela è maggiore del valore impostato, non è permesso il trading..."

 
Buon pomeriggio a tutti! Buone feste a tutti coloro che considerano il giorno come una vacanza!
//---------------------------------------
È sorta una domanda. Ecco una funzione che produce (calcola) lo spread medio tra strumenti per le ultime NBars.
 double CalculateAvarageSpread(string Symbol_1, string Symbol_2,
                              int Timeframe, int NBars)
{
   int k;
   double N = 0;
   double Sum = 0;
   for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
   {
      if(N == NBars)
         break;

      int symb2Shift = iBarShift(Symbol_2,Timeframe,iTime(Symbol_1,Timeframe,k),true);
      if(symb2Shift != -1)
      {
         Sum += iClose(Symbol_1,Timeframe,k) - iClose(Symbol_2,Timeframe,symb2Shift);
         N++;
      }
   }
   double avarageSpread = Sum / N;
   return(avarageSpread);
}
Per favore ditemi come impostare
//-------------
int k;
double N = 0; double Sum = 0;
for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
{
if(N == NBars)
//------------------------
in modo che la funzione restituisca il valore medio di spread non per tutte le barre NBars,
ma per NBars tranne l'ultima barra.
In altre parole, voglio che l'ultima barra sia esclusa dal calcolo! O anche un dato numero delle barre più recenti non dovrebbe essere incluso nel calcolo.
C'è un modo per "organizzare" questo?
(In cambio, posso dare una buona entrata sul mercato lunedì 3 maggio. Con un'alta probabilità di successiva chiusura redditizia)!
 
double CalculateAvarageSpread(string Symbol_1, string Symbol_2,
                              int Timeframe, int NBars, int NBarsSkip)
{
   int k;
   double N = 0;
   double Sum = 0;
   if(NBars > iBars(Symbol_1,Timeframe)) NBars=iBars(Symbol_1,Timeframe); // если н больше чем баров на графике то обрезаем
   if(NBarsSkip >= NBars) NBarsSkip=0; // если пропускаем баров больше/равно чем NBars, то ничего не пропускаем
   for(k = NBarsSkip; k < NBars; k++)
   {

      int symb2Shift = iBarShift(Symbol_2,Timeframe,iTime(Symbol_1,Timeframe,k),true);
      if(symb2Shift != -1)
      {
         Sum += iClose(Symbol_1,Timeframe,k) - iClose(Symbol_2,Timeframe,symb2Shift);
         N++;
      }
   }
   double avarageSpread = Sum / N;
   return(avarageSpread);
}
NBarsSkip imposta il numero di barre mancanti che non parteciperanno al calcolo. c NBarsSkip per NBars parteciperà al calcolo.
 
Grazie, NCI!
Vi manderò una voce potenziale in un momento.
Un'altra domanda.
Ho appena avuto un'idea.
Che ne dite di renderlo ancora più semplice. Impostalo così:
Invece di for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
imposta
for(k = M; k < iBars(Symbol_1,Timeframe); k++),
dove M è il numero di barre escluse dal calcolo.
Funzionerà?


 
Solo che non k=M, ma k=M+1... La barra M non è presa in considerazione
 
Grazie! Anch'io ho inviato un'iscrizione.
 
Onestamente non ho notato all'inizio che NBars dovrebbe considerare solo le barre esistenti su due strumenti allo stesso tempo, quindi il codice che ho postato non soddisfa questa logica. e anchela costruzione con M non sarebbe corretta. in questo caso si potrebbe fare quanto segue:
double CalculateAvarageSpread(string Symbol_1, string Symbol_2,
                              int Timeframe, int NBars, int NBarsSkip)
{
   int k;
   double N = 0;
   int NReal = 0;
   double Sum = 0;
   for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
   {
      if(N == NBars)
         break;

      int symb2Shift = iBarShift(Symbol_2,Timeframe,iTime(Symbol_1,Timeframe,k),true);
      if(symb2Shift != -1)
      {
         N++;
         if(N>NBarsSkip)
         {
            Sum += iClose(Symbol_1,Timeframe,k) - iClose(Symbol_2,Timeframe,symb2Shift);
            NReal++;  // счетчик Н которые не пропущены и посчитаны
         }
      }
   }
   if(NReal==0) return(0); // так как у нас не получилось рассчитать ни одного бара
   else
   {
      double avarageSpread = Sum / NReal;
      return(avarageSpread);
   }
}


 
Grazie. Per qualche motivo il mio codice non ha compilato all'inizio, ha restituito un errore (parentesi)
Finché non ho spostato dal nome della funzione "...., int NBarsSkip "
ai parametri esterni dell'EA
extern int NBarsSkip =2
Non so perché ci sia stato un errore.
Ma quando l'ho spostato, tutto è andato bene.
 

Ho letto questo ramo da cima a fondo - tutte le 145 pagine. grazie a tutti: rid, leonid553, fduch, neoclassic, getch, forex-k, goldtrader, timbo, fortrader. Ho molte informazioni, le sto ancora digerendo. La mia conclusione principale è la seguente: bisogna scavare qui, ne vale la pena. P.s.: buon thread di risorse, quasi nessun allagamento. Grazie ancora 2rid

 

Grazie!

"Informazioni su cui riflettere.

Da lunedì lo spread ZM-ZL (farina-olio, 5:6)

!