//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
难道你没有(准备并愿意购买)))),但要与excel合作?
不,没有...)))
GetPotentialLossInCurrency() 函数返回存款货币的未平仓头寸的总潜在损失。该计算是根据头寸的开盘价和止损价位进行的。如果没有为任何头寸设置止损,该函数将返回交易账户的当前资产。
GetPotentialLossInCurrency() 函数接受以下参数。
附上一个测试GetPotentialLossInCurrency() 函数的脚本。
你好,伊戈尔。为你的这套非常有用的功能鼓掌叫好。
我可以向你寻求一些帮助吗...... ,我想做一些部分储物柜。但到目前为止,我还不知道如何安排它。这个想法是这样的。
有4个-订单,比方说-200美元-175美元-150美元和-25美元,有5个以上的订单,总计+400美元。
如果400>-200+-175,但小于-200+-175+-150,那么就关闭5个加减单 -200 -175,也就是2个亏多赚少的订单。
这个例子比较粗糙,但我想我已经明白了......
第一个问题是,我需要一些东西来写下它们。(我不太明白Array) ,或者找一些其他的方法。
第二个问题是由第一个问题引起的。假设我得到了 来自4个不同订单的手数的 los[x]......我是否应该将手数( los[x])加载 到一个模块中,该模块将根据价格搜索tiket,或者我在对手数进行排序时加入1(los[price])和2(los2[tiket])?
也许你可以给我指出一个地方,你可以这样做,或者教我我不知道的东西=)
可能每个交易员迟早都会开始计算存款损失前剩余的点数。计算方法很简单:我们把钱拿出来,除以市场上的手数,再除以点值,就可以得到我们要找的答案。这正是我的新函数ReserveDepositInPoint() 所做的,它接受以下参数。
ReserveDepositInPoint() 函数正确地处理了对立的头寸,即它计算了卖出 和买入手数 之间的差额,并在计算中正好使用这一差额。计算是基于权益的,即假定停损率为100%。不考虑掉期、税收和佣金。
附上一个专家顾问来检查 ReserveDepositInPoint()函数 。
函数SetFibo()。
此函数在当前图表上设置OBJ_FIBO 对象的斐波那契水平。
GetLastThreeExtremumZZ()函数。
对ZigZag的最后三个极值进行搜索,并返回它们的值:每个极值的条数和价格水平。所有这些数据都包含在一个二维数组中,作为参数传递给函数。下面是函数参数的整个列表。
附上一个测试GetLastThreeExtremumZZ() 函数的脚本。
NumberOfOrdersByPrice()函数。
返回在给定价格水平上设置的订单数量。你可以用函数参数限制要检查的订单列表。
NumberOfLastLossPosFromDate()函数。
该函数返回自某一日期以来关闭的最后一系列亏损头寸(一排的数量)。使用外部参数指定要考虑的位置的更精确选择。
ClosePosExceptTicket()函数。
这个函数以市场价格关闭所有的头寸,除了有传票的头寸。要关闭的位置的更精确选择是由外部参数指定的。
GetChangeBalance()函数。
返回非交易(存款、取款、内部转账、应计利息、奖金) 余额从作为参数传递的某个日期开始的变化。