Робот для МТ4 по предельно простой системе.
Простейший робот, писали мне под заказ, кому интересно смотрите:
Алгоритм — если цена в 08:00 выше чем в 00:00 — входим на БАЙ, если ниже в 08:00 чем в 00:00 — входим на СЕЛЛ. Стоп=50п, тейк=100п. Сделка закрывается по стопу или тейку, сделки каждый торговый день открываются.
Код:
//+------------------------------------------------------------------+
//| AVLRoboprost.mq4 |
//| AVL |
//| |
//+------------------------------------------------------------------+
#property copyright «AVL»
#property link «Arso»
extern int MAGIC = 777; // Магический номер ордера
extern int SL = 50; // Стоплосс
extern int TP = 100; // Тэйкпрофит
extern double Lots = 0.10; // Объём ордеров
extern int First_hour = 0; //
extern int Second_hour = 8; //
extern int Shift_GMT = 0; // Сдвиг относительно GMT
extern bool ORDERS_COMMENT_on = true; // Если =false тогда Коментарии ордера равны MAGIC иначе ORDERS_COMMENT
extern string ORDERS_COMMENT = «Arso»; // Комментарий для наших ордеров.
extern int _slippage = 3; // Погрешность открытия сделки
int coef=1;
string err_msg;
bool start;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
start=true;
if((First_hour+Shift_GMT) < 0)
{
err_msg = «Ошибка, неверно задан параметр First_hour = » + DoubleToStr(_slippage,0) + «допустимые значения >= 0 »;
start = false;
}
if((First_hour+Shift_GMT) > (Second_hour+Shift_GMT))
{
err_msg = «Ошибка, неверно задан параметр First_hour или Second_hour »;
start = false;
}
if((Second_hour+Shift_GMT) > 23)
{
err_msg = «Ошибка, неверно задан параметр Second_hour » + DoubleToStr(Second_hour,0) + «допустимые значения <= 23 »;
start = false;
}
//--- проверка значения _slippage
if(_slippage < 0)
{
err_msg = «Ошибка, неверно задан параметр _slippage = » + DoubleToStr(_slippage,0) + «допустимые значения >= 0 »;
start = false;
}
//--- проверка значения MAGIC
if(MAGIC == 0)
{
err_msg = «Ошибка, неверно задан параметр MAGIC = » + DoubleToStr(MAGIC,0) + «допустимые значения > 0 »;
start = false;
}
//---
if(!IsExpertEnabled() && !IsTesting())
{
Alert(«Предупреждение. Работа советников не разрешена. Пожалуйста нажмите кнопку \»Советники\"");
}
//---
if(!IsTradeAllowed() && !IsTesting())
{
err_msg = «Предупреждение. Соетнику не разрешено торговать. Проверьте свойства советника.»;
start=false;
}
if(Digits==3 || Digits==5)
coef=10;
if(!start)
{
Print(err_msg);
Comment("\n" + err_msg);
}
else
Print(«Советник начал свою работу»);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Comment("");
Print(«Советник завершил свою работу»);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
if(start==false)
return(0);
while (!IsTradeAllowed()) Sleep(5000);
while (IsTradeContextBusy()) Sleep(5000);
RefreshRates();
if(TimeHour(TimeCurrent())==(Second_hour+Shift_GMT) && TimeMinute(TimeCurrent())<3 && ord_in_market()==false)
{
if(Close[First_hour+Shift_GMT]>Close[Second_hour+Shift_GMT])
OpenSellPosition(SL, TP, Lots, MAGIC);
else if(Close[First_hour+Shift_GMT]<Close[Second_hour+Shift_GMT])
OpenBuyPosition(SL, TP, Lots, MAGIC);
}
//----
return(0);
}
//+------------------------------------------------------------------+
bool ord_in_market()
{
bool in_mrt=false;
for (int i=OrdersTotal()-1;i>=0;i--) //Определяем какие ордера существуют
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
in_mrt=true;
break;
}
}
}
return(in_mrt);
}
//+------------------------------------------------------------------+
bool OpenBuyPosition(int stop_loss, int take_profit, double lot_value, int magic)
//+------------------------------------------------------------------+
{
double sl,tp;
//--- нормализация лота
double lot = NormalizeLot(lot_value);
//--- проврка на наличие свободной маржи
if( AccountFreeMarginCheck(Symbol(),OP_SELL, lot) <= 0 || GetLastError() == 134 )
{
Print(«Недостаточно свободной маржи для открытия ордера»);
return(false);
}
//---
int stop_level = MarketInfo( Symbol(), MODE_STOPLEVEL);
double price = NormalizeDouble(Ask, Digits);
if(stop_loss == 0) sl=0.0;
else sl = NormalizeDouble(MathMin(Ask — stop_loss * coef * Point, Ask — stop_level * Point), Digits);
if(take_profit == 0) tp=0.0;
else tp = NormalizeDouble(MathMax(Ask + take_profit * coef * Point, Ask + stop_level * Point), Digits);
if(OrderSend(Symbol(), OP_BUY, lot, price, _slippage * coef, sl, tp, ORDERS_COMMENT +" "+ DoubleToStr(magic, 0), magic, 0) > 0)
{
return(true); // позиция открыта
}
else
{
int Error = GetLastError(); // Ошибка
switch(Error)
{
case 138: Print(«Ошибка: »,Error," Новые цены.");break;
case 135: Print(«Ошибка: »,Error," Цена изменилась.");break;
case 136: Print(«Нет цен.»); break;
case 146: Print(«Подсистема торговли занята.»);break;
default: Print(«Ошибка: », Error," Выход из подпрограммы.");break;
}// end switch
Sleep(1000);
RefreshRates();
}// end else
return(false);
}
//+------------------------------------------------------------------+
bool OpenSellPosition(int stop_loss,int take_profit,double lot_value, int magic)
//+------------------------------------------------------------------+
{
double sl,tp;
//--- нормализация лота
double lot = NormalizeLot(lot_value);
//--- проврка на наличие свободной маржи
if( AccountFreeMarginCheck(Symbol(),OP_SELL, lot) <= 0 || GetLastError() == 134 )
{
Print(«Недостаточно свободной маржи для открытия ордера»);
return(false);
}
//---
int stop_level = MarketInfo( Symbol(), MODE_STOPLEVEL);
double price = NormalizeDouble(Bid, Digits);
if(stop_loss == 0) sl=0.0;
else sl = NormalizeDouble(MathMax(Bid + stop_loss * coef * Point, Bid + stop_level * Point), Digits);
if(take_profit == 0) tp=0.0;
else tp = NormalizeDouble(MathMin(Bid — take_profit * coef * Point, Bid — stop_level * Point), Digits);
if(OrderSend(Symbol(), OP_SELL, lot, price, _slippage * coef, sl, tp, ORDERS_COMMENT +" "+ DoubleToStr(magic, 0), magic, 0) > 0)
{
return(true); // позиция открыта
}
else
{
int Error = GetLastError(); // Ошибка
switch(Error)
{
case 138: Print(«Ошибка: »,Error," Новые цены.");break;
case 135: Print(«Ошибка: »,Error," Цена изменилась.");break;
case 136: Print(«Нет цен.»); break;
case 146: Print(«Подсистема торговли занята.»);break;
default: Print(«Ошибка: », Error," Выход из подпрограммы.");break;
}// end switch
Sleep(1000);
RefreshRates();
}// end else
return(false);
}
//+------------------------------------------------------------------+
double NormalizeLot(double lot_value)
//+------------------------------------------------------------------+
{
double lot_min = MarketInfo(Symbol(), MODE_MINLOT);
double lot_max = MarketInfo(Symbol(), MODE_MAXLOT);
double lot_step = MarketInfo(Symbol(), MODE_LOTSTEP);
if(lot_value <= lot_min) lot_value = lot_min; // минимальный
else if(lot_value >= lot_max) lot_value = lot_max; // максимальный
else lot_value = MathFloor(lot_value/lot_step)*lot_step; // округлить до ближайшего меньшего
return (NormalizeDouble(lot_value,2)); // нормализация
}