
//+------------------------------------------------------------------+
//| 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();// Вызывим принудительную перерисовку графика
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 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);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 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
}
P.S. Выложенный вами индикатор у меня не фурычит. Пришлите скриншот.
Kudryashov