Um exemplo de utilização da função ClosePosBySizeProfitInCurrency()
Especialmente para demonstrar a função ClosePosBySizeProfitInCurrency(), escrevi um Consultor Especialista e-CloseByProfitPosInCurrency, que fecha somente aquelas posições em que o lucro na moeda do depósito excede um determinado valor especificado. O Expert Advisor pode ser instalado em apenas uma tabela ou em várias tabelas. Você pode especificar uma lista de posições a serem fechadas usando parâmetros externos do Expert Advisor:
symbol="0" - Instrumento comercial. São permitidos os seguintes valores: "0" - qualquer instrumento comercial, "" - somente o instrumento atual e qualquer valor da visão geral do mercado (EURUSD, GBPUSD, etc.).
Você, Igor, tem uma função que fecha posições perdidas de forma similar ao ClosePosBySizeProfitInCurrency() quando uma perda especificada é atingida. (Ou, talvez, uma combinação, onde se pode especificar o fechamento sobre o lucro e sobre o prejuízo).
Pelo que entendi, podemos simplesmente definir nos parâmetros pr para OrderProfit() - com sinal de menos e conseguiremos o que estamos procurando.
É possível estabelecer o limite em pontos (não em moeda de depósito)? Se sim, então como ? (TakeProfit e StopLoss não são sugeridos)
rid писал (а): Você, Igor, tem uma função que fecha posições perdidas de forma similar ao ClosePosBySizeProfitInCurrency() quando uma perda especificada é atingida. (Ou talvez um combinado, onde você pode especificar o fechamento com lucro e prejuízo).
Não, eu ainda não tenho essa função. No entanto, você pode refazer ClosePosBySizeProfitInCurrency():
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 25.04.2008 |//| Описание : Закрытие тех позиций, у которых убыток в валюте депозита |//| превысил некоторое значение |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| pr - профит/убыток |//+----------------------------------------------------------------------------+voidClosePosBySizeLossInCurrency(stringsy="", intop=-1, intmn=-1, doublepr=0){inti, 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(OrderProfit()+OrderSwap()<-MathAbs(pr))ClosePosBySelect();
}}}}}}
Fi-lo para que a perda pudesse ser passada como um número positivo (perda) e negativo (lucro com um sinal de menos).
rid escreveu: Pelo que entendi, podemos apenas definir nos parâmetros pr para OrderProfit() - com sinal de menos e conseguiremos o que estamos procurando.
É possível estabelecer o limite em pontos (e não na moeda do depósito)? Se sim, como ? (Take Profit e Stop Loss não são uma opção)
Esta função fecha posições cujos parâmetros atendem aos valores especificados:
sy - Nome do instrumento. Se você definir este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa o instrumento atual, e "" (por 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 padrão -1 - qualquer MagicNumber.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие позиций по рыночной цене |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+voidClosePositions(stringsy="", intop=-1, intmn=-1){inti, 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)ClosePosBySelect();
}}}}}
Por favor, ajudem-me!! Há 4 dias eu tenho estado intrigado com uma tarefa aparentemente simples. Tenho que prescrever, se a CCI se tornou superior a 100, então abrir posição de compra até que o valor seja inferior a -100, e quando for inferior a -100, então abrir posição de venda até que seja superior a 100.
Esta função fecha posições em uma determinada ordem, ou seja, posições lucrativas primeiro, seguidas por todas as outras posições. Uma seleção mais precisa das posições a serem fechadas é definida por parâmetros externos:
sy - Nome do instrumento. Se este parâmetro for definido, a função só verificará as posições do 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.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие позиций по рыночной цене сначала прибыльных |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+voidClosePosFirstProfit(stringsy="", intop=-1, intmn=-1){inti, 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(OrderProfit()+OrderSwap()>0)ClosePosBySelect();
}}}}}// Потом все остальныеk=OrdersTotal();
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)ClosePosBySelect();
}}}}}
Esta função fecha uma posição com o máximo lucro positivo na moeda do depósito. Ou seja, de cinco posições, cada uma com um lucro de -34, 15, 73, -90, 41, a posição com um lucro de 73 unidades na moeda do depósito será fechada. Uma seleção mais precisa das posições a serem fechadas é especificada usando parâmetros externos:
sy - Nome do instrumento. Se definirmos este parâmetro, a função só verificará as posições do 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.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие одной позиции с максимальным положительным профитом |//| в валюте депозита |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+voidClosePosWithMaxProfitInCurrency(stringsy="", intop=-1, intmn=-1){doublepr=0;
inti, k=OrdersTotal(), np=-1;
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(mn<0 || OrderMagicNumber()==mn){if(pr<OrderProfit()+OrderSwap()){pr=OrderProfit()+OrderSwap();
np=i;
}}}}}if(np>=0){if(OrderSelect(np, SELECT_BY_POS, MODE_TRADES)){ClosePosBySelect();
}}}
B_Dima: Se o valor da CCI estiver acima de 100, então abra uma posição de compra até que o valor esteja abaixo de -100 e quando estiver abaixo de -100, então abra uma posição de venda até que esteja acima de 100.
Para você, Dima, eu posso sugerir esta função:
intCCI_period=14;
intApplied_Price=PRICE_CLOSE;
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 28.24.2008 |//| Описание : Возвращает торговый сигнал: |//| 1 - покупай |//| 0 - сиди, кури бамбук |//| -1 - продавай |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| nb - номер бара ( 0 - текущий номер бара) |//+----------------------------------------------------------------------------+intGetTradeSignal(stringsy="", inttf=0, intnb=0){if(sy=="" || sy=="0")sy=Symbol();
doublecci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
doublecci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
intbs=0;
if(cci1<=+100 && cci0>+100)bs=+1;
if(cci1>=-100 && cci0<-100)bs=-1;
return(bs);
}
Esta função retorna 1 quando se compra e -1 quando se vende. As condições de compra/venda são as que você deseja que sejam. Tudo o que você precisa fazer agora é fazer o seguinte em cada tic tac:
1. Obtenha o valor da GetTradeSignal().
2. Se o valor recebido ==0, então não faça nada.
Se o valor recebido for >0, então feche todas as vendas e compras.
4. Se o valor obtido for <0, então feche todas as compras e vendas.
Mas permite parar o Expert Advisor ao pressionar o botão "Expert Advisors" na barra de ferramentas.
Não há muitos parâmetros para deixar a EA, não vai ser difícil.
Um exemplo de utilização da função ClosePosBySizeProfitInCurrency()
Especialmente para demonstrar a função ClosePosBySizeProfitInCurrency(), escrevi um Consultor Especialista
e-CloseByProfitPosInCurrency, que fecha somente aquelas posições em que o lucro na moeda do depósito excede um determinado valor especificado. O Expert Advisor pode ser instalado em apenas uma tabela ou em várias tabelas. Você pode especificar uma lista de posições a serem fechadas usando parâmetros externos do Expert Advisor:
Boa tarde a todos.
Você, Igor, tem uma função que fecha posições perdidas de forma similar ao ClosePosBySizeProfitInCurrency() quando uma perda especificada é atingida. (Ou, talvez, uma combinação, onde se pode especificar o fechamento sobre o lucro e sobre o prejuízo).
Pelo que entendi, podemos simplesmente definir nos parâmetros pr para OrderProfit() - com sinal de menos e conseguiremos o que estamos procurando.
É possível estabelecer o limite em pontos (não em moeda de depósito)? Se sim, então como ? (TakeProfit e StopLoss não são sugeridos)
Você, Igor, tem uma função que fecha posições perdidas de forma similar ao ClosePosBySizeProfitInCurrency() quando uma perda especificada é atingida. (Ou talvez um combinado, onde você pode especificar o fechamento com lucro e prejuízo).
Não, eu ainda não tenho essa função. No entanto, você pode refazer ClosePosBySizeProfitInCurrency():
Fi-lo para que a perda pudesse ser passada como um número positivo (perda) e negativo (lucro com um sinal de menos).
Pelo que entendi, podemos apenas definir nos parâmetros pr para OrderProfit() - com sinal de menos e conseguiremos o que estamos procurando.
É possível estabelecer o limite em pontos (e não na moeda do depósito)? Se sim, como ? (Take Profit e Stop Loss não são uma opção)
Veja o código do e-CloseByProfit.
A função ClosePositions().
Esta função fecha posições cujos parâmetros atendem aos valores especificados:
A função ClosePosFirstProfit().
Esta função fecha posições em uma determinada ordem, ou seja, posições lucrativas primeiro, seguidas por todas as outras posições. Uma seleção mais precisa das posições a serem fechadas é definida por parâmetros externos:
A função ClosePosWithMaxProfitInCurrency().
Esta função fecha uma posição com o máximo lucro positivo na moeda do depósito. Ou seja, de cinco posições, cada uma com um lucro de -34, 15, 73, -90, 41, a posição com um lucro de 73 unidades na moeda do depósito será fechada. Uma seleção mais precisa das posições a serem fechadas é especificada usando parâmetros externos:
Se o valor da CCI estiver acima de 100, então abra uma posição de compra até que o valor esteja abaixo de -100 e quando estiver abaixo de -100, então abra uma posição de venda até que esteja acima de 100.
Para você, Dima, eu posso sugerir esta função:
Esta função retorna 1 quando se compra e -1 quando se vende. As condições de compra/venda são as que você deseja que sejam. Tudo o que você precisa fazer agora é fazer o seguinte em cada tic tac:
1. Obtenha o valor da GetTradeSignal().
2. Se o valor recebido ==0, então não faça nada.
Se o valor recebido for >0, então feche todas as vendas e compras.
4. Se o valor obtido for <0, então feche todas as compras e vendas.