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

 
DYM:

Что-то у меня не получается, понимаю что точка привязки price1, но ума не хватает составить условие. Мой вариант не работает.

Этот участок

           double a=ObjectGetDouble(id,name,OBJPROP_PRICE1);
           double b=ObjectGetDouble(id,name,OBJPROP_PRICE2);
             if(b!=a) 
           {
            ObjectSetDouble(id,name,OBJPROP_PRICE2,a);
           }

надо ставить в OnTimer()

 

кто-нить в курсе можно ли отключить отдельные предупреждение компилятора ?

а то 

"declaration of 'XXxx' hides global variable"

достали..



 
Maxim Kuznetsov:

кто-нить в курсе можно ли отключить отдельные предупреждение компилятора ?

а то 

"declaration of 'XXxx' hides global variable"

достали..

Нельзя

 
MakarFX:

Этот участок

надо ставить в OnTimer()

Спасибо большое за помощь. Кажется понял как это условие работает. К сожалению очень мало информации по работе с функцией OnTimer(), но вроде нашел одну подсказку и условие заработало. Вот только такая работа функции разве не забъет всю память компьютера если поставить срабатывание в милисекундах?

Вот что получилось:

extern ENUM_LINE_STYLE  line_st   =  STYLE_SOLID;         // 9. Стиль линий
extern int              line_wd   =  2;                   // 10. Толщина линий

// Координаты
extern int x_coor = 7;    // Сдвиг по оси X
extern int y_coor = 10;    // Сдвиг по оси Y

string nameline;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
      EventSetMillisecondTimer(500);
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
    //RefreshRates();
       double a=ObjectGetDouble(ChartID(),nameline,OBJPROP_PRICE1);
       double b=ObjectGetDouble(ChartID(),nameline,OBJPROP_PRICE2);
       if(b!=a) 
         {
            ObjectSetDouble(ChartID(),nameline,OBJPROP_PRICE2,a);
            Print("Работает - функция");
         }         
         else
            {
              Print("Не работает - функция");
            }
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
  
   datetime dt1     = 0;
   double   price1  = 0;
   datetime dt2     = 0;
   double   price2  = 0;
   int      window   = 0;
   int      x        = 0;
   int      y        = 0;

//+------------------------------------------------------------------+ 
      //--- Клик по 1 линии
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickObject=sparam;
      if(clickObject==line[0])
        {
        nameline="line_"+IntegerToString(MathRand()+100,0,' ');

         y=200;
         ChartXYToTimePrice(0,25,y,window,dt1,price1);
         ChartXYToTimePrice(0,147,y,window,dt2,price2);

         TrendCreate(0,nameline,0,dt1,price1,dt2,price2,color1,line_st,line_wd,false,true,false,false,false,0);
         
        }

     }
}

void OnDeinit(const int reason)
  {
   Comment("");
   EventKillTimer();

  }
 
DYM:

Спасибо большое за помощь. Кажется понял как это условие работает. К сожалению очень мало информации по работе с функцией OnTimer(), но вроде нашел одну подсказку и условие заработало. Вот только такая работа функции разве не забъет всю память компьютера если поставить срабатывание в милисекундах?

Вот что получилось:

не забьет... и лучше так сделать

   if(b!=a) 
     {
      if(ObjectSetDouble(ChartID(),nameline,OBJPROP_PRICE2,a))
        {
         Print("Работает - функция");
        }
      else
        {
         Print("Ошибка-",GetLastError());
        }
     }
 
MakarFX:

не забьет... и лучше так сделать

Огромное спасибо!

 
MakarFX:

не забьет... и лучше так сделать

А лучше так:

   if(b!=a) 
     {
      if(!ObjectSetDouble(ChartID(),nameline,OBJPROP_PRICE2,a))
         Print("Ошибка-",GetLastError());
     }
 
Vitaly Muzichenko:

А лучше так:

Спасибо.
 

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

вот статья на которую я опирался - http://mql.su/2017/11/lesson11-first-indicator/

Я хотел сделать свой индикатор на основе показаний rsi. но на скрине видно что из этого получилось.

Я конечно в этом деле очень далек но мне кажется что я делаю что-то не так )))))))))

За меня делать не нужно просто подскажите где и что добавить и заменить!

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_separate_window  // Индик. рисуется в основном окне
//////////////////////////////////////////
#property indicator_buffers 2   // Сообщаем о том, что у нас будет два буфера
#property indicator_color1 Lime // Цвет стрелки для покупок
#property indicator_color2 Red  // Цвет стрелки для продаж


double Buy[];                   // Буфер для покупок
double Sell[];                  // Буфер для продаж

#define BUY 0
#define SELL 1

input int per = 14;
input int verx = 70;
input int niz = 30;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
     // Установим связь наших массивов с буферами индикатора
   SetIndexBuffer (0, Buy);
   SetIndexBuffer (1, Sell);  
   
    // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   
     //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   
     // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 233);  // Стрелка "вверх" для покупок
   SetIndexArrow(1, 234);  // Стрелка "вниз" для продаж
   
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Покупаем");
   SetIndexLabel(1, "Продаём");
//---
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   // Вычислим кол-во не измененных баров с последнего вызова индикатора
   int counted_bars = IndicatorCounted();
   int limit, signal;
   
   //Пересчитаем последний посчитанный бар
   if (counted_bars>0) 
       counted_bars-- ;
       
   //Определяем число баров, которые следует пересчитать
   limit=Bars-counted_bars;
   
   // Чтобы индикатор "не перерисовывался" расчет ведем с последнего закрытого бара(он имеет индекс равный 1)
   // нулевой бар является текущим, т.е. он изменяется с каждым новым тиком до тех пор пока не будет закрыт
   
   for(int i = 2; i < limit; i++)  
   {
         //Проверяем сигнал на вход для текущего бара
         signal = Signal(i-1);
         
         if (signal == BUY)
         {
            Buy[i-1] = low[i-1];
         }
         else   
         if (signal == SELL)
         {
            Sell[i-1] = high[i-1];
         }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 int Signal(int i)
{
  // Снимем показания индикатора
   double Current   = iRSI(NULL, 0, per, PRICE_CLOSE, i);
   double Previous    = iRSI(NULL, 0, per, PRICE_CLOSE, i+1);
   
    double SCurrent   = iRSI(NULL, 0, per, PRICE_CLOSE, i);
     // Для предыдущего бара
   double SPrevious    = iRSI(NULL, 0, per, PRICE_CLOSE, i+1);
      // А теперь проверим всловия для наличия сигналов
   
   // есть сигнал на покупку?
   if(per >= verx && Close[1]<Open[1])
   
   return(BUY);
   
   if(per <= verx && Close[1]>Open[1])
    return(SELL);
   
   // Сигнала нет   
   return(-1);
   }
Урок №11: Пишем индикатор
Урок №11: Пишем индикатор
  • 2017.11.08
  • admin
  • mql.su
На этом уроке мы напишем простой индикатор, который в дальнейшем будем использовать при разработке советника. А использовать для получения сигнала мы будем уже существующие — Moving Average и MACD. Алгоритм следующий: Определять направление сделки (покупка или продажа) мы будем по индикатору Moving Average с периодом 100 на дневном...
Файлы:
 
jarikn:

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

вот статья на которую я опирался - http://mql.su/2017/11/lesson11-first-indicator/

Я хотел сделать свой индикатор на основе показаний rsi. но на скрине видно что из этого получилось.

Я конечно в этом деле очень далек но мне кажется что я делаю что-то не так )))))))))

За меня делать не нужно просто подскажите где и что добавить и заменить!

   if(per >= verx && Close[1]<Open[1])
   
   return(BUY);
   
   if(per <= verx && Close[1]>Open[1])
    return(SELL);

Не то сравниваешь вместо "per"должны быть показания rsi

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