Сбежавшему из MQL5

 

Попробовал поднять тему на MQL5? по поводу команд к новому компилятору, но в итоге зазнайства местных жителей уже третий день не могу зделать простейшее вычитание текужего значения из предыдущего. Оказывается сейчас компилятор не позволяет сделать это как раньше Buffer[i]=Buffer[i]-Buffer[i+1]. Вернее он может это зделать, но перед этип нужно получить хандл индикатора (если используется внешний индикатор) и т.д. и т.п. Эти обитатели пятёрки "голубых кровей" не удосужились объяснить в виде примера что нужно зделать чтоб заработало, а лишь начали тыкать пальцем в теорию и подобные штучки поучения, как они думали наверное. Но я не лыком шит, я как питбуль, хапанул на своём веку, ну а х..уль (с) "Баста".... В итоге через три дня, тоесть сегодня, я допёр. Чтоб начало работать нужно задать идентификатор вызываемого индикатора, потом скопировать данные в массив. Вот тут загвостка и возникла. Как в МТ4 скопировать данные пользовательского индикатора в массив с применением хендла....???? Ну или вот собственно индикатор. Подскажите как сделать вычитание Buffer0[i]=Buffer[i]-Buffer[i+1];

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#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     3
double Buffer0[];
double Buffer1[];
double Buffer2[];
double Buffer3[];
//double Zscore;
   
double Nprof,Nloose,SredP,SredL,GrosProf,GrosLoose,Rscore;
double b,Nobchee,XZscore;
int Prof_Handle,Rscore_Handle;

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);
   ArraySetAsSeries(Buffer2,true);
   Prof_Handle=iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1);
      
//---
   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--)
        {
       if (iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)>0)  {Nprof=Nprof+1;
                                                    
                                                      SredP=(SredP+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i))/Nprof;
                                                      GrosProf=GrosProf+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i);
                                                     } 
                                                     
       if (iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)<0)  { Nloose=Nloose+1;
                                                     
                                                      SredL=(SredL+(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)*-1))/Nloose;
                                                      GrosLoose=GrosLoose+(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)*-1);
                                                     } 
       Nobchee=Nprof+Nloose;
       XZscore=2*Nprof*Nloose;
       Rscore=Rscore+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,8,i);
       // if (((Nprof+Nloose)!=0)&&(SredL!=0)) Buffer0[i]=(1+(SredP/SredL))*(Nprof/(Nprof+Nloose))-1; //MO
      // if (GrosLoose>0) Buffer1[i]=GrosProf/GrosLoose; //ProfitFactor
   
        if ((Nobchee>3)&&(XZscore>3)) Buffer0[i]=sqrt((Nobchee * (Rscore - 0.5) - XZscore) / ((XZscore * (XZscore - Nobchee)) / (Nobchee -1))); // Zscore
      
        
        }
       
     }
 return(rates_total);    
     }
//--- OnCalculate done. Return new prev_calculated.
   //return(0);
  //+------------------------------------------------------------------+

 Я уже хандл назначил, но упёрся в CopyBuffer которого нет в MQL4. Как быть????

 
nikelodeon:

Попробовал поднять тему на MQL5? по поводу команд к новому компилятору, но в итоге зазнайства местных жителей уже третий день не могу зделать простейшее вычитание текужего значения из предыдущего. Оказывается сейчас компилятор не позволяет сделать это как раньше Buffer[i]=Buffer[i]-Buffer[i+1]. Вернее он может это зделать, но перед этип нужно получить хандл индикатора (если используется внешний индикатор) и т.д. и т.п. Эти обитатели пятёрки "голубых кровей" не удосужились объяснить в виде примера что нужно зделать чтоб заработало, а лишь начали тыкать пальцем в теорию и подобные штучки поучения, как они думали наверное. Но я не лыком шит, я как питбуль, хапанул на своём веку, ну а х..уль (с) "Баста".... В итоге через три дня, тоесть сегодня, я допёр. Чтоб начало работать нужно задать идентификатор вызываемого индикатора, потом скопировать данные в массив. Вот тут загвостка и возникла. Как в МТ4 скопировать данные пользовательского индикатора в массив с применением хендла....???? Ну или вот собственно индикатор. Подскажите как сделать вычитание Buffer0[i]=Buffer[i]-Buffer[i+1];

 Я уже хандл назначил, но упёрся в CopyBuffer которого нет в MQL4. Как быть????

Видимо ты не уточнил что тебя интересует написание на mql4 и в ответ получил советы по mql5. Или ещё хуже, сам попутал в одну кучу эти языки.

В mql4 всё осталось по прежнему. Самое неприятное это ошибка выхода массива за пределы допустимого.

 
nikelodeon:

Попробовал поднять тему на MQL5? по поводу команд к новому компилятору, но в итоге зазнайства местных жителей уже третий день не могу зделать простейшее вычитание текужего значения из предыдущего. Оказывается сейчас компилятор не позволяет сделать это как раньше Buffer[i]=Buffer[i]-Buffer[i+1]. Вернее он может это зделать, но перед этип нужно получить хандл индикатора (если используется внешний индикатор) и т.д. и т.п. Эти обитатели пятёрки "голубых кровей" не удосужились объяснить в виде примера что нужно зделать чтоб заработало, а лишь начали тыкать пальцем в теорию и подобные штучки поучения, как они думали наверное. Но я не лыком шит, я как питбуль, хапанул на своём веку, ну а х..уль (с) "Баста".... В итоге через три дня, тоесть сегодня, я допёр. Чтоб начало работать нужно задать идентификатор вызываемого индикатора, потом скопировать данные в массив. Вот тут загвостка и возникла. Как в МТ4 скопировать данные пользовательского индикатора в массив с применением хендла....???? Ну или вот собственно индикатор. Подскажите как сделать вычитание Buffer0[i]=Buffer[i]-Buffer[i+1];

 Я уже хандл назначил, но упёрся в CopyBuffer которого нет в MQL4. Как быть????

Если по простому, то можно сделать так.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#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     3
double Buffer0[];
double Buffer1[];
double Buffer2[];
double Buffer3[];
//double Zscore;
   
double Nprof,Nloose,SredP,SredL,GrosProf,GrosLoose,Rscore;
double b,Nobchee,XZscore;
int Prof_Handle,Rscore_Handle;

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);
   ArraySetAsSeries(Buffer2,true);
   Prof_Handle=iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1);
      
//---
   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-20; i>0; i--)
        {
       if (iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)>0)  {Nprof=Nprof+1;
                                                    
                                                      SredP=(SredP+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i))/Nprof;
                                                      GrosProf=GrosProf+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i);
                                                     } 
                                                     
       if (iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)<0)  { Nloose=Nloose+1;
                                                     
                                                      SredL=(SredL+(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)*-1))/Nloose;
                                                      GrosLoose=GrosLoose+(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)*-1);
                                                     } 
       Nobchee=Nprof+Nloose;
       XZscore=2*Nprof*Nloose;
       Rscore=Rscore+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,8,i);
       // if (((Nprof+Nloose)!=0)&&(SredL!=0)) Buffer0[i]=(1+(SredP/SredL))*(Nprof/(Nprof+Nloose))-1; //MO
      // if (GrosLoose>0) Buffer1[i]=GrosProf/GrosLoose; //ProfitFactor
   
        if ((Nobchee>3)&&(XZscore>3)) Buffer0[i]=sqrt((Nobchee * (Rscore - 0.5) - XZscore) / ((XZscore * (XZscore - Nobchee)) / (Nobchee -1))); // Zscore
      
        
        }
       
     }
 return(rates_total);    
     }
//--- OnCalculate done. Return new prev_calculated.
   //return(0);
  //+------------------------------------------------------------------+

 Что бы сделать по нормальному - недостаточно информации.

Необходимо знать за что отвечают параметры вызываемого индикатора 

 

Вот так пробовал и ничего не получается.....

 

 if(prev_calculated==0) // первый расчёт
     {
     
     
      for(i=rates_total-20; i>0; i--)
        {
       if (iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)>0)  {Nprof=Nprof+1;
                                                    
                                                      SredP=(SredP+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i))/Nprof;
                                                      GrosProf=GrosProf+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i);
                                                     } 
                                                     
       if (iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)<0)  { Nloose=Nloose+1;
                                                     
                                                      SredL=(SredL+(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)*-1))/Nloose;
                                                      GrosLoose=GrosLoose+(iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,1,i)*-1);
                                                     } 
       Nobchee=Nprof+Nloose;
       XZscore=2*Nprof*Nloose;
       Rscore=Rscore+iCustom(NULL, 0, "TDSEQUENTA v2015 Fileswrire",5,8,12,7,3,3,3,8,i);
       // if (((Nprof+Nloose)!=0)&&(SredL!=0)) Buffer0[i]=(1+(SredP/SredL))*(Nprof/(Nprof+Nloose))-1; //MO
      // if (GrosLoose>0) Buffer1[i]=GrosProf/GrosLoose; //ProfitFactor
   
        if ((Nobchee>3)&&(XZscore>3)) Buffer0[i]=Buffer0[i+1]-sqrt((Nobchee * (Rscore - 0.5) - XZscore) / ((XZscore * (XZscore - Nobchee)) / (Nobchee -1))); // Zscore
     // Buffer1[i]=Rscore;
        
        }
       
     }
 
nikelodeon:

Вот так пробовал и ничего не получается.....

 

 

Странная у тебя манера письма. А не кажется тебе что гораздо полезней будет объявит переменную для значения индикатора, один раз её вычислить и с ней работать вместо того чтобы ШЕСТЬ раз вычислять это значение.

Потом прежде чем вычислять из значения индикатора единицу, надо понимать что это значение высчитано правильно. Чтобы не забивать логи распечаткой можно вывести это значение в Comment()

У тебя никакой уверенности что правильно получены необходимые значения для расчётов, а ты уже грешишь на присвоение значения буферам. Да и непонятно какое значение ты хочешь получить. А если это значение получится меньше нуля тогда что? Где ты сможешь на графике его увидеть?

 
AlexeyVik:

Странная у тебя манера письма. А не кажется тебе что гораздо полезней будет объявит переменную для значения индикатора, один раз её вычислить и с ней работать вместо того чтобы ШЕСТЬ раз вычислять это значение.

Потом прежде чем вычислять из значения индикатора единицу, надо понимать что это значение высчитано правильно. Чтобы не забивать логи распечаткой можно вывести это значение в Comment()

У тебя никакой уверенности что правильно получены необходимые значения для расчётов, а ты уже грешишь на присвоение значения буферам. Да и непонятно какое значение ты хочешь получить. А если это значение получится меньше нуля тогда что? Где ты сможешь на графике его увидеть?

Это точно..... Пишу как грица курица лапой...... :-( Главное, что алгоритм работает. Самоучка, что тут поделаешь :-).... Так или иначе. Любое представления програмирования является решением определённых алгоритмических задачь, которые в любом языке програмирования одинаковы.... Как ни странно. Во всяком случае есть набор стандартных задач... не суть..... Всё зависит лишь от формы представления алгоритма для того или иного компилятора (MQL4-MQL5) И неважно какой компилятор используется, важно как в него описать тот или иной алгоритм решения с простыми математическими операциями или вызовами индикатора iCustom. Я понял что в четвёрке с iCustom-ом лучше не шутить и расчитывать его в переменную, а уж потом с ней работать.... Интересно..... не покажете как это делается?, насколько я понимаю это необходимо делать в OnInit(); 

 
nikelodeon:

Это точно..... Пишу как грица курица лапой...... :-( Главное, что алгоритм работает. Самоучка, что тут поделаешь :-).... Так или иначе. Любое представления програмирования является решением определённых алгоритмических задачь, которые в любом языке програмирования одинаковы.... Как ни странно. Во всяком случае есть набор стандартных задач... не суть..... Всё зависит лишь от формы представления алгоритма для того или иного компилятора (MQL4-MQL5) И неважно какой компилятор используется, важно как в него описать тот или иной алгоритм решения с простыми математическими операциями или вызовами индикатора iCustom. Я понял что в четвёрке с iCustom-ом лучше не шутить и расчитывать его в переменную, а уж потом с ней работать.... Интересно..... не покажете как это делается?, насколько я понимаю это необходимо делать в OnInit(); 

Ты абсолютно ничего не понял про iCustom(). Повнимательней почитай документацию. Вряд-ли кто станет пересказывать то что там написано. А вот когда поймёшь что возвращает функция iCustom() тогда и поймёшь как применить переменную и с ней работать. Раз уж ты понимаешь схожесть всех языков программирования, то и понимаешь что 6 раз высчитать значение функции в 6 раз дольше чем 1 раз. И сможешь самостоятельно записать значение этой функции в переменную.
 
AlexeyVik:
Ты абсолютно ничего не понял про iCustom(). Повнимательней почитай документацию. Вряд-ли кто станет пересказывать то что там написано. А вот когда поймёшь что возвращает функция iCustom() тогда и поймёшь как применить переменную и с ней работать. Раз уж ты понимаешь схожесть всех языков программирования, то и понимаешь что 6 раз высчитать значение функции в 6 раз дольше чем 1 раз. И сможешь самостоятельно записать значение этой функции в переменную.
Расчет идет первый раз, а потом только получаем значение. Но сам вызов функции (кстати любой) занимает время
 
Vinin:
Расчет идет первый раз, а потом только получаем значение. Но сам вызов функции (кстати любой) занимает время
Тоесть в представленном коде расчёт индикатора идёт 1 раз, а потом функция iCustom() только выдаёт значение на указанном баре? И такой код не будет выполняться дольше чем если переменной присвоить значение iCustom() и 6 раз использовать эту переменную?
 
AlexeyVik:
Тоесть в представленном коде расчёт индикатора идёт 1 раз, а потом функция iCustom() только выдаёт значение на указанном баре? И такой код не будет выполняться дольше чем если переменной присвоить значение iCustom() и 6 раз использовать эту переменную?

Пока не изменится цена - перерасчета не будет.

Но я то же предпочитаю обращаться к функциям один раз 

 

Хорошо. Тогда в таком случае почему не работает???? Я так понимаю что сейчас код получился более коректным.....

Всё выводит, кроме Buffer2[i]

 

     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;
                                                    
                                                      SredP=(SredP+Profit)/Nprof;
                                                      GrosProf=GrosProf+Profit;
                                                     } 
                                                     
       if (Profit<0)  { Nloose=Nloose+1;
                                                     
                                                      SredL=(SredL+(Profit*-1))/Nloose;
                                                      GrosLoose=GrosLoose+(Profit*-1);
                                                     } 
       Nobchee=Nprof+Nloose;
       XZscore=2*Nprof*Nloose;
       // if (((Nprof+Nloose)!=0)&&(SredL!=0)) Buffer0[i]=(1+(SredP/SredL))*(Nprof/(Nprof+Nloose))-1; //MO
      // if (GrosLoose>0) Buffer1[i]=GrosProf/GrosLoose; //ProfitFactor
   
        if ((Nobchee>10)&&(XZscore>10)) Buffer2[i]=sqrt((Nobchee * (Rscore - 0.5) - XZscore) / ((XZscore * (XZscore - Nobchee)) / (Nobchee -1))); // Zscore
        Buffer1[i]=Profit;
        
        } 
       
     }
 return(rates_total);    
     }
Причина обращения: