Функция GetPotentialLossInCurrency() возвращает суммарный потенциальный убыток открытых позиций в валюте депозита. Расчёт выполняется на основе цены открытия позиции и ценового уровня StopLoss. Если StopLoss какой-либо позиции не установлен, то функция возвращает текущий размер баланса торгового счёта.
Функция GetPotentialLossInCurrency() принимает следующие параметры:
sy- Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op- Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
mn- Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 17.02.2012 |//| Описание : Возвращает суммарный потенциальный убыток |//| открытых позиций в валюте депозита. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double GetPotentialLossInCurrency(string sy="", int op=-1, int mn=-1) {
double pl=0;
double po, tv; // Пункт, спрэд и стоимость пунктаint i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
if (OrderStopLoss()>0) {
po=MarketInfo(OrderSymbol(), MODE_POINT);
if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
else {
tv=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
if (OrderType()==OP_BUY) {
pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
}
if (OrderType()==OP_SELL) {
pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
}
pl+=OrderCommission()+OrderSwap();
}
} else {
pl=AccountBalance();
break;
}
}
}
}
}
return(pl);
}
Во вложении скрипт для проверки работы функции GetPotentialLossInCurrency().
Здравствуйте Игорь. Респект вам за набор очень полезных функций.
Можно ли у вас попросить немного помощи…Хочу сделать что-то вроде частичного локера. Но пока не знаю как это организовать. Задумка в примерно такая :
есть 4 – ордера допустим -200$ -175$ -150$ и -25$ и есть 5+ ордеров суммарно на +400$
если 400 > -200+-175 но меньше чем -200+-175+-150 то закрыть ордера 5 плюсовых и минусовые -200 -175, то есть 2 ордера с убытком от большего к меньшему.
пример грубоват конечно но думаю идею я донес…
первая проблема в том что для начала мне бы как-то их куда-то записать. (в Array я пока не очень понимаю) или найти какой-то другой вариант.
2ая проблема вытекает из первой. Допустим мы получили los[x] с лосями от 4х ордеров … загонять лоси( los[x])скажем в модуль который будет искать тикит по цене или делать что-то при сортировке лосей чтобы он писал в 1у (los[price]) 2ую (los2[tiket])?
Возможно вы мну тыкнете носом в том месте где можно ковырнуть или научите тому чего не умею =)
Наверно, каждый трейдер рано или поздно начинает вычислять то количество пунктов, которое осталось до слива депозита. Вычисления несложные: берём деньги, делим их на на количество лотов в рынке, на стоимость пункта и получаем интересующий нас ответ. Именно этим и занимается моя новая функция ReserveDepositInPoint(), которая принимает следующие параметры:
sy- Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op- Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
mn- Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
Функция ReserveDepositInPoint() корректно обращается со встречными позициями, а именно, вычисляет разницу лотов Buy и Sell и в расчётах использует именно эту разницу. Расчёт ведётся от эквити, то есть предполагается, что стопаут равен 100%. Не учитываются свопы, налоги и комиссии.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 29.02.2012 |//| Описание : Возвращает запас депозита в пунктах. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int ReserveDepositInPoint(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(); // Номера позицийint n, r; // Номер символа в массиве, запас депозита в пунктахdouble ol[], tv; // Массив лотов, стоимость пунктаstring os[]; // Массив символовif (sy=="0") sy=Symbol();
ArrayResize(os, 0);
ArrayResize(ol, 0);
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
n=ArraySearchString(os, OrderSymbol());
if (n<0) {
n=ArraySize(os);
ArrayResize(os, n+1);
ArrayResize(ol, n+1);
}
os[n]=OrderSymbol();
if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
if (OrderType()==OP_BUY ) ol[n]+=OrderLots();
if (OrderType()==OP_SELL) ol[n]-=OrderLots();
}
}
}
}
n=ArraySize(os);
for (i=0; i<n; i++) {
tv=MarketInfo(os[i], MODE_TICKVALUE);
if (tv==0) Message("В обзоре рынка отсутствует символ "+os[i]+". Точность расчётов не гарантируется!");
else {
if (ol[i]!=0) {
ol[i]=MathAbs(ol[i]);
r+=AccountEquity()/tv/ol[i];
}
}
}
if (n>1) r/=n*n;
return(r);
}
Во вложении советник для проверки работы функции ReserveDepositInPoint().
Выполняет поиск трёх последних экстремумов ЗигЗага и возвращает их значения: номер бара и ценовой уровень для каждого экстремума. Все эти данные укладываются в двумерный массив, который передаётся в качестве параметра функции. Вот весь перечень параметров функции:
zz - Двумерный массив значений ЗигЗага. В первый столбец складываются номера баров, а во второй - ценовые значения. Размерность массива должна быть zz[3,2].
sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
Возвращает количество ордеров, установленных на заданном ценовом уровне. Ограничить перечень проверяемых ордеров можно параметрами функции:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Тип торговой операции, тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой тип ордера.
mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
pp - Ценовой уровень установки ордера. Значение по умолчанию -1 - любая цена.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 13.03.2012 |//| Описание : Возвращает количество ордеров, установленных по заданной цене. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| pp - цена (-1 - любая цена) |//+----------------------------------------------------------------------------+int NumberOfOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
int d, i, k=OrdersTotal(), ko=0;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()>1 && OrderType()<6) {
d=MarketInfo(OrderSymbol(), MODE_DIGITS);
pp=NormalizeDouble(pp, d);
if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
if (mn<0 || OrderMagicNumber()==mn) ko++;
}
}
}
}
}
return(ko);
}
Эта функция возвращает последнюю серию убыточных позиций (количество подряд), закрытых с определённой даты. Более точный отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию -"" означает любой рыночный инструмент. NULL означает текущий инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
dt - Дата и время в секундах с 1970 года. Значение по умолчанию - 0 означает учёт всех доступных в истории позиций.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 14.03.2012 |//| Описание : Возвращает последнюю серию убыточных позиций |//| (количество подряд), закрытых с определённой даты. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| dt - Дата и время в секундах с 1970 года ( 0 - с начала истории) |//+----------------------------------------------------------------------------+int NumberOfLastLossPosFromDate(string sy="", int op=-1, int mn=-1, datetime dt=0) {
int i, k=OrdersHistoryTotal(), kp=0;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderProfit()<0) kp++; else kp=0;
}
}
}
}
}
}
return(kp);
}
Эта функция выполняет закрытие всех позиции по рыночной цене за исключением одной с переданным тикетом. Более точный отбор закрываемых позиций задаётся внешними параметрами:
sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
ti - Тикет позиции. Значение по умолчанию 0 - любой тикет.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 20.03.2009 |//| Описание : Закрытие позиций по рыночной цене за исключением одной, |//| : с переданным тикетом. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| ti - тикет позиции ( 0 - любой тикет) |//+----------------------------------------------------------------------------+void ClosePosExceptTicket(string sy="", int op=-1, int mn=-1, int ti=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ti==0 || ti!=OrderTicket()) ClosePosBySelect();
}
}
}
}
}
}
Возвращает неторговое (пополнения, снятия, внутренние переводы, начисления процентов, бонусы) изменение баланса с определённой даты, передаваемой в качестве параметра.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.04.2010 |//| Описание : Возвращает неторговое изменение баланса с определённой даты |//| (пополнения, снятия, внутренние переводы). |//+----------------------------------------------------------------------------+//| Параметры: |//| dt - Дата и время в секундах с 1970 года (0 - с начала истории) |//+----------------------------------------------------------------------------+double GetChangeBalance(datetime dt=0)
{
double p=0;
int i, k=OrdersHistoryTotal();
for (i=0; i<k; i++) {
if (OrderType()==6) {
if (dt<OrderCloseTime()) p+=OrderProfit();
}
}
return(p);
}
Нет ли у Вас (готов и купить)))) того же самого но для работы с экселем?
не-е, нету... )))
Функция GetPotentialLossInCurrency() возвращает суммарный потенциальный убыток открытых позиций в валюте депозита. Расчёт выполняется на основе цены открытия позиции и ценового уровня StopLoss. Если StopLoss какой-либо позиции не установлен, то функция возвращает текущий размер баланса торгового счёта.
Функция GetPotentialLossInCurrency() принимает следующие параметры:
Во вложении скрипт для проверки работы функции GetPotentialLossInCurrency().
Здравствуйте Игорь. Респект вам за набор очень полезных функций.
Можно ли у вас попросить немного помощи… Хочу сделать что-то вроде частичного локера. Но пока не знаю как это организовать. Задумка в примерно такая :
есть 4 – ордера допустим -200$ -175$ -150$ и -25$ и есть 5+ ордеров суммарно на +400$
если 400 > -200+-175 но меньше чем -200+-175+-150 то закрыть ордера 5 плюсовых и минусовые -200 -175, то есть 2 ордера с убытком от большего к меньшему.
пример грубоват конечно но думаю идею я донес…
первая проблема в том что для начала мне бы как-то их куда-то записать. (в Array я пока не очень понимаю) или найти какой-то другой вариант.
2ая проблема вытекает из первой. Допустим мы получили los[x] с лосями от 4х ордеров … загонять лоси( los[x])скажем в модуль который будет искать тикит по цене или делать что-то при сортировке лосей чтобы он писал в 1у (los[price]) 2ую (los2[tiket])?
Возможно вы мну тыкнете носом в том месте где можно ковырнуть или научите тому чего не умею =)
Наверно, каждый трейдер рано или поздно начинает вычислять то количество пунктов, которое осталось до слива депозита. Вычисления несложные: берём деньги, делим их на на количество лотов в рынке, на стоимость пункта и получаем интересующий нас ответ. Именно этим и занимается моя новая функция ReserveDepositInPoint(), которая принимает следующие параметры:
Функция ReserveDepositInPoint() корректно обращается со встречными позициями, а именно, вычисляет разницу лотов Buy и Sell и в расчётах использует именно эту разницу. Расчёт ведётся от эквити, то есть предполагается, что стопаут равен 100%. Не учитываются свопы, налоги и комиссии.
Во вложении советник для проверки работы функции ReserveDepositInPoint().
Функция SetFibo().
Эта функция выполняет установку объекта OBJ_FIBO Уровни Фибоначчи на текущем графике.
Функция GetLastThreeExtremumZZ().
Выполняет поиск трёх последних экстремумов ЗигЗага и возвращает их значения: номер бара и ценовой уровень для каждого экстремума. Все эти данные укладываются в двумерный массив, который передаётся в качестве параметра функции. Вот весь перечень параметров функции:
Во вложении скрипт для тестирования функции GetLastThreeExtremumZZ().
Функция NumberOfOrdersByPrice().
Возвращает количество ордеров, установленных на заданном ценовом уровне. Ограничить перечень проверяемых ордеров можно параметрами функции:
Функция NumberOfLastLossPosFromDate().
Эта функция возвращает последнюю серию убыточных позиций (количество подряд), закрытых с определённой даты. Более точный отбор учитываемых позиций задаётся внешними параметрами:
Функция ClosePosExceptTicket().
Эта функция выполняет закрытие всех позиции по рыночной цене за исключением одной с переданным тикетом. Более точный отбор закрываемых позиций задаётся внешними параметрами:
Функция GetChangeBalance().
Возвращает неторговое (пополнения, снятия, внутренние переводы, начисления процентов, бонусы) изменение баланса с определённой даты, передаваемой в качестве параметра.