
//+------------------------------------------------------------------+
//| Exp_CloseLose_Positions.mq4 |
//| Oxy |
//| http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link "http://oxy.opentraders.ru/bio/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum name_orders
{
BUY,
SELL,
ANY,
};
//------- Внешние параметры -----------------------------------------+
extern bool CurrSymb = true; // Только текущая пара или все
extern name_orders NamePosLost = ANY; // Закрываемые минусовые ордера
extern name_orders NamePosClose = ANY; // Те ордера, которыми закрывать
extern int NumLostOrdrs = 3; // Количество закрываемых минусовых ордеров
extern int NumProfOrdrs = 3; // Количество закрываемых плюсовых ордеров
extern double Profit = 0; // Прибыль
extern int Slippage = 30; // Проскальзывание цены при закрытии
//------- Глобальные переменные -------------------------------------+
string Symb;
int arrTMinus[];
int arrTPlus[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать!"); return(INIT_FAILED);}
if(CurrSymb) Symb=Symbol(); else Symb=NULL;
if(NumLostOrdrs<=0) { Print("Неправильно выставлено количество!"); return(INIT_FAILED);}
if(Profit<0) { Print("Прибыль не может быть отрицательной!"); return(INIT_FAILED);}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double _minus = 0;
if(NamePosLost==BUY) _minus = HaveOpenPos_Minus(0);
if(NamePosLost==SELL)_minus = HaveOpenPos_Minus(1);
if(NamePosLost==ANY) _minus = HaveOpenPos_Minus();
if(_minus>=0) return;
double _plus=0;
if(NamePosClose==BUY) _plus = HaveOpenPos_Plus(0);
if(NamePosClose==SELL)_plus = HaveOpenPos_Plus(1);
if(NamePosClose==ANY) _plus = HaveOpenPos_Plus();
if(_plus<=0) return;
if(_minus+_plus>=Profit)
{
closePositions(_minus);
PutPointer();
}
Comment("\n Общий минус ",_minus,
"\n Общий плюс ",_plus);
}
//+------------------------------------------------------------------+
void closePositions(double minus)
{
int sizeMins=ArraySize(arrTMinus);
for(int i=0; i<sizeMins; i++)
{
if(OrderSelect(arrTMinus[i],SELECT_BY_TICKET,MODE_TRADES))
{
if(OrderType()==0)
{
RefreshRates();
if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
}
if(OrderType()==1)
{
RefreshRates();
if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
}
}
}
int sizePlus=ArraySize(arrTPlus);
double totPlus=0,_profit;
for(int j=0; j<sizePlus; j++)
{
if(OrderSelect(arrTPlus[j],SELECT_BY_TICKET,MODE_TRADES))
{
if(OrderType()==0)
{
RefreshRates();
_profit=OrderProfit()+OrderCommission()+OrderSwap();
if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
else totPlus+=_profit;
}
if(OrderType()==1)
{
RefreshRates();
_profit=OrderProfit()+OrderCommission()+OrderSwap();
if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
else totPlus+=_profit;
}
if(minus+totPlus>=Profit) break;
}
}
}
//+------------------------------------------------------------------+
double HaveOpenPos_Plus(int ot=-1)
{
ArrayResize(arrTPlus,0);
int i,k=OrdersTotal(),num=0;
if(ot<0 || ot>1) ot=-1;
double totPlus=0,_profit;
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(Symb==NULL || OrderSymbol()==Symb)
{
_profit=0;
if(ot==-1)
{
if(OrderType()==0 || OrderType()==1)
{
_profit=OrderProfit()+OrderCommission()+OrderSwap();
}
} else {
if(ot==OrderType())
{
_profit=OrderProfit()+OrderCommission()+OrderSwap();
}
}
if(_profit>0)
{
totPlus +=_profit;
int size = ArraySize(arrTPlus);
ArrayResize(arrTPlus,size+1);
arrTPlus[size]=OrderTicket();
num++;
}
if(num>=NumProfOrdrs) break;
}
}
}
return (totPlus);
}
//+------------------------------------------------------------------+
double HaveOpenPos_Minus(int ot=-1)
{
ArrayResize(arrTMinus,0);
int i,k=OrdersTotal(),num=0;
if(ot<0 || ot>1) ot=-1;
double totMinus=0,_profit;
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(Symb==NULL || OrderSymbol()==Symb)
{
_profit=0;
if(ot==-1)
{
if(OrderType()==0 || OrderType()==1)
{
_profit=OrderProfit()+OrderCommission()+OrderSwap();
}
} else {
if(ot==OrderType())
{
_profit=OrderProfit()+OrderCommission()+OrderSwap();
}
}
if(_profit<0)
{
totMinus+=_profit;
int size = ArraySize(arrTMinus);
ArrayResize(arrTMinus,size+1);
arrTMinus[size]=OrderTicket();
num++;
}
if(num>=NumLostOrdrs) break;
}
}
}
return (totMinus);
}
//+------------------------------------------------------------------+
void PutPointer()
{
//--- создаем указатель
ObjectCreate("Pointer"+TimeToString(Time[0]),OBJ_ARROW,0,Time[1],High[1]+20*Point,0,0);
ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_BACK,true);
ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_COLOR,clrRed);
ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_ARROWCODE,91);
ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_WIDTH,2);
ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_SELECTED,true);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Exp_CloseLose_Positions.mq4 |
//| Oxy |
//| http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link "http://oxy.opentraders.ru/bio/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum name_orders
{
BUY,
SELL,
ANY,
};
//------- Внешние параметры -----------------------------------------+
extern bool CurrSymb = true; // Только текущая пара или все
extern name_orders NamePosLost = ANY; // Закрываемые минусовые ордера
extern name_orders NamePosClose = ANY; // Те ордера, которыми закрывать
extern int NumLostOrdrs = 3; // Количество закрываемых минусовых ордеров
extern int NumProfOrdrs = 3; // Количество последних закрываемых плюсовых ордеров
extern double Profit = 0; // Прибыль
extern int Slippage = 30; // Проскальзывание цены при закрытии
//------- Глобальные переменные -------------------------------------+
string Symb;
int arrTMinus[];
int arrTPlus[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать!"); return(INIT_FAILED);}
if(CurrSymb) Symb=Symbol(); else Symb=NULL;
if(NumLostOrdrs<=0) { Print("Неправильно выставлено количество!"); return(INIT_FAILED);}
if(Profit<0) { Print("Прибыль не может быть отрицательной!"); return(INIT_FAILED);}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { Comment("");}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
Comment("\n Минус ",PosMinus(),
"\n Плюс ",PosPlus());
/* double _minus = 0;
if(NamePosLost==BUY) _minus=HaveOpenPos_Minus(0);//минусы по бай селл и обеим
if(NamePosLost==SELL)_minus = HaveOpenPos_Minus(1);
if(NamePosLost==ANY) _minus = HaveOpenPos_Minus();
//if(_minus>=0) return;
double _plus=0;
if(NamePosClose==BUY) _plus=HaveLastOpenPos_Plus(0);//плюсы по бай селл и обеим
if(NamePosClose==SELL)_plus = HaveLastOpenPos_Plus(1);
if(NamePosClose==ANY) _plus = HaveLastOpenPos_Plus();
//if(_plus<=0) return;
*/
if(PosMinus()+PosPlus()>=Profit)
{
CloseAll(); //закрываеи убыточные позы серией плюсовых ордеров
PutPointer(); //--- создаем указатель
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
double PosPlus()
{
double profit=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderProfit()>0)
{
profit+=OrderProfit();
}
}
}
return(profit);
}
//+------------------------------------------------------------------+
double PosMinus()
{
double profit=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderProfit()<0)
{
profit+=OrderProfit();
}
}
}
return(profit);
}
//+------------------------------------------------------------------+
void CloseAll()
{
bool cl,sel;
for(int i=OrdersTotal()-1;i>=0;i--)
{
sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),Bid,30,Blue);
if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);
Sleep(1000);
}
}
}
//+------------------------------------------------------------------+
void PutPointer()
{
//--- создаем указатель
ObjectCreate("Pointer",OBJ_ARROW,0,Time[0],High[1]+20*Point,0,0);
ObjectSet("Pointer",OBJPROP_BACK,true);
ObjectSet("Pointer",OBJPROP_COLOR,clrRed);
ObjectSet("Pointer",OBJPROP_ARROWCODE,91);
ObjectSet("Pointer",OBJPROP_WIDTH,2);
ObjectSet("Pointer",OBJPROP_SELECTED,true);
}
//+------------------------------------------------------------------+
Параметр количестов циклов работы.
Если параметр 1, то выставляем отложки один раз и все. Если много раз, то все время.
//+------------------------------------------------------------------+
//| Exp_CloseLose_Positions.mq4 |
//| Oxy |
//| http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link "http://oxy.opentraders.ru/bio/"
#property version "1.00"
#property strict
enum name_orders {
BUY,
SELL,
ANY,
};
//------- Внешние параметры -----------------------------------------+
extern bool CurrSymb = true; // Только текущая пара или все
extern name_orders NamePosLost = ANY; // Закрываемые минусовые ордера
extern name_orders NamePosClose = ANY; // Те ордера, которыми закрывать
extern int NumLostOrdrs = 3; // Количество закрываемых минусовых ордеров
extern int NumProfOrdrs = 3; // Количество последних закрываемых плюсовых ордеров
extern double Profit = 0; // Прибыль
extern int Slippage = 30; // Проскальзывание цены при закрытии
//------- Глобальные переменные -------------------------------------+
string Symb;
int arrTMinus[];
int arrTPlus[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать!"); return(INIT_FAILED);}
if (CurrSymb) Symb = Symbol(); else Symb = NULL;
if (NumLostOrdrs<=0) { Print("Неправильно выставлено количество!"); return(INIT_FAILED);}
if (Profit<0) { Print("Прибыль не может быть отрицательной!"); return(INIT_FAILED);}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double _minus = 0;
if(NamePosLost==BUY) _minus = HaveOpenPos_Minus(0);//минусы по бай селл и обеим
if(NamePosLost==SELL)_minus = HaveOpenPos_Minus(1);
if(NamePosLost==ANY) _minus = HaveOpenPos_Minus();
if(_minus>=0) return;
double _plus = 0;
if(NamePosClose==BUY) _plus = HaveLastOpenPos_Plus(0);//плюсы по бай селл и обеим
if(NamePosClose==SELL)_plus = HaveLastOpenPos_Plus(1);
if(NamePosClose==ANY) _plus = HaveLastOpenPos_Plus();
if(_plus<=0) return;
if(_minus+_plus>=Profit) closePositions (_minus);//закрываеи одну убыточную позу серией плюсовых ордеров
}
//+------------------------------------------------------------------+
void closePositions (double minus) {
int sizeMins = ArraySize(arrTMinus);
for(int i=0; i<sizeMins; i++) {
if(OrderSelect(arrTMinus[i], SELECT_BY_TICKET, MODE_TRADES)) {
if(OrderType()==0) {
RefreshRates();
if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage)) Print("Не удалось закрыть ордер ", OrderTicket(), "!");
}
if(OrderType()==1) {
RefreshRates();
if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage)) Print("Не удалось закрыть ордер ", OrderTicket(), "!");
}
}
}
int sizePlus = ArraySize(arrTPlus);//размер массива(10) нужно 3 последних
double totPlus = 0, _profit;
for(int j=sizePlus-NumProfOrdrs; j<sizePlus; j++) {
if(OrderSelect(arrTPlus[j], SELECT_BY_TICKET, MODE_TRADES)) {
if(OrderType()==0) {
RefreshRates();
_profit = OrderProfit() + OrderCommission() + OrderSwap();
if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage)) Print("Не удалось закрыть ордер ", OrderTicket(), "!");
else totPlus += _profit;
}
if(OrderType()==1) {
RefreshRates();
_profit = OrderProfit() + OrderCommission() + OrderSwap();
if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage)) Print("Не удалось закрыть ордер ", OrderTicket(), "!");
else totPlus += _profit;
}
if (minus+totPlus>=Profit) break;
}
}
}
//+------------------------------------------------------------------+
double HaveLastOpenPos_Plus(int ot=-1) {
if(ot<0 || ot>1) ot=-1;
int sizePlus = ArraySize(arrTPlus);//считали размер массива(10) нужно 3 последних
double totPlus = 0, _profit;
for(int j=sizePlus-NumProfOrdrs; j<sizePlus; j++) {
if(OrderSelect(arrTPlus[j], SELECT_BY_TICKET, MODE_TRADES)) {
if(OrderType()==0) {
RefreshRates();
_profit = OrderProfit() + OrderCommission() + OrderSwap();
totPlus += _profit;
}
if(OrderType()==1) {
RefreshRates();
_profit = OrderProfit() + OrderCommission() + OrderSwap();
totPlus += _profit;
}
}
}
return (totPlus);
}
//+------------------------------------------------------------------+
double HaveOpenPos_Plus(int ot=-1) {
ArrayResize(arrTPlus, 0);
int i, k = OrdersTotal ();
if(ot<0 || ot>1) ot=-1;
double totPlus = 0, _profit;
for (i=0; i<k; i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (Symb==NULL || OrderSymbol()==Symb) {
_profit = 0;
if(ot==-1) {
if (OrderType()==0 || OrderType()==1) {
_profit = OrderProfit() + OrderCommission() + OrderSwap();
}
} else {
if(ot==OrderType()) {
_profit = OrderProfit() + OrderCommission() + OrderSwap();
}
}
if(_profit>0) {
totPlus +=_profit;
int size = ArraySize(arrTPlus);
ArrayResize(arrTPlus, size+1);
arrTPlus[size] = OrderTicket();
}
}
}
}
return (totPlus);
}
//+------------------------------------------------------------------+
double HaveOpenPos_Minus(int ot=-1) {
ArrayResize(arrTMinus, 0);
int i, k = OrdersTotal (), num=0;
if(ot<0 || ot>1) ot=-1;
double totMinus = 0, _profit;
for (i=0; i<k; i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (Symb==NULL || OrderSymbol()==Symb) {
_profit = 0;
if(ot==-1) {
if (OrderType()==0 || OrderType()==1) {
_profit = OrderProfit() + OrderCommission() + OrderSwap();
}
} else {
if(ot==OrderType()) {
_profit = OrderProfit() + OrderCommission() + OrderSwap();
}
}
if(_profit<0) {
totMinus +=_profit;
int size = ArraySize(arrTMinus);
ArrayResize(arrTMinus, size+1);
arrTMinus[size] = OrderTicket();
num++;
}
if(num>=NumLostOrdrs) break;
}
}
}
return (totMinus);
}
//+------------------------------------------------------------------+
AM2