Индикаторы: i-Breakeven

 

i-Breakeven:

Индикатор группирует открытые ордера по финансовым инструментам.

Author: RickD2

 
Приятный индикатор, спасибо!
Могли бы Вы уточнить что означает Breakeven?
Я так предполагаю, что это либо просто усреднённая цена открытия позиций по инструменту с учётом объёмов открытых поз, либо тоже самое, но ещё и с учётом накопленного свопа.
Порадовала возможность определения Lock ! Очень удобно!
Хотелось бы чтобы убыточные позы раскрашивались к примеру в красный и зелёный цвета, которые можно самостоятельно задавать в настройках индикатора. То есть символы пусть будут иметь одинаковый цвет как и сейчас, а вот суммы прибыли и убытка по инструменту имели разную раскраску.
Ещё было бы полезно как опцию добавить третью колонку, в которой будет указано соотношение между прибылью (или убытком) и маржей по инструментам. То есть к примеру прибыль по открытым позициям по инструменту составляет 500USD, при этом объём открытых поз по инструменту составляет 200USD, в третью колонку вписываем 2,5. Для убыточных инструментов аналогично, только со знаком минус.
 
Колонка Breakeven показывает расчетный уровень, где суммарная позиция по данному инструменту покажет 0.
При открытии одного ордера в течении дня - это OpenPrice. Далее - картину начинают изменять свопы.
Польза наступает, когда открыто много ордеров и без калькулятора не разобраться.
 
Немного его подрихтовал
Добавил раскраску по прибыли/убытку(настраиваемую)
и сделал названия колонок параметрами =так что локализация или там написать себе понятные шапки - дело теперь юзерское ;)

//+------------------------------------------------------------------+
//| i-Breakeven.mq4 |
//| Copyright © 2007, RickD |
//| www.e2e-fx.net |
//+------------------------------------------------------------------+
#property copyright "© 2007 RickD"
#property link "www.e2e-fx.net"
//----
#define major 1
#define minor 0
//----
#property indicator_chart_window
#property indicator_buffers 0
//----
extern int Corner = 0;
extern int dy = 20;
extern string _Symbol = "Symbol";
extern string _ValueName = "Value";
extern string _TotalName = "Total";
extern string _BreakevenName = "Breakeven";
extern color _Header = OrangeRed;
extern color _Text = RoyalBlue;
extern color _Data = CadetBlue;
extern color _DataPlus = Lime;
extern color _DataMinus = Red;
extern color _Separator = MediumPurple;
//----
string prefix = "capital_";
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void init()  
 {
 Comment("");
 clear();
 }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void deinit()  
 {
 Comment("");
 clear();
 }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void clear()  
 {
 string name;
 int obj_total = ObjectsTotal();
//----
 for(int i = obj_total - 1; i >= 0; i--)
 {
 name = ObjectName(i);
 if(StringFind(name, prefix) == 0)  
 ObjectDelete(name);
 }
 }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void start()
 {
 clear();
 string Sym[];
 double Equity[];
 double Lots[];
 ArrayResize(Sym, 0);
 ArrayResize(Equity, 0);
 ArrayResize(Lots, 0);
 int cnt = OrdersTotal();
//----
 for(int i = 0; i < cnt; i++)
 {
 //----
 if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  
 continue;
 int type = OrderType();
 //----
 if(type != OP_BUY && type != OP_SELL)  
 continue;
 bool found = false;
 int size = ArraySize(Sym);
 //----
 for(int k = 0; k < size; k++)
 {
 //----
 if(Sym[k] == OrderSymbol())  
 {
 Equity[k] += OrderProfit() + OrderCommission() + OrderSwap();
 //----
 if(type == OP_BUY)  
 Lots[k] += OrderLots();
 //----
 if(type == OP_SELL)  
 Lots[k] -= OrderLots();
 found = true;
 break;
 }
 }
 //----
 if(found)  
 continue;
 int ind = ArraySize(Sym);
 ArrayResize(Sym, ind + 1);
 Sym[ind] = OrderSymbol();
 ArrayResize(Equity, ind + 1);
 Equity[ind] = OrderProfit() + OrderCommission() + OrderSwap();
 ArrayResize(Lots, ind + 1);
 //----
 if(type == OP_BUY)  
 Lots[k] = OrderLots();
 //----
 if(type == OP_SELL)  
 Lots[k] = -OrderLots();
 }
 string name = prefix + "symbols";
//----
 if(ObjectFind(name) == -1)  
 {
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 }
 ObjectSet(name, OBJPROP_XDISTANCE, 30);
 ObjectSet(name, OBJPROP_YDISTANCE, 35);
 ObjectSetText(name, _Symbol, 10, "Tahoma", _Header);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "equity";
//----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 130);
 ObjectSet(name, OBJPROP_YDISTANCE, 35);
 ObjectSetText(name, _ValueName, 10, "Tahoma", _Header);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "breakeven";
//----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 220);
 ObjectSet(name, OBJPROP_YDISTANCE, 35);
 ObjectSetText(name, _BreakevenName, 10, "Tahoma", _Header);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "tmp1";
//----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 20);
 ObjectSet(name, OBJPROP_YDISTANCE, 35+dy);
 ObjectSetText(name, "-----------------------------------------------------",  
 10, "Tahoma", _Separator);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 double sum = 0;
 string level0 = "";
 size = ArraySize(Sym);
//----
 for(i = 0; i < size; i++)
 {
 //----
 if(Lots[i] == 0)  
 {
 level0 = "Lock";
 }
 else  
 {
 int dig = MarketInfo(Sym[i], MODE_DIGITS);
 double point = MarketInfo(Sym[i], MODE_POINT);
 double COP = Lots[i]*MarketInfo(Sym[i], MODE_TICKVALUE);
 double val = MarketInfo(Sym[i], MODE_BID) - point*Equity[i] / COP;
 level0 = DoubleToStr(val, dig);
 }
 name = prefix + "symbol"+i;
 //----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 30);
 ObjectSet(name, OBJPROP_YDISTANCE, 35 + dy*(i + 2));
 ObjectSetText(name, Sym[i], 10, "Tahoma", _Text);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "equity" + i;
 //----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 120);
 ObjectSet(name, OBJPROP_YDISTANCE, 35 + dy*(i + 2));
 string eq = DoubleToStr(Equity[i], 2);
 //----
 if(Equity[i] > 0) eq = "+" + eq;
 eq = "$" + eq;
 if(Equity[i] > 0) ObjectSetText(name, eq, 10, "Tahoma", _DataPlus);
 if(Equity[i] < 0) ObjectSetText(name, eq, 10, "Tahoma", _DataMinus);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "breakeven"+i;
 //----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 230);
 ObjectSet(name, OBJPROP_YDISTANCE, 35 + dy*(i + 2));
 ObjectSetText(name, level0, 10, "Tahoma", _Data);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 sum += Equity[i];
 }
 name = prefix + "tmp2";
//----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 20);
 ObjectSet(name, OBJPROP_YDISTANCE, 35 + dy*(i + 2));
 ObjectSetText(name, "-----------------------------------------------------",  
 10, "Tahoma", _Separator);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "total";
//----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 30);
 ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+3));
 ObjectSetText(name, _TotalName, 10, "Tahoma", _Text);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 name = prefix + "equity_total";
