Ссылка для скачивания кому интересно disk.yandex.ru/d/XzsD7COzDjC5Ug

Это за месяц. Сильно не настраивал, но видно, что советник проседает во флете.
Дальше займусь переходом к сигналам индюка и защитой от просадки.
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
op=OrderOpenPrice();
sl=OrderStopLoss();
tp=OrderTakeProfit();
lt=NL(OrderLots());
tk=OrderTicket();
double Price=op;
//------------- ТР и SL ------------
if(tp==0 && TakeProfit!=0)
{
if(OrderType()==OP_BUY)
if(!OrderModify(tk,op,NSL(OP_BUY, op),NTP(OP_BUY, op),0,clrBlue)) // Устанавливаем ТР и SL
Print("Order Modify 4b_tp error #",GetLastError());
//---
if(OrderType()==OP_SELL)
if(!OrderModify(tk,op,NSL(OP_SELL, op),NTP(OP_SELL, op),0,clrRed)) // Устанавливаем ТР и SL
Print("Order Modify 4s_tp error #",GetLastError());
}
//------------------ Average ------------
if(Average)
{
if(OrderType()==OP_BUY && b>=2)
{
if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic) // Крайние ордера
if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
if(!OrderModify(tk,op,0,AwerageBuyPrice,0,clrBlue)) // Выставляем ТР в БУ+
Print("Order Modify 5b_AverTP error #",GetLastError());
if((tk!=BuyPriceMaxTic || tk!=BuyPriceMinTic) && tp!=0 && sl==0) // Стали не крайними ордера
if(!OrderModify(tk,op,NSL(OP_BUY, op),NTP(OP_BUY, op),0,clrBlue)) // Восстанавливаем ТР и SL
Print("Order Modify 5b_!AverSL&TP error #",GetLastError());
}
//---
if(OrderType()==OP_SELL && s>=2) // С продажами аналогично
{
if(tk==SelPriceMaxTic || tk==SelPriceMinTic) // Крайние ордера
if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
if(!OrderModify(tk,op,0,AwerageSelPrice,0,clrRed)) // Выставляем ТР в БУ+
Print("Order Modify 5s_AverTP error #",GetLastError());
if((tk!=SelPriceMaxTic || tk!=SelPriceMinTic) && tp!=0 && sl==0) // Стали не крайними ордера
if(!OrderModify(tk,op,NSL(OP_SELL, op),NTP(OP_SELL, op),0,clrRed)) // Восстанавливаем ТР и SL
Print("Order Modify 5s_!AverSL&TP errorerror #",GetLastError());
}
}
}
if(BU_ON) BU();
}
// --------------------------------------------------------
bool ValidLot(double volume)
{
//--- минимально допустимый объем для торговых операций
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(volume<min_volume)
return(false);
//--- максимально допустимый объем для торговых операций
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(volume>max_volume)
return(false);
//--- получим минимальную градацию объема
double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
return(false);
return(true);
}
//---------------------------------------------------------------
double NL(double lot) // нормализация лота
{
double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
int k=0;
if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота
double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//---------------------------------------------------------------
double NTP(int dir, double _op) // Нормализация цены тейкпрофита
{
if (TakeProfit==0)
return 0;
double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
double pr=NP((dir==OP_BUY)?Bid:Ask);
if (dir==OP_BUY)
{
tp=_op+TakeProfit*Point;
return NP(MathMax(tp, pr+StopLvl));
}
if (dir==OP_SELL)
{
tp=_op-TakeProfit*Point;
return NP(MathMin(tp, pr-StopLvl));
}
return 0;
}
//---------------------------------------------------------------
double NSL(int dir, double _op) // Нормализация цены стоплоса
{
if (StopLoss==0)
return 0;
double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
double pr=NP((dir==OP_BUY)?Bid:Ask);
if (dir==OP_BUY)
{
sl=_op-StopLoss*Point;
return NP(MathMin(sl, pr-StopLvl));
}
if (dir==OP_SELL)
{
sl=_op+StopLoss*Point;
return NP(MathMax(sl, pr+StopLvl));
}
return 0;
}
//---------------------------------------------------------------
double ND(double d, int n=-1)
{
if (n<0)
return NormalizeDouble(d, Digits);
return NormalizeDouble(d, n);
}
//---------------------------------------------------------------
double NP(double d)
{
double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE);
if (TickSize==0)
TickSize=1;
return ND(MathRound(d/TickSize)*TickSize);
}
//-----------------------------------------------------------------
bool BU()
{
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
double sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,
TP = OrderTakeProfit();
op = OrderOpenPrice();
lt = OrderLots();
double _lt = NormalizeDouble(lt/2,2);
// if (_lt==0) break;
double LevelBU = MathAbs(op-TP);
if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point)
if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE))
if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
Sleep(500);
//---
if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point)
if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE))
if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
Sleep(500);
}
return true;
}
//-------------------------------------------------------------------------------
//--------------- Открытие последующих ордеров ----------------------------
datetime CurTime = iTime(NULL, TF, 0);
if(CountSL<=Count_SL || CurTime>=LastTimeSL+60*SleepMin)// Если число убыточных ордеров меньше выбранного
{ // или уже прошло указанное время после мах. числа убыточных ордеров,
if(ModeFirstTrade != Candle) // то открываем ордера дальше.
{
if(LastCloseTP_SL=="TP" && s+b==0)
{
Lot = NL(StartLot);
if(!ValidLot(Lot)) return;
if(LastCloseType==OP_BUY)
{
if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL)
{
if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//----------------------------
if(LastCloseTP_SL=="SL" && s+b==0)
{
Lot = MathCeil((LastCloseLot * LotK)*100)/100;
if(Lot > MaximalLots)
Lot = MaximalLots;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
if(LastCloseType==OP_BUY)
{
if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL)
{
if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
}
//---------------------------------------------------------------------------------------
if(ModeFirstTrade == Candle)
{
if(LastCloseTP_SL=="TP" && s+b==0) // Нет ордеров, а полследний закрылся с профитом
{
Lot = StartLot;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
if(LastCloseType==OP_BUY && Close[1]>Open[1])
{
if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL && Close[1]<Open[1])
{
if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//----------------------------
if(LastCloseTP_SL=="SL" && s+b==0) // Нет ордеров, а полследний закрылся с убытком
{
Lot = MathCeil((LastCloseLot * LotK)*100)/100;
if(Lot > MaximalLots)
Lot = MaximalLots;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
if(LastCloseType==OP_BUY && Close[1]<Open[1])
{
if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL && Close[1]>Open[1])
{
if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
}
}
//---------------- Есть ордера - усредняем с шагом ----------------------
if(Average)
{
if(s > 0 && Close[1] < Open[1])
if((Bid - SelPriceMax) >= (PointOrderStep * Point()))
{
Lot = MathCeil(SelLimPriceMaxLot*100*LotK/100);
if(Lot > MaximalLots)
Lot = MaximalLots;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
if(!OrderSend(Symbol(), OP_SELL, NormalizeDouble(Lot, 2), Bid, Slippage, 0, 0, "", MagicNumber, 0, clrRed))
Print("OrderSend error #", GetLastError());
}
//---
if(b > 0 && Close[1] > Open[1])
if((BuyPriceMin - Ask) >= (PointOrderStep * Point()))
{
Lot = MathCeil(BuyLimPriceMin*100*LotK/100);
if(Lot > MaximalLots)
Lot = MaximalLots;
Lot = NL(Lot);
if(!ValidLot(Lot)) return;
Lot = NormalizeDouble(MaximalLots,2);
if((!OrderSend(Symbol(),OP_BUY, NormalizeDouble(Lot, 2), Ask, Slippage, 0, 0, "",MagicNumber, 0, clrBlue))<=0)
Print("OrderSend error #", GetLastError());
}
}
//--------------- Расчет ТР и SL -------------------------------
double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
double atr = iATR(NULL,TF,Per_ATR,iB)*10000; // ATR (in pips)
if(SL_k_ATR==0)
sl = NormalizeDouble(StopLoss*Point,Digits);
else
sl = NormalizeDouble(atr*SL_k_ATR*Point,Digits);
if(sl<StopLvl)
sl=StopLvl;
//---
if(TP_k_ATR==0)
tp = NormalizeDouble(TakeProfit*Point,Digits);
else
tp = NormalizeDouble(atr*TP_k_ATR*Point,Digits);
if(tp<StopLvl)
tp=StopLvl;
//--------------- Установка ТР, SL и Average price ----------------------------
#property strict
// Ввёл усреднение на откатах Average=true, но сильно не тестировал.
// PointOrderStep и MinimalProfit работают только для Average=true.
// Если SL_k_ATR=0 или TP_k_ATR=0, то StopLoss или соответственно TakeProfit подбираются в пипсах.
// Вижу смысл в подборе SL с помощью SL_k_ATR, а ТР по фиксированному значению в пипсах при TP_k_ATR=0. Хотя...
// Поробовал ввести задержку в минутах SleepMin, после получения Count_SL подряд убыточных ордеров, но
// кажется не работает. В дефолте отключена (SleepMin=0<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '> .
//--- input parameters
enum MODE {
Buy = 0, // Покупка
Sell = 1, // Продажа
Candle = 2 // По свече
};
//---
input MODE ModeFirstTrade = Buy; // ModeFirstTrade Тип первой сделки
input int Count_SL = 3; // Счетчик SL подряд
input int SleepMin = 0; // Задержка мин. при четчике SL==
input bool BU_ON = true; // BU ON Включение режима Save
//---
input bool Average = false; // Average Включение усредняющих ордеров
input int PointOrderStep = 390; // Order step (in pips)
input int MinimalProfit = 20; // Minimal Profit Для усреднения ордеров
//---
input double StartLot = 0.01; // Start Lot Лот стартовый
input double LotK = 2.2; // Коэф. увеличения лота
input double MaximalLots = 1.28; // Maximal Lots
//---
input int StopLoss = 372; // Stop Loss Потери в пунктах
input int TakeProfit = 354; // Take Profit Прибыль в пунктах
input double SL_k_ATR = 5; // SL_k_ATR Коэффициент к ATR для SL
input double TP_k_ATR = 77; // TP_k_ATR Коэффициент к ATR для TP
//---
input int Per_ATR = 9; // Period ATR
input ENUM_TIMEFRAMES TF = PERIOD_M5; // Тайм Фрейм для расчета входа//---
input int Slippage = 30; // Slippage
input int MagicNumber = 1961; // Magic Number
//---
int iB=1, LastCloseType, tk,CountSL=0;
double tp,sl,Lot,lt,op;
datetime LastTimeSL=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int b=0,s=0;
double
SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0,LastCloseLot=0,
BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0,
SelLimPriceMin = 0, SelLimPriceMax = 0, SelLimPriceMinLot = 0, SelLimPriceMaxLot = 0,
BuyLimPriceMax = 0,BuyLimPriceMin=0;
int
SelPriceMaxTic = 0, SelPriceMinTic = 0,
BuyPriceMaxTic = 0, BuyPriceMinTic = 0,
SelLimPriceMaxTic = 0, SelLimPriceMinTic = 0,
BuyLimPriceMaxTic = 0, BuyLimPriceMinTic = 0;
string LastCloseTP_SL="0";
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
op = NormalizeDouble(OrderOpenPrice(), Digits());
lt = NormalizeDouble(OrderLots(), 2);
tk = OrderTicket();
if(OrderType() == OP_SELL)
{
s++;
if(op > SelPriceMax || SelPriceMax == 0)
{
SelPriceMax = op;
SelPriceMaxLot = lt;
SelPriceMaxTic = tk;
}
if(op < SelPriceMin || SelPriceMin == 0)
{
SelPriceMin = op;
SelPriceMinLot = lt;
SelPriceMinTic = tk;
}
}
if(OrderType() == OP_BUY)
{
b++;
if(op > BuyPriceMax || BuyPriceMax == 0)
{
BuyPriceMax = op;
BuyPriceMaxLot = lt;
BuyPriceMaxTic = tk;
}
if(op < BuyPriceMin || BuyPriceMin == 0)
{
BuyPriceMin = op;
BuyPriceMinLot = lt;
BuyPriceMinTic = tk;
}
}
}
//-------------------- AVERAGE -------------------------------------
double AwerageBuyPrice=0,AwerageSelPrice=0;
if(Average)
{
if(b>=2)
AwerageBuyPrice=NormalizeDouble((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)/(BuyPriceMaxLot+BuyPriceMinLot)+MinimalProfit*Point(),Digits());
if(s>=2)
AwerageSelPrice=NormalizeDouble((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)/(SelPriceMaxLot+SelPriceMinLot)-MinimalProfit*Point(),Digits());
}
//-------------------- HISTORY -------------------------------------
if(s+b==0)
for (int i = OrdersHistoryTotal()-1; i >=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
if (StringFind(OrderComment(),"[sl]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
{
LastCloseTP_SL = "SL";
LastCloseType = OrderType();
LastCloseLot = OrderLots();
LastTimeSL = OrderCloseTime();
CountSL ++;
break;
}
if (StringFind(OrderComment(),"[tp]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
{
LastCloseTP_SL = "TP";
LastCloseType = OrderType();
LastCloseLot = OrderLots();
CountSL = 0;
break;
}
}
//--------------- Открытие самого первого ордера --------------------------------
if(s+b==0 && LastCloseLot==0) // Нет и не открывались ордера
{
if(ModeFirstTrade == Buy)
{
if(!OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
//-----------------------------------------------------------------
if(ModeFirstTrade == Sell)
{
if(!OrderSend(Symbol(),OP_SELL,NL(StartLot),Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
//-----------------------------------------------------------------
if(ModeFirstTrade == Candle)
{
if(Close[iB] < Open[iB])
if(! OrderSend(Symbol(),OP_SELL,NL(StartLot),Bid,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
//-----------------
if(Close[iB] > Open[iB])
if(!OrderSend(Symbol(),OP_BUY,NL(StartLot),Ask,Slippage,0,0," ",MagicNumber,0,clrRed))
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//--------------- Открытие последующих ордеров ----------------------------
#property strict
//--- input parameters
enum MODE {
Buy = 0, // Покупка
Sell = 1, // Продажа
Candle = 2 // По свече
};
//---
input MODE ModeFirstTrade = Buy; // Тип первой сделки
input bool BU_ON = true;
input double StartLot = 0.02; // Лот базовый
input double SL_k_ATR = 0.9;
input double TP_k_ATR = 1.9;
input double LotK = 2.2; // Коэф. увеличения лота
input int Per_ATR = 9;
input ENUM_TIMEFRAMES TF = PERIOD_M5; // Тайм Фрейм для ATR
input ENUM_TIMEFRAMES TF_ATR = PERIOD_H1; // Тайм Фрейм для расчета входа
input int Slippage = 30; // Slippage
input int MagicNumber = 1961; // Magic Number
//---
int LastCloseType, iB=1;
double LastCloseLot;
double LastCloseProfit, LevelBU;
double tp,sl,Lot;
bool Trade = false;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int b=0,s=0;
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) b++;
if(OrderType()==OP_SELL) s++;
}
//---
LastCloseType=-1;
datetime CloseTime=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
if(OrderCloseTime()>CloseTime)
{
CloseTime = OrderCloseTime();
LastCloseType = OrderType();
LastCloseLot = OrderLots();
LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap();
}
//--------------- Открытие самого первого ордера --------------------------------
if(Trade==false) // Торговля советником не начата
if(s+b==0 && LastCloseType==-1) // Нет и не открывались ордера
{
if(ModeFirstTrade == Buy)
{
int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
else
Trade = true;
}
//---
if(ModeFirstTrade == Sell)
{
int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
else
Trade = true;
}
//---
if(ModeFirstTrade == Candle)
{
}
}
//--------------- Открытие последующих ордеров ----------------------------
if(LastCloseProfit>0 && s+b==0)
{
Lot = StartLot;
if(LastCloseType==OP_BUY)
{
int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL)
{
int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//----------------------------
if(LastCloseProfit<0 && s+b==0)
{
Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2);
if(LastCloseType==OP_BUY)
{
int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL)
{
int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//--------------- Расчет ТР и SL -------------------------------
double atr = iATR(NULL,TF_ATR,Per_ATR,iB)*10000; // ATR (in pips)
double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
sl = NormalizeDouble(atr*SL_k_ATR*Point,Digits);
if(sl<StopLvl)
sl=StopLvl;
tp = NormalizeDouble(atr*TP_k_ATR*Point,Digits);
if(tp<StopLvl)
tp=StopLvl;
//--------------- Установка ТР и SL ----------------------------
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
double oop = OrderOpenPrice();
if(OrderType()==OP_BUY)
if(OrderStopLoss()==0 || OrderTakeProfit()==0)
if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue))
Print("Order Modify error #",GetLastError());
if(OrderType()==OP_SELL)
if(OrderStopLoss()==0 || OrderTakeProfit()==0)
if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue))
Print("Order Modify error #",GetLastError());
}
if(BU_ON) BU();
}
//-------------------------------------------------------------------------------
bool BU()
{
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
double sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,
TP = OrderTakeProfit(),
op = OrderOpenPrice(),
lt = OrderLots();
double _lt = NormalizeDouble(lt/2,2);
// if (_lt==0) break;
LevelBU = MathAbs(op-TP);
if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point)
if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE))
if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
Sleep(500);
//---
if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point)
if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE))
if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
Sleep(500);
}
return true;
}
//-------------------------------------------------------------------------------
<code>#property strict //--- input parameters enum MODE { Buy = 0, // Покупка Sell = 1, // Продажа Candle = 2 // По свече }; //--- input bool BU_ON = true; input MODE ModeFirstTrade = Buy; // Тип первой сделки input double StartLot = 0.02; // Лот базовый input int StopLoss = 372; // Потери в пунктах input int TakeProfit = 354; // Прибыль в пунктах input double LotK = 2.2; // Коэф. увеличения лота input int Slippage = 30; // Slippage input int MagicNumber = 1961; // Magic Number //--- int LastCloseType; double LastCloseLot; double LastCloseProfit; double tp,sl,Lot; bool Trade = false; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { tp = NormalizeDouble(TakeProfit*Point,Digits); sl = NormalizeDouble(StopLoss*Point,Digits); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int b=0,s=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) b++; if(OrderType()==OP_SELL) s++; } //--- LastCloseType=-1; datetime CloseTime=0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); LastCloseType = OrderType(); LastCloseLot = OrderLots(); LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap(); } //--------------- Открытие самого первого ордера -------------------------------- if(Trade==false) // Торговля советником не начата if(s+b==0 && LastCloseType==-1) // Нет и не открывались ордера { if(ModeFirstTrade == Buy) { int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Sell) { int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Candle) { } } //--------------- Открытие последующих ордеров ---------------------------- if(LastCloseProfit>0 && s+b==0) { Lot = StartLot; if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //---------------------------- if(LastCloseProfit<0 && s+b==0) { Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2); if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //--------------- Расчет ТР и SL ------------------------------- double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits); sl = NormalizeDouble(StopLoss*Point,Digits); if(sl<StopLvl) sl=StopLvl; tp = NormalizeDouble(TakeProfit*Point,Digits); if(tp<StopLvl) tp=StopLvl; //--------------- Установка ТР и SL ---------------------------- for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { double oop = OrderOpenPrice(); if(OrderType()==OP_BUY) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); if(OrderType()==OP_SELL) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); } if(BU_ON) BU(); } //------------------------------------------------------------------------------- bool BU() { for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { double sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point, TP = OrderTakeProfit(), op = OrderOpenPrice(), lt = OrderLots(); double _lt = NormalizeDouble(lt/2,2); // if (_lt==0) break; double LevelBU = MathAbs(op-TP); if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point) if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE)) if(!OrderClose(OrderTicket(),_lt,Bid,Slippage)) Sleep(500); //--- if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point) if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE)) if(!OrderClose(OrderTicket(),_lt,Ask,Slippage)) Sleep(500); } return true; } //------------------------------------------------------------------------------- </code>
#property strict
//--- input parameters
enum MODE {
Buy = 0, // Покупка
Sell = 1, // Продажа
Candle = 2 // По свече
};
//---
input MODE ModeFirstTrade = Buy; // Тип первой сделки
input double StartLot = 0.02; // Лот базовый
input double SL_k_ATR = 1.1;
input double TP_k_ATR = 0.9;
input double LotK = 2.2; // Коэф. увеличения лота
input int Per_ATR = 9;
input ENUM_TIMEFRAMES TF = PERIOD_M5; // Тайм Фрейм для ATR
input ENUM_TIMEFRAMES TF_ATR = PERIOD_H1; // Тайм Фрейм для расчета входа
input int Slippage = 30; // Slippage
input int MagicNumber = 1961; // Magic Number
//---
int LastCloseType, iB=1;
double LastCloseLot;
double LastCloseProfit;
double tp,sl,Lot;
bool Trade = false;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int b=0,s=0;
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) b++;
if(OrderType()==OP_SELL) s++;
}
//---
LastCloseType=-1;
datetime CloseTime=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
if(OrderCloseTime()>CloseTime)
{
CloseTime = OrderCloseTime();
LastCloseType = OrderType();
LastCloseLot = OrderLots();
LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap();
}
//--------------- Открытие самого первого ордера --------------------------------
if(Trade==false) // Торговля советником не начата
if(s+b==0 && LastCloseType==-1) // Нет и не открывались ордера
{
if(ModeFirstTrade == Buy)
{
int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
else
Trade = true;
}
//---
if(ModeFirstTrade == Sell)
{
int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
else
Trade = true;
}
//---
if(ModeFirstTrade == Candle)
{
}
}
//--------------- Открытие последующих ордеров ----------------------------
if(LastCloseProfit>0 && s+b==0)
{
Lot = StartLot;
if(LastCloseType==OP_BUY)
{
int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL)
{
int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//----------------------------
if(LastCloseProfit<0 && s+b==0)
{
Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2);
if(LastCloseType==OP_BUY)
{
int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
if(LastCloseType==OP_SELL)
{
int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed);
if(ticket<0)
{
Print("Order Send завершилась с ошибкой #",GetLastError());
return;
}
}
}
//--------------- Расчет ТР и SL -------------------------------
double atr = iATR(NULL,TF_ATR,Per_ATR,iB)*10000; // ATR (in pips)
double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
sl = NormalizeDouble(atr*SL_k_ATR*Point,Digits);
if(sl<StopLvl)
sl=StopLvl;
tp = NormalizeDouble(atr*TP_k_ATR*Point,Digits);
if(tp<StopLvl)
tp=StopLvl;
//--------------- Установка ТР и SL ----------------------------
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
double oop = OrderOpenPrice();
if(OrderType()==OP_BUY)
if(OrderStopLoss()==0 || OrderTakeProfit()==0)
if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue))
Print("Order Modify error #",GetLastError());
if(OrderType()==OP_SELL)
if(OrderStopLoss()==0 || OrderTakeProfit()==0)
if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue))
Print("Order Modify error #",GetLastError());
}
}
//-------------------------------------------------------------------------------
<code>#property strict //--- input parameters enum MODE { Buy = 0, // Покупка Sell = 1, // Продажа Candle = 2 // По свече }; //--- input MODE ModeFirstTrade = Buy; // Тип первой сделки input double StartLot = 0.02; // Лот базовый input int StopLoss = 372; // Потери в пунктах input int TakeProfit = 354; // Прибыль в пунктах input double LotK = 2.2; // Коэф. увеличения лота input int Slippage = 30; // Slippage input int MagicNumber = 1961; // Magic Number //--- int LastCloseType; double LastCloseLot; double LastCloseProfit; double tp,sl,Lot; bool Trade = false; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { tp = NormalizeDouble(TakeProfit*Point,Digits); sl = NormalizeDouble(StopLoss*Point,Digits); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int b=0,s=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) b++; if(OrderType()==OP_SELL) s++; } //--- LastCloseType=-1; datetime CloseTime=0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); LastCloseType = OrderType(); LastCloseLot = OrderLots(); LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap(); } //--------------- Открытие самого первого ордера -------------------------------- if(Trade==false) // Торговля советником не начата if(s+b==0 && LastCloseType==-1) // Нет и не открывались ордера { if(ModeFirstTrade == Buy) { int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Sell) { int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Candle) { } } //--------------- Открытие последующих ордеров ---------------------------- if(LastCloseProfit>0 && s+b==0) { Lot = StartLot; if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //---------------------------- if(LastCloseProfit<0 && s+b==0) { Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2); if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //--------------- Установка ТР и SL ---------------------------- for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { double oop = OrderOpenPrice(); if(OrderType()==OP_BUY) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); if(OrderType()==OP_SELL) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); } } //------------------------------------------------------------------------------- </code>
kvashnin007