Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1607

 
Андрей #:

Доброй ночи!

Уважаемые форумчане, нужна помощь. В бородатом году написал скрипт на MQL4, который по трем заданным точкам на графике чертит линию по формуле. Занимает он 130 строк, включая отступы и пробелы. Недавно захотел перенести на MQL5 и понял, что и без того небогатые знания в программировании здесь не помогут, надо учиться заново.

Ошибка в коде zero divide, исправьте её для начала

a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);

Здесь деление на "0", так как х1 и х2 равны "1", что в результате равно "0"

Сделайте проверку перед мат.операцией

 
Manter84 #:

А ты шутник. А проблема реально есть, и темы есть о том что команда Print печатает по два раза во вкладке Эксперты и Аллерт тоже приходит дважды, только ответа в ней нет увы как это исправить. И на будущее, если не в курсе просто можно промолчать и пройти мимо, а набирать себе рейтинг  непрофессиональными ответами это глупо. Да, кстати, ответы твои реально очень слабоваты. 

Каков вопрос, таков и ответ.
 
Андрей #:

Доброй ночи!

Уважаемые форумчане, нужна помощь. В бородатом году написал скрипт на MQL4, который по трем заданным точкам на графике чертит линию по формуле. Занимает он 130 строк, включая отступы и пробелы. Недавно захотел перенести на MQL5 и понял, что и без того небогатые знания в программировании здесь не помогут, надо учиться заново.

Буду благодарен, если кто-то возьмется перенести скрипт на MQL5. О цене договоримся, пишите в личку.

Если писал скрипт, то зачем в коде это

 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   {SetIndexBuffer(0,Buffer1);
   SetIndexStyle(0,DRAW_LINE);
 //---- indicators
 //----
    return(0);
   }
 
#property indicator_chart_window
int            FR_handle;
int OnInit()
  {

    FR_handle = iFractals(NULL,PERIOD_CURRENT);
   return(INIT_SUCCEEDED);

  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
    Print("Проверка 111 "); 
    return(rates_total);
  }
Alexey Viktorov #
:
Каков вопрос, таков и ответ.

Ну просто можно было написать что больше подробностей надо. Вот написал код простейшего индюка (проще просто некуда), так он тоже два сообщения при команде Print выдает. Причем если убрать получение Handle, то выдает одно. 

***

Файлы:
111.png  15 kb
 
Alexey Viktorov #:

Если писал скрипт, то зачем в коде это

Поскольку навыки программирования на уровне школьника, то брал какой-то работающий кусок кода и правил из него. Что не мешало, не трогал)
 
Manter84 #:

Ну просто можно было написать что больше подробностей надо. Вот написал код простейшего индюка (проще просто некуда), так он тоже два сообщения при команде Print выдает. Причем если убрать получение Handle, то выдает одно.

Жесть… В моём словарном запасе остались только нецензурные слова. Поэтому я лучше промолчу.

 
Андрей #:
Поскольку навыки программирования на уровне школьника, то брал какой-то работающий кусок кода и правил из него. Что не мешало, не трогал)

Понятно.

Андрей #:
Если кто-то поможет, в любом случае  с меня вискарь!))

Я так думаю, виски из ……… сто́ят не дешевле $30. Следовательно проще создать заявку во фрилансе и там будет желающих, штук 20… А этим своим сообщением вы провоцируете людей на нарушение правил. А кому оно надо? Ну сделают бесплатно, а потом что? Ведь конкретно бутылку вы не передадите, следовательно это работа за деньги в обход фриланса.

 
Андрей #:

#property strict
//+------------------------------------------------------------------+
#property indicator_chart_window
 #property indicator_buffers 1
 #property  indicator_color1 clrBlue
 #property  indicator_width1 2
 #property  indicator_style1 0
 
#property indicator_label1  "3T" 
#property indicator_type1   DRAW_LINE 

#property indicator_style1  STYLE_SOLID 


#define Point _Point
#define Period()  _Period
#define Symbol  _Symbol
#define TimeToStr TimeToStruct



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.


#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
  CLASS##NAME NAME;                                                                                           \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
//+------------------------------------------------------------------+





 double     Buffer1[];
 //+------------------------------------------------------------------+
 //| Объявляем внешние переменные                                     |
 //+------------------------------------------------------------------+
 datetime point_1;
 datetime point_2;
 datetime point_3;
 datetime LastBarTime;
 string line_name[10];
 int gg=1;
 int x1;
 int x2;
 int x3;
 int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.
 int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.
 int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.
 int max;
 int maxx;
 double y1;
 double y2;
 double y3;
 double y11;
 double y22;
 double y33;
 double x11;
 double x22;
 double x33;
 double y;
 double a1;
 double a2;
 double a3;

bool Deinit = true;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 

MqlDateTime str;
//--------------------------------------------------------------------
int OnInit()                             // Специальная функция init()
  {
   {SetIndexBuffer(0,Buffer1);
   
 //---- indicators
 //----
    return(0);
   }
  
   return(INIT_SUCCEEDED);                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

  {
   // Пересчитываем инликатор только при появлении нового бара
   if(LastBarTime == iTime(Symbol, 0, 0))
      return(0);
    LastBarTime = iTime(Symbol, 0, 0);
   
   
 // Присваиваем значения переменных времени


 int obj_total=ObjectsTotal(0,0,-1);

   for(int ii=0;ii<100;ii++)
     {string name = ObjectName(0,0,ii,OBJ_VLINE);
       if(ObjectGetInteger(0, name,OBJPROP_TYPE)!=OBJ_VLINE)
       continue;
       line_name[gg] = ObjectName(0,0,ii,OBJ_VLINE);
       gg=gg+1;
     
     }
    
   
    point_1=ObjectGetTimeByValue(0,line_name[1],0, OBJPROP_TIME);
    point_2=ObjectGetTimeByValue(0,line_name[2],0, OBJPROP_TIME);
    point_3=ObjectGetTimeByValue(0,line_name[3],0, OBJPROP_TIME);
   
 // Запоминаем текущий номер бара вершины

 xx1=x1; 
    
 //Определяем номера баров ключевых точек
   for (int j=0;j<500; j++)
   { if (Time[j]==point_1) x1=j;}
  
  
   // Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.
 if (x1==xx1) x1=x1+1;
  
  
 xx2=x2;
  
   for (int k=0;k<500; k++)
   {if (Time[k]==point_2) x2=k;  }
  
 if (x2==xx2) x2=x2+1;
  
 xx3=x3;

   for (int l=0;l<500; l++)
   {if (Time[l]==point_3) x3=l; }
  
 if (x3==xx3) x3=x3+1;

 // Comment ("n1=", j," n2=", k, " n3=", l);
 //Находим "высоту" вершин
   {
   y1=High[x1];
   y2=High[x2];
   y3=High[x3];
   //Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);
   //Принимаем первую из них за начало координат
  
 a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
 a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
 a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;

 max=MathMax(x1,x2);
 maxx=MathMax(max,x3);
  
  
   for (int i=maxx; i>=0; i--)
  
   { y=a1*i*i+a2*i+a3;
   Buffer1[i]=y;}
  

    return(0);
   }


//--------------------------------------------------------------------
   return(rates_total);                           // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
void OnDeinit(const int reason)
  {

   if( Deinit == true)                         // Стираем  с графика, если включена функция очистки графика
     {
      int obj_total=ObjectsTotal(0,0,-1);
      PrintFormat("Всего %d объектов",obj_total);
      for(int i=obj_total-1; i>=0; i--)
        {
         string name=ObjectName(0,i,-1,-1);
         //         PrintFormat("Объект %d: %s",i,name);
         ObjectDelete(0,name);
        }
     }
     Comment("");
//--- destroy timer
   EventKillTimer();

  }


//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

Ошибок нет, но функция определения времени не правильно подставил, времени не хватило) 

И поверку деления на ноль лучше в 5ке делать обязательно, перед операцией деления Если делитель равен нулю, то....

 
Manter84 #:

Да, кстати, ответы твои реально очень слабоваты. 

Manter84 #:

Вот написал код простейшего индюка (проще просто некуда)

В слове из 6 букв 5 ошибок...

а я "слабоват" чтобы тебя поправлять.

 
Alexey Viktorov #:

Жесть… В моём словарном запасе остались только нецензурные слова. Поэтому я лучше промолчу.

Тебе то что плохого я сделал. Или вы тут все такие агрессивные?

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