//----
 if(ObjectFind(name) == -1)  
 ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
 ObjectSet(name, OBJPROP_XDISTANCE, 120);
 ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+3));
 eq = DoubleToStr(sum, 2);
//----
 if(sum > 0)  
 eq = "+" + eq;
 eq = "$" + eq;
 //ObjectSetText(name, eq, 10, "Tahoma", _Data);
 if(sum > 0) ObjectSetText(name, eq, 10, "Tahoma", _DataPlus);
 if(sum < 0) ObjectSetText(name, eq, 10, "Tahoma", _DataMinus);
 ObjectSet(name, OBJPROP_CORNER, Corner);
 }
//+------------------------------------------------------------------+



 

спасибо!

а он может подавать сигнал (непрерывный, каждую минуту например) о превышении Total Equiti заданного порога?

 

добавить бы третью колонку с колличеством пунктов + -

 

Индиктор просто супер!!! Даже цветовая гамма подобрана со вкусом!.

Добавить бы колонки (колонки можно сделать отключаемые в настройках):

1) текущая цена, если много валютных пар

2) % изменения с начала дня (недели, месяца)

А если бы сделать в виде советника, чтобы закрывать ТОЛЬКО определенную пару из портфеля по достижении определенного профита (например в валюте депозита). Я бы даже купил.

Автору респект!

По золоту усредняет почему то ошибками :(

 

Косяк по золоту (GOLD) считает НЕПРАВИЛЬНО

 
У меня раньше работал нормально, а потом переустанавливал MetaTrader и он перестал видеть некоторые пары. Ну просто нет их в его окне и всё! А именно USDCAD и GBPJPY. Хотя ордера находятся в рынке и торгуются. Что только не делал, ничего не помогло. Никто не знает что это может быть?
Причина обращения: