Operar con spreads en Meta Trader - página 144

 
Scorp1978 >>:

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

No. Me refería a la entrada inicial - "/si
//el tamaño de la primera vela es mayor que el valor establecido, no se permite operar..."

 
¡Buenas tardes a todos! ¡Felices fiestas a todos los que consideran el día como festivo!
//---------------------------------------
Ha surgido una pregunta. Aquí hay una función que produce (calcula) el diferencial medio entre instrumentos para las últimas 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);
}
Por favor, dígame cómo establecer
//-------------
int k;
double N = 0; double Sum = 0;
for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
{
if(N == NBars)
//------------------------
para que la función devuelva el valor medio de la dispersión no para todas las barras de NBars,
sino para NBars excepto la última barra.
En otras palabras, ¡quiero que la última barra se excluya del cálculo! O incluso un número determinado de barras más recientes no debería incluirse en el cálculo.
¿Hay alguna manera de "organizar" esto?
(A cambio, puedo dar una buena entrada al mercado el lunes 3 de mayo. Con una alta probabilidad de cierre rentable posterior)
 
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 establece el número de barras perdidas que no participarán en el cálculo. c NBarsSkip por NBars participará en el cálculo.
 
¡Gracias, NCI !
Te enviaré una entrada prospectiva en un momento.
Una pregunta más.
Acabo de tener una idea.
¿Qué tal si lo simplificamos aún más? Configúrelo así:
En lugar de for(k = 0; k < i Bars(Symbol_1 ,Timeframe ); k++)
ponga
for(k = M; k < iBars(Symbol_1,Timeframe); k++),
donde M es el número de barras excluidas del cálculo.
¿Funcionará?


 
Sólo que no k=M, sino k=M+1... La barra M no se tiene en cuenta
 
Gracias. Yo también he enviado una entrada.
 
Sinceramente no me di cuenta al principio de que NBars sólo debe considerar las barras existentes en dos instrumentos al mismo tiempo, entonces el código que he publicado no cumple con esta lógica. yla construcción con M tampoco sería correcta. en este caso se podría hacer lo siguiente:
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);
   }
}


 
Gracias. Por alguna razón mi código no compiló al principio, devolvió un error (corchete)
Hasta que moví del nombre de la función "...., int NBarsSkip "
a los parámetros externos de la EA
extern int NBarsSkip =2
No sé por qué hubo un error.
Pero cuando lo moví, todo estaba bien.
 

He leído esta rama de principio a fin - las 145 páginas. gracias a todos: rid, leonid553, fduch, neoclassic, getch, forex-k, goldtrader, timbo, fortrader. Tengo mucha información, todavía la estoy digiriendo. Mi principal conclusión es la siguiente: hay que cavar aquí, vale la pena. P.d.: buen hilo de recursos, casi no hay inundaciones. Gracias de nuevo 2rid

 

Gracias.

"Información para reflexionar.

A partir del lunes, la pasta para untar ZM-ZL (harina-aceite, 5:6)

¡!