Анализ работоспособности индикатора - страница 6

 
nikelodeon:
Ну прикольно, только хотел прийти домой поработать. Как барабашка стёр все свои посты..... Вот умора и это он называет помощью????? Ладно бывает. Очередное признание того что ВЫ зазнайки и тупо не можете человеку помощь при переходи с 5 ки на четвёрку..... 

Переход с ХХХ на YYY, это означает работу и написание на YYY.

nikelodeon:
 

... Но мне нужно сделать  вычитание Buffer2[i]-Buffer2[i+1], тоесть из текущего бара вычеть предыдущий ..

Номер бара в OnCalculate() это значение "i":

if(prev_calculated==0) // первый расчёт
     {
      for(i=rates_total-1; i>0; i--)
        {


Самый правый бар на графике будет иметь номер "0". Проверяется это так:

int OnCalculate(
                const int rates_total,       // размер входных таймсерий
                const int prev_calculated,   // обработано баров на предыдущем вызове
                const datetime& time[],      // Time
                const double& open[],        // Open
                const double& high[],        // High
                const double& low[],         // Low
                const double& close[],       // Close
                const long& tick_volume[],   // Tick Volume
                const long& volume[],        // Real Volume
                const int &spread[]          // Spread
                )
  {
   int i;
   if(prev_calculated==0) // первый расчёт
     {
      return(rates_total);
     }
   Comment(ArrayGetAsSeries(time),"; time[0]",TimeToString(time[0]),TIME_DATE );
   return(rates_total);
  }

В верхнем левом углу графика будет значение практически текущей даты.


В вашем выражении Вы обходите бары от бара с максимальным номером до бара с минимальным номером. То есть если текущий бар имеет номер "0", то предыдущий бар будет иметь номер "1". Значит, для того, чтобы вычесть из значения текущего бара, значение предыдущего, будет такая запись:

double current=iCustom(NULL,0,"TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i);
double    prev=iCustom(NULL,0,"TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i-1);
double    diff=current-prev;

Только при таком подходе нужно подстраховаться от выхода за пределы массива:

if(prev_calculated==0) // первый расчёт
     {
      for(i=rates_total-2; i>0; i--)
        {
         if(iCustom(NULL,0,"TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)>0)
 
Полностью рабочий код дать не могу по простой причине -  я не смогу скомпилировать работающую версию индикатора на своём компьютере.
 
barabashkakvn:
Полностью рабочий код дать не могу по простой причине -  я не смогу скомпилировать работающую версию индикатора на своём компьютере.
Всё правильно.... Только мне не нужно вычитать значение из предыдущего бара вызываемого индикатора кустом. Индикатор вызывается с текущими значениями, и уж потом расчитывается значение буфера.... Ладно попробую всётаки разобратся...
 
nikelodeon:
Всё правильно.... Только мне не нужно вычитать значение из предыдущего бара вызываемого индикатора кустом. Индикатор вызывается с текущими значениями, и уж потом расчитывается значение буфера.... Ладно попробую всётаки разобратся...

Тогда так и будет:

double rez_buff2=0;
rez_buff=Buffer2[i]-Buffer2[i+1];
только объявление переменной "rez_buff2" нужно вынести перед циклом.
 

nikelodeon:
Вы просто не умете их готовить......

----------------------------------------------

а он мне нужен??как напишешь индикатор который будет давать сигналы на вход  в таких точках дай мне знать;) 

Файлы:
 
Melnuk45:
Обязательно дам знать..... без внимания не оставлю,  не переживай..... когда напишу естественно.........
 

Спасибо всем кто откликнулся.... Написал индикатора, правда теперь незенаю правильно аль нет, да и куда их теперь заусунть :-) так или иначе всем спасибо!

 

#property copyright "nikelodeon"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   4
#property indicator_type1     DRAW_LINE   // тип графического построения - линия
#property indicator_color1    clrGreen    // цвет линии
#property indicator_style1    STYLE_SOLID // стиль линии
#property indicator_width1    2           // толщина линии
#property indicator_plots     4
double Buffer0[];
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Zscore;
   
double Nprof,Nloose,SredP,SredP1,SredL,SredL1,GrosProf,GrosLoose,Sred,Sred1,Sred2,LastMO,LastZscore;
double Nobchee,XZscore,MO;
double Prof_Handle,Rscore_Handle,ProfitFactor,LastPF;

int OnInit()
  {
   SetIndexBuffer(0,Buffer0,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   SetIndexBuffer(1,Buffer1,INDICATOR_DATA);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   SetIndexBuffer(2,Buffer2,INDICATOR_DATA);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);
   SetIndexBuffer(3,Buffer3,INDICATOR_DATA);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0.0);
  //Prof_Handle=iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1);
   //Rscore=iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,8);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,       // размер входных таймсерий
                const int prev_calculated,   // обработано баров на предыдущем вызове
                const datetime& time[],      // Time
                const double& open[],        // Open
                const double& high[],        // High
                const double& low[],         // Low
                const double& close[],       // Close
                const long& tick_volume[],   // Tick Volume
                const long& volume[],        // Real Volume
                const int &spread[]          // Spread
                )
 { 
   int i;

   if(prev_calculated==0) // первый расчёт
     {
     
     
      for(i=rates_total-1; i>0; i--)
        {
       double  Profit=(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)); 
       double  Rscore=iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,8,i); 
        
       if (Profit>0)  {Nprof=Nprof+1;
                                                      Sred=Sred+Profit;
                                                      SredP1=SredP1+Profit;
                                                      SredP=SredP1/Nprof;
                                                      GrosProf=GrosProf+Profit;
                                                     } 
                                                     
       if (Profit<0)  { Nloose=Nloose+1;
                                                      Sred=Sred+Profit;
                                                      SredL1=SredL1+(Profit*-1);                                                    
                                                      SredL=SredL1/Nloose;
                                                      GrosLoose=GrosLoose+(Profit*-1);
                                                     } 
                                                     
       Nobchee=Nprof+Nloose;
       XZscore=2*Nprof*Nloose;
       if (((Nprof+Nloose)!=0)&&(SredL!=0)) MO=(1+(SredP/SredL))*(Nprof/(Nprof+Nloose))-1; //MO
      //////////стандартное отклонение//////////
      //if (Nobchee>0)Sred1=Sred1+((Profit-(Sred/Nobchee))*(Profit-(Sred/Nobchee)));
     //if (Nobchee>0) Sred2=sqrt(Sred1/Nobchee);
    // if (Sred2>0) Buffer0[i]=MO/Sred2;
       
       
       if (GrosLoose>0) ProfitFactor=GrosProf/GrosLoose; //ProfitFactor
      // Buffer1[i]=ProfitFactor;
       if ((Nobchee>2)&&(XZscore>5)) Zscore=(Nobchee * (Rscore - 0.5) - XZscore) /sqrt (XZscore * (XZscore - Nobchee) / (Nobchee -1)); // Zscore
      // Buffer2[i]=Zscore;
        Buffer0[i]=(LastMO-MO)*100;
        Buffer1[i]=LastZscore-Zscore;
        LastPF=ProfitFactor;
        LastMO=MO;
        LastZscore=Zscore;
        } 
       
     }
 return(rates_total);    
     }
//--- OnCalculate done. Return new prev_calculated.
   //return(0);
  //+------------------------------------------------------------------+
Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Причина обращения: