0
Это я думаю на сколько это возможно.
P.S. Выложенный вами индикатор у меня не фурычит. Пришлите скриншот.
avatar

Kudryashov

  • 5 марта 2020, 18:41
0
Это было адресовано Андрею… Так как хотелось бы узнать какая разница между перерисовывающийся и не перерисовывающийся индикатор на уровне алгоритма*uptrend* 
avatar

Kudryashov

  • 5 марта 2020, 13:22
0

до гения мне далековато… я говорил что это хобби… это я изучаю в свободное время… то что получилось одно не значит что получиться другое… однако я посмотрю что можно сделать, но сильно не надейтесь!
П.С.долго отвечал из за того что срисовывал*crazy* 
avatar

Kudryashov

  • 1 марта 2020, 20:58
0
*think*  *think*  *think* 
И не поспоришь8-) 
Аригато!!!*hi* 
avatar

Kudryashov

  • 28 февраля 2020, 10:50
+3
2. Советник:

//+------------------------------------------------------------------+
//|                                           Line_Open_Position.mq4 |
//|                              Copyright 2020, Dmitriy Kudryashov. |
//|                       https://www.mql5.com/ru/users/dlim0n4ik.dk |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Dmitriy Kudryashov."
#property link      "https://www.mql5.com/ru/users/dlim0n4ik.dk"
#property version   "200.227"
#property strict
#define MAGIC 7710067
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else                                    CheckForClose();
if(Volume[0] > 1) return;
else Print("Функция OnTick() - РАБОТАЕТ!");
//CheckForOpen();
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int position = 0;
int buys=0,sells=0;
//---
for(int i=0;i<OrdersTotal();i++)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
      {
      if(OrderType()==OP_BUY || OrderType()==OP_SELL) position++;
      }
   }
//--- return orders volume
return(position);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double line_price;
//--- go trading only for first tiks of new bar
//if(Volume[0] > 1) return;
//Print("Функция CheckForOpen() - РАБОТАЕТ!" + ObjectsTotal());
for(int index = ObjectsTotal()-1; index >= 0; index--)
   {
   //Print("CheckForOpen() - Количество объектов на графике: " + ObjectsTotal());
   if (ObjectType(ObjectName(index))== OBJ_HLINE)
      {
      line_price=NormalizeDouble(ObjectGet(ObjectName(index),OBJPROP_PRICE1),Digits);
      Print("CheckForOpen() - Найден объект: ЛИНИЯ ЦЕНЫ(" + ObjectName(index)+") = " + DoubleToStr(line_price,Digits));
      if (ObjectName(index) == "BUY" && line_price < Bid)
         {
         int ticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,0,"",MAGIC,0,clrGreen);
         if (ticket > 0) Print("CheckForOpen() - Открыта позиция OP_BUY с номером:" + StringConcatenate(ticket));
         }
      if (ObjectName(index) == "SELL" && line_price > Bid)
         {
         int ticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,3,0,0,"",MAGIC,0,clrRed);
         if (ticket > 0) Print("CheckForOpen() - Открыта позиция OP_SELL с номером:" + StringConcatenate(ticket));
         }
      }
   }
//Comment(com);
ChartRedraw();// Вызывим принудительную перерисовку графика
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
{
//--- go trading only for first tiks of new bar
//if(Volume[0]>1) return;
//---
double line_price;
int ticket;
for(int index = ObjectsTotal()-1; index >= 0; index--)
   {
   //Print("CheckForClose() - Количество объектов на графике: " + ObjectsTotal());
   if (ObjectType(ObjectName(index))==OBJ_HLINE)
      {
      line_price=NormalizeDouble(ObjectGet(ObjectName(index),OBJPROP_PRICE1),Digits);
      Print("CheckForClose() - Найден объект: ЛИНИЯ ЦЕНЫ(" + ObjectName(index)+") = " + DoubleToStr(line_price,Digits));
      for(int position = 0; position < OrdersTotal(); position++)
         {
         if(OrderSelect(position,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         ticket = OrderTicket();
         Print("CheckForClose() - Найдена открытая позиця, номер: " + StringConcatenate(ticket));
         if(OrderType()==OP_BUY)
            {
            if(ObjectName(index) == "SELL" && line_price > Bid)
               {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("CheckForClose() - Ошибка закрытия позиции, номер: " + StringConcatenate(ticket) + ". Ошибка:",GetLastError());
               }
            break;
            }
         if(OrderType() == OP_SELL)
            {
            if(ObjectName(index) == "BUY" && line_price < Bid)
               {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("CheckForClose() - Ошибка закрытия позиции, номер: " + StringConcatenate(ticket) + ". Ошибка:",GetLastError());
               }
            break;
            }
         }
      }
   }
ChartRedraw();// Вызывим принудительную перерисовку графика
//---
}
//+------------------------------------------------------------------+
avatar

Kudryashov

  • 28 февраля 2020, 08:54
+1
1. Индикатор:

//+------------------------------------------------------------------+
//|                                            SixtySecondTrades.mq4 |
//|                              Copyright 2020, Dmitriy Kudryashov. |
//|                       https://www.mql5.com/ru/users/dlim0n4ik.dk |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Dmitriy Kudryashov."
#property link      "https://www.mql5.com/ru/users/dlim0n4ik.dk"
#property version   "200.227"
#property strict

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red


//+------------------------------------------------------------------+
//|   Блок вводимых параметров                                       |
//+------------------------------------------------------------------+
extern int ADXbars = 14;            //Период ADX
extern int CountBars = 350;         //Количество баров для отрисовки
extern string SoundFile="Alert.wav";//Файл звука оповещений (Alerts)
extern bool UseSound=true;          //Использовыать звуковое оповещения
bool SoundBuy = false;
bool SoundSell = false;
double up_buffer[];
double down_buffer[];
double adx_plusdi_1;
double adx_plusdi_0;
double adx_minusdi_1;
double adx_minusdi_0;
int trigger = 0;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция инициализации программы                                |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 108);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 108);
SetIndexBuffer(0, up_buffer);
SetIndexBuffer(1, down_buffer);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция деинициализации программы                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--------------------------------------------------------------------
//ObjectDelete("info_copyright");
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 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
                )
{
//
//string com;
//com += rates_total + "\n";
//com += prev_calculated + "\n";
//com += Bars + "\n";
//com += IndicatorCounted() + "\n";
//Comment(com);
//--------------------------------------------------------------------
//if(Bars <= 100)     // Проверим количества баров для расчётов
//   {
//   Print("There are not enough bars in history to calculate.");
//   return (rates_total);    
//   }
//--------------------------------------------------------------------
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars);
SetIndexDrawBegin(1, Bars - CountBars);
//--------------------------------------------------------------------
int ExtCountedBars = IndicatorCounted();  // Получим количества уже посчитанных баров
if(ExtCountedBars < 0) return (-1);       // Проверим на возможные ошибки в подсчетах
//--------------------------------------------------------------------
if (ExtCountedBars < 1)
   {
   for (int clear_bars = 1; clear_bars <= CountBars; clear_bars++)
      {
      up_buffer[CountBars - clear_bars] = 0.0;
      down_buffer[CountBars - clear_bars] = 0.0;
      }
   //for (int clear_bars = 1; clear_bars <= CountBars; clear_bars++) down_buffer[CountBars - clear_bars] = 0.0;
   }
//--------------------------------------------------------------------
for (int index = CountBars; index >= 0; index--)
   {
   //--- Расчет индикатора ADX на текущем баре
   adx_plusdi_0 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_PLUSDI, index);
   adx_minusdi_0 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_MINUSDI, index);
   //--- Расчет индикатора ADX на предыдущем баре
   adx_plusdi_1 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_PLUSDI, index - 1);
   adx_minusdi_1 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_MINUSDI, index - 1);
   //--- Условие для стрелки вверх
   if (adx_plusdi_1 > adx_minusdi_1 && adx_plusdi_0 < adx_minusdi_0)
      {
      up_buffer[index] = Low[index] - 5.0 * Point; // Нарисуем стрелку вверх под ценой Low
      if (trigger != 1)
         {
         ObjectDelete(0,"SELL");
         trigger = 1;
         HLine("BUY",up_buffer[index],clrGreen);
         }
      }
   //--- Условие для стрелки вниз
   if (adx_plusdi_1 < adx_minusdi_1 && adx_plusdi_0 > adx_minusdi_0)
      {
      down_buffer[index] = High[index] + 5.0 * Point; // Нарисуем стрелку вверх под ценой High
      if (trigger != 2)
         {
         ObjectDelete(0,"BUY");
         trigger = 2;
         HLine("SELL",down_buffer[index],clrRed);
         }
      }
   }
//--------------------------------------------------------------------
//--- Условие для срабатывания оповещения на ПОКУПКУ -----------------
if (up_buffer[1] != EMPTY_VALUE && up_buffer[1] != 0 && SoundBuy) // Если буфер ВВЕРХ не пустой и не имеет значение 0 и звук покупки ИСТИНА
   {
   SoundBuy = false; //Звук на покупку ЛОЖНО (Оповещение сработало)
   if (UseSound) PlaySound (SoundFile);   // Выполнить проигрование звукового файла оповещения
   Alert("Sixty_Second_Trades(", Symbol(), ", ", Period(), ") — BUY!!!"); // Сообщение оповещения
   
   }
if (!SoundBuy && (up_buffer[1] == EMPTY_VALUE || up_buffer[1] == 0)) SoundBuy = true; //
//--------------------------------------------------------------------
//--- Условие для срабатывания оповещения на ПРОДАЖУ -----------------
if (down_buffer[1] != EMPTY_VALUE && down_buffer[1] != 0 && SoundSell)// Если буфер ВНИЗ не пустой и не имеет значение 0 и звук продажу ИСТИНА
   {
   SoundSell = false;//Звук на продажу ЛОЖНО (Оповещение сработало)
   if (UseSound) PlaySound (SoundFile);   // Выполнить проигрование звукового файла оповещения
   Alert("Sixty_Second_Trades (", Symbol(), ", ", Period(), ") — SELL!!!");// Сообщение оповещения
   }
if (!SoundSell && (down_buffer[1] == EMPTY_VALUE || down_buffer[1] == 0)) SoundSell = true;//
//--------------------------------------------------------------------
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция сощдание линии цены                                    |
//+------------------------------------------------------------------+
void HLine(string name, //Имя линии
           double price,//Цена
           color col    //Цвет линии
           )
{
if(ObjectFind(0,name)==-1)
   {
   ObjectCreate(0,name,OBJ_HLINE,0,0,price);
   ObjectSetInteger(0,name,OBJPROP_COLOR,col);
   }
else
   {
   ObjectMove(0,name,0,0,price);
   ObjectSetInteger(0,name,OBJPROP_COLOR,col);
   }
}
//+------------------------------------------------------------------+
avatar

Kudryashov

  • 28 февраля 2020, 08:53
+2
Значит так… Представленные ниже индикатор и советник должны быть помещены на один график. Индикатор создает линию, а советник ее анализирует и открывает соответствующую позицию. В общем… Я Дима и я извращенец!*haha* 
avatar

Kudryashov

  • 28 февраля 2020, 08:53
0
:D  :D  :D 
Да я сам ржу пол дня… Над решением которое я придумал:D 
Ощущение что я изнасиловал mql таким примитивом *haha* 
avatar

Kudryashov

  • 27 февраля 2020, 23:47
0
Наверно самый обсуждаемый заказ:D 
avatar

Kudryashov

  • 27 февраля 2020, 23:33
0
Код сущесьвует… Иначе эта функция не работал… Только этот код известен разработчикам mt.
avatar

Kudryashov

  • 27 февраля 2020, 23:29
0
Только сейчас сообразил :D 
Значение цены 1653… А в советнике заложено не magenta < 1000 и больше 0.
Так что советник не рассчитан под золото и индексы у которых до запятой бывают значения больше 1000:D 
avatar

Kudryashov

  • 27 февраля 2020, 23:26
0
когда +DI < -DI на предредыдущем быре и +DI > -DI на текущем баре то продажа
avatar

Kudryashov

  • 27 февраля 2020, 23:16
0
Нет. Условия простые когда +DI > -DI на предредыдущем быре и +DI < -DI на текущем баре то покупка.
avatar

Kudryashov

  • 27 февраля 2020, 23:15
0
Походу тоже… Но решение я вроде нашел...*wall* 
avatar

Kudryashov

  • 27 февраля 2020, 22:56
0
Блин… С мобилу неудобненько коды писать =.=
avatar

Kudryashov

  • 27 февраля 2020, 22:54
0
В вашем индикаторе реализована распространенная стратегия… По пересечению ADX



//+------------------------------------------------------------------+
//|                                            SixtySecondTrades.mq4 |
//|                              Copyright 2020, Dmitriy Kudryashov. |
//|                       https://www.mql5.com/ru/users/dlim0n4ik.dk |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Dmitriy Kudryashov."
#property link      "https://www.mql5.com/ru/users/dlim0n4ik.dk"
#property version   "200.226"
#property strict

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red


//+------------------------------------------------------------------+
//|   Блок вводимых параметров                                       |
//+------------------------------------------------------------------+
extern int ADXbars = 14;            //Период ADX
extern int CountBars = 350;         //Количество баров для отрисовки
extern string SoundFile="Alert.wav";//Файл звука оповещений (Alerts)
extern bool UseSound=true;          //Использовыать звуковое оповещения
bool SoundBuy = false;
bool SoundSell = false;
double up_buffer[];
double down_buffer[];
double adx_plusdi_1;
double adx_plusdi_0;
double adx_minusdi_1;
double adx_minusdi_0;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция инициализации программы                                |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 108);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 108);
SetIndexBuffer(0, up_buffer);
SetIndexBuffer(1, down_buffer);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция деинициализации программы                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--------------------------------------------------------------------
//ObjectDelete("info_copyright");
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 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
                )
{
//
//string com;
//com += rates_total + "\n";
//com += prev_calculated + "\n";
//com += Bars + "\n";
//com += IndicatorCounted() + "\n";
//Comment(com);
//--------------------------------------------------------------------
//if(Bars <= 100)     // Проверим количества баров для расчётов
//   {
//   Print("There are not enough bars in history to calculate.");
//   return (rates_total);    
//   }
//--------------------------------------------------------------------
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars);
SetIndexDrawBegin(1, Bars - CountBars);
//--------------------------------------------------------------------
int ExtCountedBars = IndicatorCounted();  // Получим количества уже посчитанных баров
if(ExtCountedBars < 0) return (-1);       // Проверим на возможные ошибки в подсчетах
//--------------------------------------------------------------------
if (ExtCountedBars < 1)
   {
   for (int clear_bars = 1; clear_bars <= CountBars; clear_bars++)
      {
      up_buffer[CountBars - clear_bars] = 0.0;
      down_buffer[CountBars - clear_bars] = 0.0;
      }
   //for (int clear_bars = 1; clear_bars <= CountBars; clear_bars++) down_buffer[CountBars - clear_bars] = 0.0;
   }
//--------------------------------------------------------------------
for (int index = CountBars; index >= 0; index--)
   {
   //--- Расчет индикатора ADX на текущем баре
   adx_plusdi_0 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_PLUSDI, index);
   adx_minusdi_0 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_MINUSDI, index);
   //--- Расчет индикатора ADX на предыдущем баре
   adx_plusdi_1 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_PLUSDI, index - 1);
   adx_minusdi_1 = iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_MINUSDI, index - 1);
   //--- Условие для стрелки вверх
   if (adx_plusdi_1 > adx_minusdi_1 && adx_plusdi_0 < adx_minusdi_0)
      {
      up_buffer[index] = Low[index] - 5.0 * Point; // Нарисуем стрелку вверх под ценой Low
      }
   //--- Условие для стрелки вниз
   if (adx_plusdi_1 < adx_minusdi_1 && adx_plusdi_0 > adx_minusdi_0)
      {
      down_buffer[index] = High[index] + 5.0 * Point; // Нарисуем стрелку вверх под ценой High
      }

avatar

Kudryashov

  • 27 февраля 2020, 22:50