Советник "МТ45" или как написать эксперт, который будет работать на МТ4 и на МТ5 |
#ifdef identifier
// код, находящийся здесь, компилируется, если identifier уже был определен для препроцессора в команде <b>#define</b>.
#endif
#ifdef __MQL5__
#define OrdersTotal PositionsTotal
#endif
input int Stop = 300; // лось
input int Take = 400; // язь
input int Slip = 100; // реквот
input int MN = 123; // магик
input double LT = 1; // лот
//+------------------------------------------------------------------+
//| совершает покупку |
//+------------------------------------------------------------------+
bool Buy(double price,double sl,double tp)
{
//--- покупка в MQL4
#ifdef __MQL4__
int ticket=OrderSend(Symbol(),0,LT,price,Slip,sl,tp,"",MN);
if(ticket<0)
PrintFormat("OrderSend error %d",GetLastError());
#endif
//--- покупка в MQL5
#ifdef __MQL5__
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =LT; // объем
request.type =0; // тип ордера
request.price =price; // цена для открытия
request.sl =sl; // цена StopLoss
request.tp =tp; // цена TakeProfit
request.deviation=Slip; // допустимое отклонение от цены
request.magic =MN; // MagicNumber ордера
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
#endif
//---
return(false);
}
//+------------------------------------------------------------------+
//| совершает продажу |
//+------------------------------------------------------------------+
bool Sell(double price,double sl,double tp)
{
//--- продажа в MQL4
#ifdef __MQL4__
int ticket=OrderSend(Symbol(),1,LT,price,Slip,sl,tp,"",MN);
if(ticket<0)
PrintFormat("OrderSend error %d",GetLastError());
#endif
//--- продажа в MQL5
#ifdef __MQL5__
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =LT; // объем
request.type =1; // тип ордера
request.price =price; // цена для открытия
request.sl =sl; // цена StopLoss
request.tp =tp; // цена TakeProfit
request.deviation=Slip; // допустимое отклонение от цены
request.magic =MN; // MagicNumber ордера
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
#endif
//---
return(false);
}
int oper=(int)(GetTickCount()%2); // остаток от деления на два всегда либо 0 либо 1
int oper=(int)(GetTickCount()%2); // остаток от деления на два всегда либо 0 либо 1
if(oper==0)
{
double price=Ask;
double SL=NormalizeDouble(Bid-Stop*_Point,_Digits);
double TP=NormalizeDouble(Bid+Take*_Point,_Digits);
Buy(Ask,SL,TP);
}
if(oper==1)
{
double price=Bid;
double SL=NormalizeDouble(Ask+Stop*_Point,_Digits);
double TP=NormalizeDouble(Ask-Take*_Point,_Digits);
Sell(Ask,SL,TP);
}
//+------------------------------------------------------------------+
//| MT45.mq45 |
//| Copyright 2017, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
//--- введем предопределенные переменные из MQL4 для универсальности кода
#ifdef __MQL5__
#define OrdersTotal PositionsTotal
#endif
input int Stop = 300; // лось
input int Take = 400; // язь
input int Slip = 100; // реквот
input int MN = 123; // магик
input double LT = 1; // лот
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| совершает покупку |
//+------------------------------------------------------------------+
bool Buy(double price,double sl,double tp)
{
//--- покупка в MQL4
#ifdef __MQL4__
int ticket=OrderSend(Symbol(),0,LT,price,Slip,sl,tp,"",MN);
if(ticket<0)
PrintFormat("OrderSend error %d",GetLastError());
#endif
//--- покупка в MQL5
#ifdef __MQL5__
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =LT; // объем
request.type =0; // тип ордера
request.price =price; // цена для открытия
request.sl =sl; // цена StopLoss
request.tp =tp; // цена TakeProfit
request.deviation=Slip; // допустимое отклонение от цены
request.magic =MN; // MagicNumber ордера
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
#endif
//---
return(false);
}
//+------------------------------------------------------------------+
//| совершает продажу |
//+------------------------------------------------------------------+
bool Sell(double price,double sl,double tp)
{
//--- продажа в MQL4
#ifdef __MQL4__
int ticket=OrderSend(Symbol(),1,LT,price,Slip,sl,tp,"",MN);
if(ticket<0)
PrintFormat("OrderSend error %d",GetLastError());
#endif
//--- продажа в MQL5
#ifdef __MQL5__
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =LT; // объем
request.type =1; // тип ордера
request.price =price; // цена для открытия
request.sl =sl; // цена StopLoss
request.tp =tp; // цена TakeProfit
request.deviation=Slip; // допустимое отклонение от цены
request.magic =MN; // MagicNumber ордера
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
#endif
//---
return(false);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int oper=(int)(GetTickCount()%2); // остаток от деления на два всегда либо 0 либо 1
double price=0,sl=0,tp=0;
double ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
if(OrdersTotal()<1)
{
if(oper==0)
{
price=NormalizeDouble(ASK,_Digits);
sl=NormalizeDouble(BID-Stop*_Point,_Digits);
tp=NormalizeDouble(BID+Take*_Point,_Digits);
Buy(ASK,sl,tp);
}
if(oper==1)
{
price=NormalizeDouble(BID,_Digits);
sl=NormalizeDouble(ASK+Stop*_Point,_Digits);
tp=NormalizeDouble(ASK-Take*_Point,_Digits);
Sell(BID,sl,tp);
}
}
}
//+------------------------------------------------------------------+
Следующая запись в группе Запускаем стороннее приложение и выключаем компьютер с помощью средств MQL |
|
25 декабря 2016
|
22 октября 2017
|
Комментарии (1)
20 alex30774 Сообщений: 748
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий