//+------------------------------------------------------------------+
//| LunumExp_mq4_3.mq4 |
//| Oxy |
//| http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link "http://oxy.opentraders.ru/bio/"
#property version "1.00"
#property strict
//------- Внешние параметры советника -----------------------------------------+
extern double BeginLot = 0.1; // Первоначальный лот
extern int Drawdown = 100; // Просадка в пунктах, 0 - без просадки
extern int PlusPoints = 100; // Сколько должна пройти цена в плюс в пунктах, чтобы мы выставили SL в безубыток
extern int StepSL_plus = 20; // Шаг трала
extern int Slippage = 30; // Проскальзывание цены
extern int MagicNumber= 567882; // Идентификатор ордера
//------- Глобальные переменные советника -------------------------------------+
string Symb;
double pricePointBuy = -1;
double pricePointSell= -1;
int lastLossTicket= -1;
double lotBuy =BeginLot;
double lotSell=BeginLot;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать"); return(INIT_FAILED);}
if(PlusPoints-MarketInfo(Symbol(), MODE_STOPLEVEL)<=StepSL_plus) { Print("Неправильно выставлены значения безубытка"); return(INIT_FAILED);}
Symb = Symbol();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// если нет позиций buy - открываем их
if(notOpenPos(0)){
lotBuy = BeginLot;
BuyPos();
}
// если нет позиций sell - открываем их
if(notOpenPos(1)){
lotSell= BeginLot;
SellPos();
}
// в прибыли - трал
if(Ask>=pricePointBuy +PlusPoints*Point && PlusPoints>0) {pricePointBuy = pricePointBuy +StepSL_plus*Point; changePos (0); }
if(Bid<=pricePointSell-PlusPoints*Point && PlusPoints>0) {pricePointSell = pricePointSell-StepSL_plus*Point; changePos (1); }
// в убытках - удвоение
if(Ask<=pricePointBuy -Drawdown*Point && Drawdown>0){ lotBuy = lotBuy*2; BuyPos(); }
if(Bid>=pricePointSell+Drawdown*Point && Drawdown>0){ lotSell= lotSell*2; SellPos(); }
// Если закрылся трал - то закрываем подобные ордера
if (isClosePosByLoss()) CloseOrders(OrderType());
}
//+------------------------------------------------------------------+
bool notOpenPos (int typeOrder) {
int i;
for (i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
if(OrderType()==typeOrder) {
return(false);
}
}
}
}
return (true);
}
//+------------------------------------------------------------------+
void changePos (int typeOrder) {
int i, ot;
double sl;
for (i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
ot = OrderType();
if(ot==0 && ot==typeOrder) {
if(OrderStopLoss()==0) sl = OrderOpenPrice() + StepSL_plus*Point;
else sl = OrderStopLoss() + StepSL_plus*Point;
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(sl,Digits), 0, 0)) Print ("Не удалось изменить ордер ", OrderTicket());
lotBuy = BeginLot;
}
if(ot==1 && ot==typeOrder) {
if(OrderStopLoss()==0) sl = OrderOpenPrice() - StepSL_plus*Point;
else sl = OrderStopLoss() - StepSL_plus*Point;
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(sl,Digits), 0, 0)) Print ("Не удалось изменить ордер ", OrderTicket());
lotSell= BeginLot;
}
}
}
}
}
//+------------------------------------------------------------------+
bool BuyPos() {
double sl=0, tp=0;
int ticket = OrderSend(Symb, OP_BUY, lotBuy, NormalizeDouble(Ask,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber);
if (ticket == -1) return(false);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePointBuy = OrderOpenPrice();
return (true);
}
bool SellPos() {
double sl=0, tp=0;
int ticket = OrderSend(Symb, OP_SELL, lotSell, NormalizeDouble(Bid,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber);
if (ticket == -1) return(false);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePointSell = OrderOpenPrice();
return (true);
}
//+------------------------------------------------------------------+
bool isClosePosByLoss() {
int i, k=OrdersHistoryTotal();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()==MagicNumber && OrderSymbol()==Symb){
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(OrderTicket()==lastLossTicket) return(false);
else if (OrderTicket()!=lastLossTicket) {
//_______________________
if(OrderType () == OP_BUY) {
if(OrderClosePrice() <= OrderStopLoss() )
{lastLossTicket = OrderTicket(); return(true);} // закрылись в Loss
}
if(OrderType() == OP_SELL) {
if(OrderClosePrice() >= OrderStopLoss() && OrderStopLoss() != 0)
{lastLossTicket = OrderTicket(); return(true);} // закрылись в Loss
}
//_______________________
}
}
}
}
}
return(false);
}
//+------------------------------------------------------------------+
void CloseOrders(int ot) {
int i, k=OrdersTotal();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber && ot==OrderType()) {
if (ot==0) {
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage)){
Print("Не удалось закрыть позицию ", OrderTicket());
}
}
if (ot==1) {
if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage)){
Print("Не удалось закрыть позицию ", OrderTicket());
}
}
}
}
}
}
//+------------------------------------------------------------------+
там же описание!
Oxy