Торговля спредами в Meta Trader-е - страница 144

 
Scorp1978 >>:

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

Нет. Я имел ввиду изначальный вход - "/если 
//размер первой свечи больше заданного значения, то торговля запрещена..."

 
Добрый день всем! С праздником всех, кто считает этот день праздником!
//---------------------------------------
Вопрос встал. Вот функция, которая  выдает(расчитывает) среднестатистический спред между инструментами за последние 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);
}
Пож. подскажите как мне задать 
//-------------
int k;
  double N = 0;  double Sum = 0;
  for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
  {
  if(N == NBars)
//------------------------
чтобы функция возвращала среднестатистическое значение спреда не за все NBars баров, 
 а за NBars баров кроме последнего.
Иначе говоря, мне нужно, чтобы самый посл. бар не участвовал в расчете ! Или даже чтобы заданное число самых посл. баров не участвовало в расчете.
Можно это как-то "организовать" ?
(Взамен могу дать хороший вход по рынку в понедельник, с 3 мая. С большой вероятностью последующего профитного закрытия!)
 
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 задает количество пропущенных баров, которые не будут участвовать в расчете. в расчете будут участвовать c NBarsSkip по NBars.
 
Благодарю, NCI !
Сейчас пришлю вам в личку перспективный вход.
Ещё вопрос.
У меня вот только сейчас появилась мысль.
А если сделать совсем просто. Задать вот так:
Вместо   for(k = 0; k < iBars(Symbol_1,Timeframe); k++)
задать 
  for(k = M; k < iBars(Symbol_1,Timeframe); k++),
 где М - число исключаемых из расчета баров.
Это будет работать ?


 
Только не к=М, а к=М+1... Бар М то в расчет не берем
 
Благодарю! Тож послал вход.
 
я честно говоря не заметил сначала, что NBars должно считать за бары только бары существующие на двух инструментах одновременно, тогда выложенный мной код не отвечает такой логике. и конструкция с M тоже будет не корректной. в таком случае можно сделать так: 
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);
   }
}


 
Благодарю. У меня почему-то сначала не компеллировался код, -возвращалась ошибка (скобка)
Пока я не перенес  из названия функции "...., int NBarsSkip "
во внешние параметры советника 
extern  int NBarsSkip =2
Не пойму,  почему была ошибка.
Но когда перенес - то всё норм стало.
 

Прочел ветку от корки до корки - все 145 страниц. всем респект: rid, leonid553, fduch, neoclassic, getch, forex-k, goldtrader, timbo, fortrader. Информации дофигищи, еще перевариваю. Главный вывод для себя сделал такой: тут надо копать, оно того стоит. P.s.: вообще толковая ветка, флуда почти не было. Еще раз спасибо 2rid

 

Благодарю!

"Информация к размышлению".

С понедельника   спред ZM-ZL (мука-масло, 5:6)

 

 

Причина обращения: