//+------------------------------------------------------------------+
//| 3.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| _https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "_https://www.mql5.com"
#property version "1.00"
#property strict
extern string HalfTrend = "Параметры советника";
extern double Lots = 0.01;
extern int TakeProfit = 300;
extern int StopLoss = 50;
extern int slippage = 3;
extern int magic = 111;
extern string HalfTrendSov = "Параметры индикатора";
extern int Amplitude = 2;
extern bool ShowBars = true;
extern bool ShowArrows = true;
extern bool alertsOn = true;
extern bool alertsOnCurrent = false;
extern bool alertsMessage = true;
extern bool alertsSound = true;
extern bool alertsEmail = false;
double PriceHigh , PriceLow , SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(Digits == 3 || Digits == 5) // Домножение котировок для 5 - ти и 3 - х знака (Digits - знаки после запятой)
{
TakeProfit *= 10;
StopLoss *= 10;
slippage *= 10;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
PriceHigh = iCustom(NULL, 0 , "HalfTrend" , HalfTrend ,Lots, TakeProfit, StopLoss, slippage, magic, HalfTrend, Amplitude, ShowBars, ShowArrows, alertsOn, alertsOnCurrent, alertsMessage, alertsSound, alertsEmail , 0 , 0); // Вывод переменных
PriceLow = iCustom(NULL, 0 , "HalfTrend" , HalfTrend ,Lots, TakeProfit, StopLoss, slippage, magic, HalfTrend, Amplitude, ShowBars, ShowArrows, alertsOn, alertsOnCurrent, alertsMessage, alertsSound, alertsEmail , 1 , 0); // Вывод переменных
if (CountSell() == 0 && Bid >= PriceHigh) // условие продажт ордера
{
ticket = OrderSend(Symbol(),OP_BUY , Lots , Ask , slippage, 0 , 0 ,"HalfTrent" , magic , 0, Red );
if(ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point , Digits); // Умножено на пойнт потому что в пунктах (выставляется стоплосс) (Модификация ордера по стоплосс)
TP = NormalizeDouble(Bid - TakeProfit * Point , Digits); // (выставляется тейкпрофит) (Модификация ордера по тейкпрофит)
if (OrderSelect(ticket , SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice() , SL, TP, 0)) //Модификация ордера
Print("Ошибка модификации ордера на продажу!!");
}
else Print("Ошибка открытия ордера на продажу!!");
}
//+--------------------------------------------------------------------------------
if(Ask <= PriceLow && CountSell() > 0) // Закрытие ордера на продажу
{
for(int i =OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i , SELECT_BY_POS , MODE_TRADES))
{
if(OrderMagicNumber() == magic && OrderType() == OP_SELL)
if(!OrderClose(OrderTicket() , OrderLots(), Ask, slippage , Black))
Print("Ошибка закрытия ордера на продажу!!");
}
}
}
//+-------------------------------------------------------------------------------------------
if (CountBuy() == 0 && Ask <= PriceLow) // условие покупки ордера Ask - цена для покупки, BID для продажи
{
ticket = OrderSend(Symbol(),OP_BUY , Lots , Ask , slippage, 0 , 0 ,"HalfTrend" , magic , 0, DodgerBlue ); // Тиккет требует возвращающую переменную
if(ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point , Digits); // Умножено на пойнт потому что в пунктах (выставляется стоплосс) (Модификация ордера по стоплосс)
SL = NormalizeDouble(Ask - StopLoss * Point , Digits); // (выставляется тейкпрофит) (Модификация ордера по тейкпрофит)
if (OrderSelect(ticket , SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice() , SL, TP, 0)) //Модификация ордера
Print("Ошибка модификации ордера на покупку!!");
}
else Print("Ошибка открытия ордера на покупку!!");
}
//+-----------------------------------------------------------------------------------------------
if(Bid >= PriceHigh && CountBuy() > 0) // Закрытие ордера на покупку
{
for(int i =OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i , SELECT_BY_POS , MODE_TRADES))
{
if(OrderMagicNumber() == magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket() , OrderLots(), Bid, slippage , Black))
Print("Ошибка закрытия ордера на покупку!!");
}
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0 ;
for(int trade = OrdersTotal()- 1;trade >= 0; trade --) // пересчет ордеров на продажу
{
if(OrderSelect(trade , SELECT_BY_POS , MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+---------------------------------------------------------------------------------------+
int CountBuy()
{
int count = 0 ;
for(int trade = OrdersTotal()- 1;trade >= 0; trade --) // пересчет ордеров на покупку
{
if(OrderSelect(trade , SELECT_BY_POS , MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+---------------------------------------------------------------------------------------------------
//| 3.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| _https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "_https://www.mql5.com"
#property version "1.00"
#property strict
extern string HalfTrend = "Параметры советника";
extern double Lots = 0.01;
extern int TakeProfit = 300;
extern int StopLoss = 50;
extern int slippage = 3;
extern int magic = 111;
extern string HalfTrendSov = "Параметры индикатора";
extern int Amplitude = 2;
extern bool ShowBars = true;
extern bool ShowArrows = true;
extern bool alertsOn = true;
extern bool alertsOnCurrent = false;
extern bool alertsMessage = true;
extern bool alertsSound = true;
extern bool alertsEmail = false;
double PriceHigh , PriceLow , SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(Digits == 3 || Digits == 5) // Домножение котировок для 5 - ти и 3 - х знака (Digits - знаки после запятой)
{
TakeProfit *= 10;
StopLoss *= 10;
slippage *= 10;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
PriceHigh = iCustom(NULL, 0 , "HalfTrend" , HalfTrend ,Lots, TakeProfit, StopLoss, slippage, magic, HalfTrend, Amplitude, ShowBars, ShowArrows, alertsOn, alertsOnCurrent, alertsMessage, alertsSound, alertsEmail , 0 , 0); // Вывод переменных
PriceLow = iCustom(NULL, 0 , "HalfTrend" , HalfTrend ,Lots, TakeProfit, StopLoss, slippage, magic, HalfTrend, Amplitude, ShowBars, ShowArrows, alertsOn, alertsOnCurrent, alertsMessage, alertsSound, alertsEmail , 1 , 0); // Вывод переменных
if (CountSell() == 0 && Bid >= PriceHigh) // условие продажт ордера
{
ticket = OrderSend(Symbol(),OP_BUY , Lots , Ask , slippage, 0 , 0 ,"HalfTrent" , magic , 0, Red );
if(ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point , Digits); // Умножено на пойнт потому что в пунктах (выставляется стоплосс) (Модификация ордера по стоплосс)
TP = NormalizeDouble(Bid - TakeProfit * Point , Digits); // (выставляется тейкпрофит) (Модификация ордера по тейкпрофит)
if (OrderSelect(ticket , SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice() , SL, TP, 0)) //Модификация ордера
Print("Ошибка модификации ордера на продажу!!");
}
else Print("Ошибка открытия ордера на продажу!!");
}
//+--------------------------------------------------------------------------------
if(Ask <= PriceLow && CountSell() > 0) // Закрытие ордера на продажу
{
for(int i =OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i , SELECT_BY_POS , MODE_TRADES))
{
if(OrderMagicNumber() == magic && OrderType() == OP_SELL)
if(!OrderClose(OrderTicket() , OrderLots(), Ask, slippage , Black))
Print("Ошибка закрытия ордера на продажу!!");
}
}
}
//+-------------------------------------------------------------------------------------------
if (CountBuy() == 0 && Ask <= PriceLow) // условие покупки ордера Ask - цена для покупки, BID для продажи
{
ticket = OrderSend(Symbol(),OP_BUY , Lots , Ask , slippage, 0 , 0 ,"HalfTrend" , magic , 0, DodgerBlue ); // Тиккет требует возвращающую переменную
if(ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point , Digits); // Умножено на пойнт потому что в пунктах (выставляется стоплосс) (Модификация ордера по стоплосс)
SL = NormalizeDouble(Ask - StopLoss * Point , Digits); // (выставляется тейкпрофит) (Модификация ордера по тейкпрофит)
if (OrderSelect(ticket , SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice() , SL, TP, 0)) //Модификация ордера
Print("Ошибка модификации ордера на покупку!!");
}
else Print("Ошибка открытия ордера на покупку!!");
}
//+-----------------------------------------------------------------------------------------------
if(Bid >= PriceHigh && CountBuy() > 0) // Закрытие ордера на покупку
{
for(int i =OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i , SELECT_BY_POS , MODE_TRADES))
{
if(OrderMagicNumber() == magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket() , OrderLots(), Bid, slippage , Black))
Print("Ошибка закрытия ордера на покупку!!");
}
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0 ;
for(int trade = OrdersTotal()- 1;trade >= 0; trade --) // пересчет ордеров на продажу
{
if(OrderSelect(trade , SELECT_BY_POS , MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+---------------------------------------------------------------------------------------+
int CountBuy()
{
int count = 0 ;
for(int trade = OrdersTotal()- 1;trade >= 0; trade --) // пересчет ордеров на покупку
{
if(OrderSelect(trade , SELECT_BY_POS , MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+---------------------------------------------------------------------------------------------------
Ребята подскажите почему на каждом баре происходит открытие и закрытие ордера? если можно то кусок исправления...делал вывод по стрелке
Последнее редактирование модератором: