Да, жалко, что нельзя в ветку скидывать. Помещу текстом. Хочу порекомендовать тем, кто не натыкался, советник - помощник
CloseProfit v2. Удобен для работы с локами. Виртуальные стоп и тейк. что тоже бывает полезно у некоторых ДЦ.
Принцип работы с локами такой: Открывается с рынка первый ордер без стопа и тейка. На уровень примерного стопа ставится локовая отложка. В советнике устанавливается тейк, по достижении которого советник закроет и рыночный ордер и отложку.
Стоп надо ставить в несколько раз больше расстояния между ордерами, в зависимости от способа вывода из замка.
Все, можно уходить от компа, при профите, оба ордера будут закрыты, если цена зацепит отложку, оба ордера будут висеть и ждать пока лок разрулят вручную. Может работать как с инструментом графика на который поставлен, так и с любым.
Настроек минимум. Кому понравится может вставить в metaeditor и компилировать. Думаю, всем понятно, почему при работе с советником нельзя выключать комп.
//+------------------------------------------------------------------+
//| Copyright © 2012, Vladimir Hlystov |
//| Закрывает все ордера при определенном профите |
//|Copyright © 2012,
http://cmillion.narod.ru |
//|
[email protected] |
//+------------------------------------------------------------------+
//#property copyright " "
//#property link ""
//-------------------------------------------------------------------
extern double ProfitClose = 10; //закрывать все ордера при получении профита
extern double LossClose = 1000; //закрывать все ордера при получении убытка
extern bool AllSymbol = false;//учитывать все инструменты или только тот, на котором стоит советник
extern int Magic = 0; //0 - учитывать все ордера (с любым Magic номером)
//-------------------------------------------------------------------
string txt;
int init()
{
ObjectCreate("Balance", OBJ_LABEL, 0, 0, 0);
ObjectSet("Balance", OBJPROP_CORNER, 1);
ObjectSet("Balance", OBJPROP_XDISTANCE, 5);
ObjectSet("Balance", OBJPROP_YDISTANCE, 15);
ObjectCreate("Equity", OBJ_LABEL, 0, 0, 0);
ObjectSet("Equity", OBJPROP_CORNER, 1);
ObjectSet("Equity", OBJPROP_XDISTANCE, 5);
ObjectSet("Equity", OBJPROP_YDISTANCE, 25);
ObjectCreate("Profit", OBJ_LABEL, 0, 0, 0);
ObjectSet("Profit", OBJPROP_CORNER, 1);
ObjectSet("Profit", OBJPROP_XDISTANCE, 5);
ObjectSet("Profit", OBJPROP_YDISTANCE, 35);
ObjectCreate("Copyright", OBJ_LABEL, 0, 0, 0);
ObjectSet("Copyright", OBJPROP_CORNER, 3);
ObjectSet("Copyright", OBJPROP_XDISTANCE, 5);
ObjectSet("Copyright", OBJPROP_YDISTANCE, 5);
//ObjectSetText("Copyright","CloseProfit Copyright © 2011,
http://cmillion.narod.ru\n",8,"Arial",Blue);
if (AllSymbol) txt = "По всем инструментам счета";
if (Magic==0) txt = StringConcatenate(txt,"\nПо всем Magic"
;
txt = StringConcatenate(txt,"\nПо Magic = ",Magic);
return(0);
}
//-------------------------------------------------------------------
int deinit()
{
ObjectDelete("Balance"
;
ObjectDelete("Equity"
;
ObjectDelete("Profit"
;
ObjectDelete("Copyright"
;
return(0);
}
//-------------------------------------------------------------------
int start()
{
double Profit,LB,LS,OL;
int b,s,OT;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderSymbol() == Symbol() || AllSymbol) && (Magic==0 || Magic==OrderMagicNumber()))
{
OT = OrderType();
OL = OrderLots();
if (OT==OP_BUY)
{
b++;LB+= OL;
Profit+=OrderProfit();
}
if (OT==OP_SELL)
{
s++;LS+= OL;
Profit+=OrderProfit();
}
}
}
}
Comment(txt,"\nBuy ",b,"\nSell ",s);
//---
if (Profit>=ProfitClose)
{
Alert("Достигнут уровень профита = "+DoubleToStr(Profit,2));
CloseAll();
}
if (Profit<=-LossClose)
{
Alert("Достигнут уровень максимального убытка "+DoubleToStr(Profit,2));
CloseAll();
}
ObjectSetText("Balance",StringConcatenate("Balance ",DoubleToStr(AccountBalance(),2)),8,"Arial",Blue);
ObjectSetText("Equity",StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2)),8,"Arial",Blue);
string txt2;
if (LB>0 || LS>0)
{
if (AllSymbol) txt2 = StringConcatenate("Profit All Symbol ",DoubleToStr(Profit,2));
else txt2 = StringConcatenate("Profit ",Symbol()," ",DoubleToStr(Profit,2));
}
if (LB>0) txt2 = StringConcatenate(txt2," Lot Buy = ",DoubleToStr(LB,2));
if (LS>0) txt2 = StringConcatenate(txt2," Lot Sell = ",DoubleToStr(LS,2));
ObjectSetText("Profit",txt2,12,"Arial",Color(Profit));
return;
}
//------------------------------------------------------------------
color Color(double P)
{
if (P>0) return(Green);
if (P<0) return(Red);
if (P==0) return(Green);
}
//------------------------------------------------------------------
bool CloseAll()
{
bool error=true;
int err,nn,OT;
string Symb;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
Symb = OrderSymbol();
if ((Symb == Symbol() || AllSymbol) && (Magic==0 || Magic==OrderMagicNumber()))
{
OT = OrderType();
if (OT>1)
{
OrderDelete(OrderTicket());
}
if (OT==OP_BUY)
{
error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symb,MODE_BID),MarketInfo(Symb,MODE_DIGITS)),3,Blue);
if (error) Alert(Symb," Закрыт ордер N ",OrderTicket()," прибыль ",OrderProfit(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
if (OT==OP_SELL)
{
error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symb,MODE_ASK),MarketInfo(Symb,MODE_DIGITS)),3,Red);
if (error) Alert(Symb," Закрыт ордер N ",OrderTicket()," прибыль ",OrderProfit(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
if (!error)
{
err = GetLastError();
if (err<2) continue;
if (err==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_MINUTES));
Sleep(5000);
RefreshRates();
continue;
}
if (err==146)
{
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",err," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol() || AllSymbol) && (Magic==0 || Magic==OrderMagicNumber()))
{
OT = OrderType();
if (OT==OP_BUY || OT==OP_SELL) n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Alert(Symb," Не удалось закрыть все сделки, осталось еще ",n);return(0);}
Sleep(1000);
RefreshRates();
}
return(1);
}
//--------------------------------------------------------------------