Eu precisava de uma função para meu painel informativo no outro dia que devolvesse o lucro/perda estimado na moeda do depósito quando um grupo de posições acionasse suas paradas. Bem, não é a primeira vez que escrevo tal função. Eu o testei longa e duramente em diferentes corretoras e em diferentes instrumentos com diferentes formas de cálculo de lucro. Se você não sabe, há três deles: Forex, CFD e Futuros. Mas não consigo encontrar a diferença entre o Forexe o Futures, mas ainda incluí a possibilidade de cálculos diferentes no código. A perda máxima que pode ser devolvida pela função é artificialmente limitada pelo saldo da conta corrente. Tradicionalmente, você pode passar parâmetros para a função e assim filtrar as posições que você precisa para a análise:
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, 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). O valor padrão -1 significa qualquer MagicNumber.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 03.05.2012 |//| Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита |//| в случае срабатывания стопа открытых позиций. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double ProfitIFStopInCurrency(string sy="", int op=-1, int mn=-1) {
if (sy=="0") sy=Symbol(); // Текущий символint i, k=OrdersTotal(); // Подсчёт открытых позицийint m; // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futuresdouble l; // Размер контракта в базовой валюте инструментаdouble p; // Размер пункта в валюте котировкиdouble t; // Минимальный шаг изменения цены инструмента в валюте котировкиdouble v; // Размер минимального изменения цены инструмента в валюте депозитаdouble s=0; // Подсчёт стопа в валюте депозита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)) {
l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
p=MarketInfo(OrderSymbol(), MODE_POINT);
t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
if (OrderType()==OP_BUY) {
if (m==0) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
if (m==1) s-=(OrderOpenPrice()-OrderStopLoss())/p*v/t/l*OrderLots();
if (m==2) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()>0) {
if (m==0) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
if (m==1) s-=(OrderStopLoss()-OrderOpenPrice())/p*v/t/l*OrderLots();
if (m==2) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
} else s=-AccountBalance();
}
}
}
}
}
if (AccountBalance()+s<0) s=-AccountBalance(); // Ограничение убытка балансом счётаreturn(s);
}
HH. O anexo aqui é o roteiro para testar a função ProfitIFStopInCurrency().
Esta função é semelhante à anterior, somente retorna o lucro/perda estimado na moeda do depósito quando um grupo de posições aciona sua tomada. O método de cálculo do lucro também é levado em conta: Forex, CFD e Futuros .O lucro máximo que a função pode retornar é artificialmente limitado pelo número 999.999.999.999. Parâmetros:
sy - Nome do instrumento. Se você especificar este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa o instrumento atual, e "" (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). O valor padrão -1 significa qualquer MagicNumber.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 03.05.2012 |//| Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита |//| в случае срабатывания тейка открытых позиций. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double ProfitIFTakeInCurrency(string sy="", int op=-1, int mn=-1) {
if (sy=="0") sy=Symbol(); // Текущий символint i, k=OrdersTotal(); // Подсчёт открытых позицийint m; // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futuresdouble l; // Размер контракта в базовой валюте инструментаdouble p; // Размер пункта в валюте котировкиdouble t; // Минимальный шаг изменения цены инструмента в валюте котировкиdouble v; // Размер минимального изменения цены инструмента в валюте депозитаdouble s=0; // Подсчёт стопа в валюте депозита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)) {
l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
p=MarketInfo(OrderSymbol(), MODE_POINT);
t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
if (OrderType()==OP_BUY) {
if (OrderTakeProfit()>0) {
if (m==0) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v*OrderLots();
if (m==1) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v/t/l*OrderLots();
if (m==2) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
} else s=999999999;
}
if (OrderType()==OP_SELL) {
if (m==0) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v*OrderLots();
if (m==1) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v/t/l*OrderLots();
if (m==2) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
}
}
}
}
return(s);
}
HH. Anexei um roteiro para testar a função ProfitIFTakeInCurrency().
Olá! você não tem algum tipo de modelo (para iniciantes) para facilitar a escrita de um EA para o testador e para uma negociação real. Algo não está se movendo((((
Chuma: Olá! você não tem algum tipo de modelo (para iniciantes) para facilitar a escrita de um EA para o testador e para uma negociação real. Algo não está se movendo((((
Modelo? :)) Bem, tome qualquer um dos meus EAs como ponto de partida...
KimIV: Modelo? :)) Portanto, tomem qualquer um dos meus EAs como ponto de partida...
Obrigado.... coisas interessantes e úteis em geral.... mas por enquanto estou planejando criar um consultor comercial que abriria e fecharia posições com base nos sinais mais simples (cruzando médias, por exemplo) para começar, mas todas essas verificações, determinando o lote etc. .... o quê, quando e como... um pouco complicado....
Igor, peço desculpas por minhas frequentes perguntas, e espero realmente que isto não seja muito difícil para você..... Você poderia me dizer o que se entende por
Por favor, me diga por que há vantagens em troca(StrToTime(ye+"."+mo+".01").
Função ProfitIFStopInCurrency()
Eu precisava de uma função para meu painel informativo no outro dia que devolvesse o lucro/perda estimado na moeda do depósito quando um grupo de posições acionasse suas paradas. Bem, não é a primeira vez que escrevo tal função. Eu o testei longa e duramente em diferentes corretoras e em diferentes instrumentos com diferentes formas de cálculo de lucro. Se você não sabe, há três deles: Forex, CFD e Futuros. Mas não consigo encontrar a diferença entre o Forex e o Futures, mas ainda incluí a possibilidade de cálculos diferentes no código. A perda máxima que pode ser devolvida pela função é artificialmente limitada pelo saldo da conta corrente. Tradicionalmente, você pode passar parâmetros para a função e assim filtrar as posições que você precisa para a análise:
HH. O anexo aqui é o roteiro para testar a função ProfitIFStopInCurrency().
Função ProfitIFTakeInCurrency()
Esta função é semelhante à anterior, somente retorna o lucro/perda estimado na moeda do depósito quando um grupo de posições aciona sua tomada. O método de cálculo do lucro também é levado em conta: Forex, CFD e Futuros .O lucro máximo que a função pode retornar é artificialmente limitado pelo número 999.999.999.999. Parâmetros:
HH. Anexei um roteiro para testar a função ProfitIFTakeInCurrency().
Olá! você não tem algum tipo de modelo (para iniciantes) para facilitar a escrita de um EA para o testador e para uma negociação real. Algo não está se movendo((((
Modelo? :)) Portanto, tomem qualquer um dos meus EAs como ponto de partida...
Obrigado.... coisas interessantes e úteis em geral.... mas por enquanto estou planejando criar um consultor comercial que abriria e fecharia posições com base nos sinais mais simples (cruzando médias, por exemplo) para começar, mas todas essas verificações, determinando o lote etc. .... o quê, quando e como... um pouco complicado....
Igor, peço desculpas por minhas frequentes perguntas, e espero realmente que isto não seja muito difícil para você..... Você poderia me dizer o que se entende por
gbDisabledna função OpenPosition() para on-line
aqui está uma parte do código:
Ao compilar dá um erro de que a variável não está definida.