A função GetPotentialLossInCurrency() retorna a perda potencial total de posições em aberto na moeda de depósito. O cálculo é realizado com base no preço de abertura da posição e no nível de preço StopLoss. Se o StopLoss não for definido para nenhuma posição, esta função retorna o patrimônio líquido atual da conta de negociação.
A função GetPotentialLossInCurrency() aceita os seguintes parâmetros:
sy- Nome do instrumento. Se definirmos este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa instrumento atual, enquanto "" (padrão) significa qualquer instrumento.
op- Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. Valor por default -1 - significa qualquer posição.
mn- Identificador de posição (MagicNumber). O valor padrão -1 significa qualquer MagicNumber.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
Em anexo está um roteiro para testar a função GetPotentialLossInCurrency().
Olá Igor. Kudos para você por seu conjunto de características muito úteis.
Posso pedir-lhe ajuda...Quero fazer uma espécie de cacifo parcial. Mas, até agora, não sei como organizar isso. A idéia é assim:
Há 4 pedidos, digamos -200$ -175$ -150$ e -25$ e há mais de 5 pedidos, totalizando +400$.
Se 400 > -200+-175 mas menos de -200+-175+-150 então feche 5 pedidos mais e menos-200 -175, ou seja 2 pedidos com uma perda de mais a menos.
este exemplo é bastante rude, mas acho que tenho a idéia...
O primeiro problema é que eu preciso de algo para escrevê-los. (Eu realmente não entendo o Array) ou encontrar outra forma.
O segundo problema decorre do primeiro. Suponha que eu tenha perdido[x] com lotes de 4 pedidos diferentes... devo carregar lotes ( los[x]) em um módulo que irá procurar pelo tiket de acordo com o preço ou eu adiciono 1 (los[preço]) e 2 (los2[tiket]) enquanto ordeno os lotes?
Talvez você possa me indicar um lugar onde você possa fazer isso ou me ensinar algo que eu não possa =)
Provavelmente cada comerciante, mais cedo ou mais tarde, começa a calcular o número de pips restantes antes que o depósito seja perdido. O cálculo é simples: pegamos o dinheiro, dividimo-lo pelo número de lotes no mercado, pelo valor do ponto e obtemos a resposta que estamos procurando. Isto é exatamente o que minha nova função ReserveDepositInPoint() faz, ela toma os seguintes parâmetros:
sy- Nome do instrumento. Se você definir este parâmetro, a função verificará apenas as posições do instrumento especificado. NULL significa o instrumento atual, enquanto "" (por padrão) significa qualquer instrumento.
op- Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. Valor por default -1 - significa qualquer posição.
mn- Identificador de posição (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
A função ReserveDepositInPoint() trata corretamente as posições opostas, ou seja, calcula a diferença entre Vender e Comprar lotes e utiliza exatamente esta diferença nos cálculos. Os cálculos são baseados em equidade, ou seja, supõe-se que a parada é de 100%. Trocas, impostos e comissões não são considerados.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
Em anexo está um Expert Advisor para verificar a função ReserveDepositInPoint().
Esta função define os níveis de Fibonacci do objeto OBJ_FIBO no gráfico atual.
cl - Matriz de cores do objeto de níveis Fibonacci. Parâmetro obrigatório. Dois elementos. A primeira define a cor do objeto, a segunda - a cor das linhas dos níveis.
st - Array de estilos de objetosNíveis de Fibonacci. Parâmetro necessário. Dois elementos. O primeiro define o estilo do objeto, o segundo - o estilo das linhas dos níveis.
wd - Conjunto de larguras deobjetosNíveis de Fibonacci. Parâmetro necessário. Dois elementos. A primeira define a largura do objeto, a segunda - as larguras das linhas dos níveis.
fl - Níveis de Fibonacci. Parâmetro necessário.
nm - Nome do objeto. Quando o valor padrão é passado - "", o tempo de abertura da barra atual é usado como o nome.
t1 - Primeira coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da décima barra.
p1 - Primeira coordenada do objeto que fixa o preço. Valor padrão - 0 - mínimo da décima barra.
t2 - Segunda coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da barra atual.
p2 - Segunda coordenada do objeto que fixa o preço. Valor padrão - 0 - barra de corrente baixa.
ry - Bandeira da propriedade AZUL. O valor padrão é Falso.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.03.2012 |//| Описание : Установка объекта OBJ_FIBO Уровни Фибоначчи. |//+----------------------------------------------------------------------------+//| Параметры: |//| cl - массив цветов линий |//| st - массив стилей линий |//| wd - массив ширин линий |//| fl - массив уровней Фибоначчи |//| nm - наименование ( "" - время открытия текущего бара) |//| t1 - время открытия бара ( 0 - Time[10] |//| p1 - ценовой уровень ( 0 - Low[10]) |//| t2 - время открытия бара ( 0 - текущий бар) |//| p2 - ценовой уровень ( 0 - Bid) |//| ry - луч (False - не луч) |//+----------------------------------------------------------------------------+void SetFibo(color& cl[], int& st[], int& wd[], double& fl[], string nm="",
datetime t1=0, double p1=0, datetime t2=0, double p2=0,
bool ry=False) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[10];
if (p1<=0) p1=Low[10];
if (t2<=0) t2=Time[0];
if (p2<=0) p2=Bid;
int i, k=ArraySize(fl);
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_FIBO, 0, 0,0, 0,0);
ObjectSet(nm, OBJPROP_TIME1 , t1);
ObjectSet(nm, OBJPROP_PRICE1 , p1);
ObjectSet(nm, OBJPROP_TIME2 , t2);
ObjectSet(nm, OBJPROP_PRICE2 , p2);
ObjectSet(nm, OBJPROP_COLOR , cl[0]);
ObjectSet(nm, OBJPROP_RAY , ry);
ObjectSet(nm, OBJPROP_STYLE , st[0]);
ObjectSet(nm, OBJPROP_WIDTH , wd[0]);
ObjectSet(nm, OBJPROP_LEVELCOLOR, cl[1]);
ObjectSet(nm, OBJPROP_LEVELSTYLE, st[1]);
ObjectSet(nm, OBJPROP_LEVELWIDTH, wd[1]);
if (k>0) {
ObjectSet(nm, OBJPROP_FIBOLEVELS, k);
for (i=0; i<k; i++) {
ObjectSet(nm, OBJPROP_FIRSTLEVEL+i, fl[i]);
ObjectSetFiboDescription(nm, i, DoubleToStr(100*fl[i], 1));
}
}
}
Em anexo está um roteiro para testar a função SetFibo().
Realiza a busca dos três últimos extremos do ZigZag e retorna seus valores: número de barras e nível de preço para cada extremo. Todos estes dados estão contidos em uma matriz bidimensional que é passada como parâmetro para a função. Aqui está a lista completa dos parâmetros das funções:
zz - matriz bidimensional de valores ZigZag. Os números de barra são adicionados à primeira coluna e os valores de preço são adicionados à segunda coluna. A dimensão da matriz deve ser zz[3,2].
sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
Devolve o número de pedidos definidos a um determinado nível de preço. Você pode limitar a lista de pedidos a serem verificados com parâmetros de função:
sy - Nome do instrumento de mercado. Se este parâmetro for dado, a função somente verificará as ordens do instrumento especificado. NULL significa instrumento atual, e "" (por padrão) significa qualquer instrumento.
op - Tipo de comércio, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer tipo de pedido.
mn - Identificador do pedido (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
pp - O nível de preço em que o pedido é estabelecido. O valor padrão de -1 é qualquer preço.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
Esta função retorna a última série de posições perdidas (número em uma linha) fechadas desde uma determinada data. Uma seleção mais precisa das posições a serem levadas em conta é especificada usando parâmetros externos:
sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições deste instrumento. O valor padrão -" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
mn - Identificador de posição, MagicNumber. O valor padrão -1 significa qualquer identificador.
dt - Data e hora em segundos desde 1970. Valor padrão - 0 significa que todas as posições disponíveis na história são levadas em conta.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
Esta função fecha todas as posições ao preço de mercado, exceto aquela com o bilhete aprovado. Uma seleção mais precisa das posições a serem fechadas é especificada por parâmetros externos:
sy - Nome do instrumento. Se este parâmetro for definido, a função verifica as posições somente para o instrumento especificado. NULL significa o instrumento atual, enquanto "" (padrão) significa qualquer instrumento.
op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
mn - Identificador de posição (MagicNumber). Valor por default -1 - qualquer MagicNumber.
ti - Bilhete para a posição. Valor padrão 0 - qualquer bilhete.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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();
}
}
}
}
}
}
O saldo de devoluções não comercializadas (depósitos, saques, transferências internas, acumulação de juros, bônus) muda a partir de uma determinada data passada como parâmetro.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
Você não tem (pronto e disposto a comprar)))) o mesmo, mas para trabalhar com excel?
não, não disponível... )))
A função GetPotentialLossInCurrency() retorna a perda potencial total de posições em aberto na moeda de depósito. O cálculo é realizado com base no preço de abertura da posição e no nível de preço StopLoss. Se o StopLoss não for definido para nenhuma posição, esta função retorna o patrimônio líquido atual da conta de negociação.
A função GetPotentialLossInCurrency() aceita os seguintes parâmetros:
Em anexo está um roteiro para testar a função GetPotentialLossInCurrency().
Olá Igor. Kudos para você por seu conjunto de características muito úteis.
Posso pedir-lhe ajuda... Quero fazer uma espécie de cacifo parcial. Mas, até agora, não sei como organizar isso. A idéia é assim:
Há 4 pedidos, digamos -200$ -175$ -150$ e -25$ e há mais de 5 pedidos, totalizando +400$.
Se 400 > -200+-175 mas menos de -200+-175+-150 então feche 5 pedidos mais e menos -200 -175, ou seja 2 pedidos com uma perda de mais a menos.
este exemplo é bastante rude, mas acho que tenho a idéia...
O primeiro problema é que eu preciso de algo para escrevê-los. (Eu realmente não entendo o Array) ou encontrar outra forma.
O segundo problema decorre do primeiro. Suponha que eu tenha perdido[x] com lotes de 4 pedidos diferentes... devo carregar lotes ( los[x]) em um módulo que irá procurar pelo tiket de acordo com o preço ou eu adiciono 1 (los[preço]) e 2 (los2[tiket]) enquanto ordeno os lotes?
Talvez você possa me indicar um lugar onde você possa fazer isso ou me ensinar algo que eu não possa =)
Provavelmente cada comerciante, mais cedo ou mais tarde, começa a calcular o número de pips restantes antes que o depósito seja perdido. O cálculo é simples: pegamos o dinheiro, dividimo-lo pelo número de lotes no mercado, pelo valor do ponto e obtemos a resposta que estamos procurando. Isto é exatamente o que minha nova função ReserveDepositInPoint() faz, ela toma os seguintes parâmetros:
A função ReserveDepositInPoint() trata corretamente as posições opostas, ou seja, calcula a diferença entre Vender e Comprar lotes e utiliza exatamente esta diferença nos cálculos. Os cálculos são baseados em equidade, ou seja, supõe-se que a parada é de 100%. Trocas, impostos e comissões não são considerados.
Em anexo está um Expert Advisor para verificar a função ReserveDepositInPoint().
Função SetFibo().
Esta função define os níveis de Fibonacci do objeto OBJ_FIBO no gráfico atual.
Função GetLastThreeExtremumZZ().
Realiza a busca dos três últimos extremos do ZigZag e retorna seus valores: número de barras e nível de preço para cada extremo. Todos estes dados estão contidos em uma matriz bidimensional que é passada como parâmetro para a função. Aqui está a lista completa dos parâmetros das funções:
Em anexo está um roteiro para testar a função GetLastThreeExtremumZZ().
A função NumberOfOrdersByPrice().
Devolve o número de pedidos definidos a um determinado nível de preço. Você pode limitar a lista de pedidos a serem verificados com parâmetros de função:
A função NumberOfLastLossPosFromDate().
Esta função retorna a última série de posições perdidas (número em uma linha) fechadas desde uma determinada data. Uma seleção mais precisa das posições a serem levadas em conta é especificada usando parâmetros externos:
A função ClosePosExceptTicket().
Esta função fecha todas as posições ao preço de mercado, exceto aquela com o bilhete aprovado. Uma seleção mais precisa das posições a serem fechadas é especificada por parâmetros externos:
Função GetChangeBalance().
O saldo de devoluções não comercializadas (depósitos, saques, transferências internas, acumulação de juros, bônus) muda a partir de uma determinada data passada como parâmetro.