
//+------------------------------------------------------------------+
//| StopOutInfo.mq4 |
//| Copyright 2020, Dmitriy Kudryashov. |
//| https://www.mql5.com/ru/users/dlim0n4ik.dk |
//+------------------------------------------------------------------+
#property strict //Указание компилятору на применение особого строгого режима проверки ошибок
//---
#define NAME_PROGRAM "Indicator" // Имя программы
#define YEAR_CREATE 2020 // Год создание первой рабочей версии программы
#define NAME_COMPANY "Dmitriy Kudryashov." // Имя компании (автора)
//---
bool debug_mode = false; // Режим отладки. В журнале при тестировании выводятся сообщения из разных функций.
bool demo_version = false; // Данная версия программы является демонстративной?
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Функция деинициализации программы |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
//--------------------------------------------------------------------
ObjectsDeleteAll(0,"info_");
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
string symbol = Symbol();
//--- Определим соответствующее свойства для символа -----------------
int digits = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);// Количество знаков после запятой
double point = SymbolInfoDouble(symbol,SYMBOL_POINT); // Значение одного пункта
double bid = SymbolInfoDouble(symbol,SYMBOL_BID); // Лучшее предложение на продажу
double ask = SymbolInfoDouble(symbol,SYMBOL_ASK); // Лучшее предложение на покупку
//--------------------------------------------------------------------
string comment = "";
int stop_out = AccountStopoutLevel();
double equity = AccountEquity();
double averaging_price = AveragingPrice(symbol);
//--------------------------------------------------------------------
comment += "Уровень слива: " + 000 + "\n";
comment += "Осталось до StopOut: " + DoubleToStr(equity / CountOpenOrders(symbol),0) + "\n";
comment += "Закрытие/StopOut: " + StringConcatenate(stop_out) + "%" + "\n";
comment += "Уровень Общ.Безуб.: " + DoubleToStr(averaging_price,digits) + "\n";
comment += "... осталось: " + DoubleToStr((averaging_price - bid) / point,0) + "\n";
//comment += (AccountEquity()/AccountFreeMargin()) * 100 + "\n";
//--------------------------------------------------------------------
Comment(comment);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Описание : Расчитывает уровень бузубытка открытых позиций с |
//| задаными параметрами. |
//| Параметры: |
//| symbol - Наименование тогового инструмента |
//| (NULL текущий торговый инструмент); |
//| cmd - Торговая операция (При значении -1 будет |
//| обрабатываться любая позиция); |
//| magic - Номер индентификатора торгового советника |
//| (NULL любой номер). |
//| Версия от: 01.10.2019 |
//+------------------------------------------------------------------+
double AveragingPrice(string symbol = NULL)
{
//--- Проверим торговый инстремент (символ)... -----------------------
if (symbol == NULL) symbol = Symbol(); // Если символ равен NULL, то присвоим символу значения Symbol()
//--------------------------------------------------------------------
//--- Определяем соответствующее свойства указанного символа ---------
int digits = (int) SymbolInfoInteger(symbol,SYMBOL_DIGITS); /* Количество знаков после запятой */
double point = SymbolInfoDouble(symbol,SYMBOL_POINT); /* Значение одного пункта */
double tickvalue = MarketInfo(symbol,MODE_TICKVALUE);
//--------------------------------------------------------------------
//--- Инициализация переменых... -------------------------------------
double result = 0.0; /* ... конечного результата */
double count_price = 0.0; /* ... сумма цены */
double count_lots = 0.0; /* ... сумма лота */
//--------------------------------------------------------------------
//--- Расчет средней цены безубытка ----------------------------------
for (int index = 0; index < OrdersTotal(); index++)
{
if (OrderSelect(index, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
if (OrderSymbol() == symbol)
{
if (OrderType() == OP_BUY)
{
count_price += OrderOpenPrice() * OrderLots();
count_lots += OrderLots();
}
if (OrderType() == OP_SELL)
{
count_price -= OrderOpenPrice() * OrderLots();
count_lots -= OrderLots();
}
}
}
//--------------------------------------------------------------------
if (count_lots < 0.01) count_lots = 0.01;
result = NormalizeDouble((count_price / count_lots), digits);
//--------------------------------------------------------------------
return(result);
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Описание : Функция ведет подсчет открытых или отложеных позиций |
//| с задаными параметрами. |
//| Параметры: |
//| symbol - Наименование тогового инструмента |
//| (NULL текущий торговый инструмент); |
//| cmd - Торговая операция (При значении -1 будет |
//| обрабатываться любая позиция); |
//| magic - Номер индентификатора торгового советника |
//| (NULL любой номер). |
//| Версия от: 01.10.2019 |
//+------------------------------------------------------------------+
int CountOpenOrders(string symbol = NULL) //Торговый инструмент
{
//--- Проверим торговый инстремент (символ)... -----------------------
if (symbol == NULL) symbol = Symbol(); // Если символ равен NULL, то присвоим символу значения Symbol()
//--------------------------------------------------------------------
//--- Инициализация переменных ---------------------------------------
int count = 0; // Расчет
int result_new = 0; // Новый результат изменяется каждый раз после подсчета значения count
int static result_old = 0;// Старый результат (является статичным значением)
int static result = 0; // Конечный результат (является статичным значением)
//--------------------------------------------------------------------
//--- Цикл подсчета открытых ордеров... ------------------------------
for (int index = 0; index < OrdersTotal(); index++) // перебираем значение index пока оно меньше количества открытых и отложеных позиций
{
if (OrderSelect(index, SELECT_BY_POS, MODE_TRADES)==false) break; // выберим открытую позицию...
if (OrderSymbol() == symbol) // проверим символ ордера...
{
if (OrderType() == OP_BUY) count++; // проверим тип (торговую операцию) позиции и увеличим значение count на 1
if (OrderType() == OP_SELL) count--;
}
}
//--------------------------------------------------------------------
result = count;
//--------------------------------------------------------------------
return (result); // вернем полученое значение result
}
//+------------------------------------------------------------------+
Kudryashov