Создание советника для МТ5

 

В свете призыва https://www.mql5.com/ru/forum/13504 , попробую создать тему, в надежде, что она, возможно, будет привлекательной и "горячей".

Необходимо создать советник для МТ5 по готовому индикатору для МТ5, написанным одним из участников (озвучу по согласованию с ним) по мотивам моих идей и приведенного в кодобазе https://www.mql5.com/ru/code/10339 . Задавайте вопросы по логике индикатора и будущего советника, отвечу. Будьте уверены, от полученного советника все останутся довольны - порвет рынок (не посчитайте за рекламу), гарантирую, лишь-бы программисты следовали моим рекомендациям и сами помогали мне в формулировке тонкостей изложения мысли, понятным программистам. Если есть интерес, то вперед, к созданию советника коллективным разумом! Сам индикатором  не пользовался, поскольку МТ5 меня до сих пор мало интересовал, но по отзывам - работоспособный. Если тема непривлекательная выйдет, готов удалить по первому требованию участников, модераторов или руководства. Почему не в разделе "работа", потому, что подобный советник меня пока мало интересует, поскольку не умею работать на МТ5. Если выйдет стоящий советник, попробую научиться торговле на платформе МТ5.

 

я бы вам порекомендовал :

1) создать тему в соответствующем разделе

2) выложить всю вашу стратегию и коды в открытую а не замыливать глаза остальным.

3) Не пытаться даже делать то же самое что вы делаете (делали) на четвертом форуме. особенно ваш последний опус. 

4) если эти условия вас не устраивают то сервис "Работа" вас ждет. 

 
FAQ:

я бы вам порекомендовал :

1) создать тему в соответствующем разделе

2) выложить всю вашу стратегию и коды в открытую а не замыливать глаза остальным.

3) Не пытаться даже делать то же самое что вы делаете (делали) на четвертом форуме. особенно ваш последний опус. 

4) если эти условия вас не устраивают то сервис "Работа" вас ждет. 

1. В каком разделе советуете разместить?;

2. Расскажу стратегию, если будет интерес в необходимом, для создания работоспособного советника, объеме, а коды индикатора - в кодобазе;

3. Прошу простить за оплошность, пагубность которой понял;

4. По обстоятельствам.

 
yosuf:

2. Расскажу стратегию, если будет интерес в необходимом, для создания работоспособного советника, объеме, а коды индикатора - в кодобазе;

Выкладывайте ТехЗадание и полное описание стратегии.
 
sergeev:
Выкладывайте ТехЗадание и полное описание стратегии.

Хорошо, рекомендацию о переносе в соответствующий раздел, думаю, смогут осуществить модераторы, в случае необходимости.

1. Для начала, прошу Вас, привести скрин индикатора https://www.mql5.com/ru/forum/13504 для МТ5, чтобы я посмотрел, как он выглядит на самом деле на этой платформе, если не затруднит;

2. Привести его код здесь, поскольку Вы сделаете более грамотно, чем я;

3. Привести шаблон требований для составления ТЗ на советник;

А стратегия, вкратце, будет заключаться следованию показаниям и сигналам индикатора как по трендовой, так и по противотрендовой политике входа в рынок. Она будет дополнена мной по мере поступления возникающих специфических вопросов.

 

повторю еще раз.

или идёте в раздел работа и парите моск тамошним прогерам

или выкладывайте полное ТЗ на эксперт и забываете про эту ветку пока кто-либо не удосужится прочитать и задать вопросы.

Если вы чего-то не в состоянии делать - см. п. 1.

играться с вами в руководителя и команду никто не будет. коллективных разумов и исполнителей здесь тоже нет. хватит.

 
yosuf:

В свете призыва https://www.mql5.com/ru/forum/13504 , попробую создать тему, в надежде, что она, возможно, будет привлекательной и "горячей".

Необходимо создать советник для МТ5 по готовому индикатору для МТ5, написанным одним из участников (озвучу по согласованию с ним) по мотивам моих идей и приведенного в кодобазе https://www.mql5.com/ru/code/10339 . Задавайте вопросы по логике индикатора и будущего советника, отвечу. Будьте уверены, от полученного советника все останутся довольны - порвет рынок (не посчитайте за рекламу), гарантирую, лишь-бы программисты следовали моим рекомендациям и сами помогали мне в формулировке тонкостей изложения мысли, понятным программистам. Если есть интерес, то вперед, к созданию советника коллективным разумом! Сам индикатором  не пользовался, поскольку МТ5 меня до сих пор мало интересовал, но по отзывам - работоспособный. Если тема непривлекательная выйдет, готов удалить по первому требованию участников, модераторов или руководства. Почему не в разделе "работа", потому, что подобный советник меня пока мало интересует, поскольку не умею работать на МТ5. Если выйдет стоящий советник, попробую научиться торговле на платформе МТ5.

Юсуф, вы просите создать советник, цитирую: "по готовому индикатору для МТ5", но зачем тогда приводите ссылку на кодбейс из MT4?

Выкладывайте здесь код готового индикатора для MT5 или в кодбейс для MT5, чтобы потенциально заинтересованные программисты могли хотя бы определиться с задачей. 

Ведь если индикатор для MT5 уже готов, то любой программист может прогнать его в визуальном режиме в тестере MetaTrader5 и убедиться в том, стоит ли овчинка выделки или плюнуть на это дело.

 
Вікладівайте ТЗ и инкдикатор
 
Chart EURUSD, H1, 2013.08.20 07:03 UTC, MetaQuotes Software Corp., MetaTrader 5, Demo
Chart EURUSD, H1, 2013.08.20 07:03 UTC, MetaQuotes Software Corp., MetaTrader 5, Demo
  • www.mql5.com
Chart EURUSD, H1, MetaQuotes Software Corp.: temp_file_screenshot_64629.png
 
Reshetov:

Юсуф, вы просите создать советник, цитирую: "по готовому индикатору для МТ5", но зачем тогда приводите ссылку на кодбейс из MT4?

Выкладывайте здесь код готового индикатора для MT5 или в кодбейс для MT5, чтобы потенциально заинтересованные программисты могли хотя бы определиться с задачей. 

Ведь если индикатор для MT5 уже готов, то любой программист может прогнать его в визуальном режиме в тестере MetaTrader5 и убедиться в том, стоит ли овчинка выделки или плюнуть на это дело.

Пожалуйста:

#property copyright "(c) 2011.02.09, Vladimir Gomonov"
#property link      "MetaDriver@rambler.ru"
#property version   "1.04"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_plots   4
//--- plot P1
#property indicator_label1  "P1"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  LightBlue, CLR_NONE
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//--- plot P2
#property indicator_label2  "P2"
#property indicator_type2   DRAW_COLOR_LINE
#property indicator_color2  Pink, CLR_NONE
#property indicator_style2  STYLE_SOLID  // STYLE_DOT
#property indicator_width2  3
//--- plot P3
#property indicator_label3  "P3"
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  Purple, CLR_NONE
#property indicator_style3  STYLE_DASH
#property indicator_width3  1
//--- plot Pf
#property indicator_label4  "Pf"
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  DodgerBlue, CLR_NONE
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2

#include <Math\gammaDF.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum eiModes
  {
   eGammaMode,  // Использовать Гамма-распределение
   eExpMode,    // Использовать экспоненту
  };
//--- input parameters
input int      HistoryShift=1;  // Сдвиг назад по истории (в барах)
input int      HistoryLen=20;   // Глубина используемой истории (в барах)
input int      FutureLen=64;    // Длина прогноза (в барах)
input eiModes  Mode=eGammaMode; // Режим расчёта
//--- indicator buffers
double         P1Buffer[];
double         P1Colors[];
double         P2Buffer[];
double         P2Colors[];
double         P3Buffer[];
double         P3Colors[];
double         PfBuffer[];
double         PfColors[];
int            k;            // = HistoryLen-1;
int            FullLen;      // = HistoryLen + FutureLen
int            Sk;           // Сумма первых k натуральных
int            Sk2;          // Сумма первых k^2 натуральных
int            ControlShift=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,P1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,P1Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,P2Buffer,INDICATOR_DATA);
   SetIndexBuffer(3,P2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,P3Buffer,INDICATOR_DATA);
   SetIndexBuffer(5,P3Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(6,PfBuffer,INDICATOR_DATA);
   SetIndexBuffer(7,PfColors,INDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(0,PLOT_SHIFT,FutureLen);
   PlotIndexSetInteger(1,PLOT_SHIFT,FutureLen);
   PlotIndexSetInteger(2,PLOT_SHIFT,FutureLen);
   ArraySetAsSeries(P1Buffer,true);
   ArraySetAsSeries(P1Colors,true);
   ArraySetAsSeries(P2Buffer,true);
   ArraySetAsSeries(P2Colors,true);
   ArraySetAsSeries(P3Buffer,true);
   ArraySetAsSeries(P3Colors,true);
   ArraySetAsSeries(PfBuffer,true);
   ArraySetAsSeries(PfColors,true);
//--- Константы, известные при инициализации
   k=HistoryLen-1;
   FullLen = HistoryLen + FutureLen;      // Общая длина длинных буферов
   Sk=k*(k+1)/2;
   Sk2=k*(k+1)*(k*2+1)/6;
   if(HistoryShift<0) CreatControlLine();
//---
   return(0);
  }  // OnInit();
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  ObjectDelete(0,"iS2_tControl");
}
//+------------------------------------------------------------------+
//|      Расчёт индикатора                                           |
//+------------------------------------------------------------------+
void ReCalculate()
  {
   ArrayInitialize(P1Colors,1); // обнуление цвета
   ArrayInitialize(P2Colors,1); // обнуление цвета
   ArrayInitialize(P3Colors,1); // обнуление цвета
   ArrayInitialize(PfColors,1); // обнуление цвета
   int shift= iShift();
   for(int i=0;i<k;i++)
     {
      PfColors[i+shift]=0;    // делает видимыми соответствующие точки
     }
   for(int i=0;i<k+FutureLen-1;i++)
     {
      P1Colors[i+shift]=0;    // делает видимыми соответствующие точки
      P2Colors[i+shift]=0;    // делает видимыми соответствующие точки
      P3Colors[i+shift]=0;    // делает видимыми соответствующие точки
     }
   double         Pf0=PfBuffer[k+shift]+0.0000001;
   VerivicationPfBuffer(shift);
   double         Returns[];    // = PfBuffer[i] - PfBuffer[i+1];  
   ArrayResize(Returns,k);
   double SYr=0;                       
   for(int i=0;i<k;i++)
     {
      double R=PfBuffer[i+shift]-PfBuffer[i+shift+1];
      Returns[i]=R;           
      SYr+=R*(k-i);           
     }
   double RET=PfBuffer[shift]-PfBuffer[k+shift]; 
   double b=(k*SYr-Sk*RET)/(k*Sk2-Sk*Sk);
   double Yr[]; ArrayResize(Yr,FullLen);
   for(int i=0; i<FullLen; i++) Yr[i]=(RET*Sk2-Sk*SYr)/(Sk2-Sk*Sk)+b*(FullLen-i-1);
   double Trend1 = (SYr>0 ? 1 : -1);
   double Trend2 = (b>0 ? 1 : -1);
   double Trend3[]; ArrayResize(Trend3,FullLen);
   for(int i=0; i<FullLen; i++) Trend3[i]=(Yr[i]>0 ? 1 : -1);

   double L[],LT[],SL=0,SLT=0;   ArrayResize(L,k);   ArrayResize(LT,k);
   for(int i=0;i<k;i++)
     {
      L[i]=MathLog(MathAbs(Returns[i])/(1.0*(k-i)-0.5));
      SL+=L[i]; 
      LT[i]=(1.0*k-i-0.5)*L[i];
      SLT+=LT[i];  
     }
   double T=(1.0*k*(Sk2-(1.0*k/2+0.25)*k)-1.0*k*k*k*k/4)/((1.0*k*k/2)*SL-k*SLT);
   double D=T*T/MathExp((SL*(Sk2-(k/2+0.25)*k)-(k*k/2)*SLT)/(k*(Sk2-(k/2+0.25)*k)-k*k*k*k/4));
   double SumKK=0; for(int i=0; i<HistoryLen; i++) SumKK+=PfBuffer[i+shift];
   double SPr=0,Pr[]; ArrayResize(Pr,k);
   for(int i=0;i<k;i++)
     {
      Pr[i]=Trend1*ExcelGammaDistr(k-i,2,T)*D;
      SPr+=Pr[i];   
     }
   double Dcorr= fabs((SumKK-(k+1)*Pf0)/SPr)*T*T/MathExp((SL*(Sk2-(1.0*k/2+0.25)*k)-(1.0*k*k/2)*SLT)/(k*(Sk2-(1.0*k/2+0.25)*k)-1.0*k*k*k*k/4));
   switch(Mode)
     {
      case eGammaMode:
        {
         for(int i=0;i<k+FutureLen;i++)
           {
            P1Buffer[i+shift]=(SumKK-Pf0-fabs(SumKK-(k+1)*Pf0)*Trend1 )/k+ExcelGammaDistr(k+FutureLen-i,2,T)*Dcorr*Trend1;            
            P2Buffer[i+shift]=(SumKK-Pf0-fabs(SumKK-(k+1)*Pf0)*Trend2 )/k+ExcelGammaDistr(k+FutureLen-i,2,T)*Dcorr*Trend2;
            P3Buffer[i+shift]=(SumKK-Pf0-fabs(SumKK-(k+1)*Pf0)*Trend3[i] )/k+ExcelGammaDistr(k+FutureLen-i,2,T)*Dcorr*Trend3[i];
           }
         break;
        }
      case eExpMode:
        {
         for(int i=0;i<k+FutureLen;i++)
           {
            P1Buffer[i+shift]=(SumKK-Pf0-fabs(SumKK-(k+1)*Pf0)*Trend1 )/k+(1-(1+(k+FutureLen-i)/T)*MathExp(-(k+FutureLen-i)/T))*Dcorr*Trend1;            
            P2Buffer[i+shift]=(SumKK-Pf0-fabs(SumKK-(k+1)*Pf0)*Trend2 )/k+(1-(1+(k+FutureLen-i)/T)*MathExp(-(k+FutureLen-i)/T))*Dcorr*Trend2;
            P3Buffer[i+shift]=(SumKK-Pf0-fabs(SumKK-(k+1)*Pf0)*Trend3[i] )/k+(1-(1+(k+FutureLen-i)/T)*MathExp(-(k+FutureLen-i)/T))*Dcorr*Trend3[i];
           }
         break;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void VerivicationPfBuffer(int shift)
{
  for (int i=shift; i<shift+k; i++) if (fabs(PfBuffer[i]-PfBuffer[i+1])<0.00000001) PfBuffer[i+1]+=0.000001;
}
//+------------------------------------------------------------------+
//|            Расчёт сдвига точки прогноза                          |
//+------------------------------------------------------------------+
int iShift()
  {
   if(HistoryShift>=0) return HistoryShift;
   else
     {
      return ControlShift;  
     }
  }
void CreatControlLine()
{
  ObjectCreate(0,"iS2_tControl",OBJ_VLINE,0,TimeCurrent(),0);
  ObjectSetInteger(0,"iS2_tControl",OBJPROP_COLOR,DodgerBlue);
  ObjectSetInteger(0,"iS2_tControl",OBJPROP_SELECTABLE,true);
  ObjectSetInteger(0,"iS2_tControl",OBJPROP_WIDTH,1);
}
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
  )
{
  if (id==2 && sparam=="iS4_tControl")
  {
    datetime T= datetime(ObjectGetInteger(0,"iS2_tControl",OBJPROP_TIME));
    datetime dT=TimeCurrent()-T;
    if (dT<0) dT=0;
    datetime TA[]; ArrayResize(TA,10000);
    int res=CopyTime(NULL,0,0,10000,TA);
    ArraySetAsSeries(TA,true);
    for (ControlShift=0;TA[ControlShift]>=T;ControlShift++){;}
    ReCalculate();
  }
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   ArraySetAsSeries(price,true);
// Подкачка и синхронизация буфера индикатора с текущими рыночными ценами
   int limit=rates_total-prev_calculated;
   if(prev_calculated>0) limit++;
   for(int i=0;i<limit;i++)
     {
      PfBuffer[i]=price[i];
     }
   ReCalculate();
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Файлы:
 
yosuf:
Пожалуйста:

это тот что в кодебазе лежит?

как по нему торговать?