Andrey_Ch
Участник
ПАММ группа
- Монет
- 3,538
for(int i=0; i <= OrdersTotal(); i++)
if(OrderSelect(i,SELECT_BY_POS))
if(OrderMagicNumber() == MAGIC && OrderSymbol() == tiker && OrderType()==type)
{
orderSwp+=OrderSwap();
orderCommis+=OrderCommission();
priceOpen +=(OrderOpenPrice() * OrderLots());
lots +=OrderLots();
}
avgprice=NormalizeDouble((priceOpen / lots), Digits); // высчитываем среднюю цену открытых ордеров для закрытия всех ордеров в 0.0
double correctionPrice=orderSwp + orderCommis; //можно сразу в цикле соединять комиссию и своп, я реализовал так.
//отправляю все в функцию расчета профита
avgTakeProfit=count_take_profit(tiker, type, avgprice, lots, correctionPrice); // высчитываем цену Take Profit
double count_take_profit(string tiker, int type, double price, double lots, double commission)
{
double profit=0;
double tProfit= tempTakeProfit*Point;
if(type==OP_BUY)
{
profit=NormalizeDouble(price+tProfit,Digits);
if(lots>0)
{
double tempProfit = profit * lots; //Высчитываю сумму если закрыть все ордера по первоначальному профиту
double tempOpen = price * lots; // Высчитываю сумму которая потрачена для открытия ордеров
double margin = (tempProfit-tempOpen)/Point; // разница между открытием и будущим закрытием и есть профит который я могу получить
double percentDD = commission*100/margin; // высчитываю в процентах сколь занимает комиссия от моего профита
double newtProfit=0;
if(percentDD!=0) // процент не равен 0 начинаю высчитывать новый профит, если равен 0 ничего не делаю
{
if(percentDD<0)
{
percentDD=percentDD*-1;
newtProfit=tProfit+(tProfit*percentDD/100); // если процент отрицательный увеличиваю профит на на полученный процент
}
else
newtProfit=tProfit-(tProfit*percentDD/100);//если процент положительный уменьшаю профит что бы быстрее закрыть ордера.
profit=NormalizeDouble(price+newtProfit,Digits); //С учетом нового профита высчитываю новую цену для закрытия ордеров по профиту.
}
}
}
if(type==OP_SELL)
{
profit=NormalizeDouble(price-tProfit,Digits);
if(lots>0)
{
double tempProfit = profit * lots;
double tempOpen = price * lots;
double margin = (tempProfit-tempOpen)/Point;
double percentDD = commission*100/margin;
double newtProfit=0;
if(percentDD!=0)
{
if(percentDD<0)
{
percentDD=percentDD*-1;
newtProfit=tProfit+(tProfit*percentDD/100);
}
else
newtProfit=tProfit-(tProfit*percentDD/100);
profit=NormalizeDouble(price-newtProfit,Digits);
}
}
}
return(profit);
}
if(OrderSelect(i,SELECT_BY_POS))
if(OrderMagicNumber() == MAGIC && OrderSymbol() == tiker && OrderType()==type)
{
orderSwp+=OrderSwap();
orderCommis+=OrderCommission();
priceOpen +=(OrderOpenPrice() * OrderLots());
lots +=OrderLots();
}
avgprice=NormalizeDouble((priceOpen / lots), Digits); // высчитываем среднюю цену открытых ордеров для закрытия всех ордеров в 0.0
double correctionPrice=orderSwp + orderCommis; //можно сразу в цикле соединять комиссию и своп, я реализовал так.
//отправляю все в функцию расчета профита
avgTakeProfit=count_take_profit(tiker, type, avgprice, lots, correctionPrice); // высчитываем цену Take Profit
double count_take_profit(string tiker, int type, double price, double lots, double commission)
{
double profit=0;
double tProfit= tempTakeProfit*Point;
if(type==OP_BUY)
{
profit=NormalizeDouble(price+tProfit,Digits);
if(lots>0)
{
double tempProfit = profit * lots; //Высчитываю сумму если закрыть все ордера по первоначальному профиту
double tempOpen = price * lots; // Высчитываю сумму которая потрачена для открытия ордеров
double margin = (tempProfit-tempOpen)/Point; // разница между открытием и будущим закрытием и есть профит который я могу получить
double percentDD = commission*100/margin; // высчитываю в процентах сколь занимает комиссия от моего профита
double newtProfit=0;
if(percentDD!=0) // процент не равен 0 начинаю высчитывать новый профит, если равен 0 ничего не делаю
{
if(percentDD<0)
{
percentDD=percentDD*-1;
newtProfit=tProfit+(tProfit*percentDD/100); // если процент отрицательный увеличиваю профит на на полученный процент
}
else
newtProfit=tProfit-(tProfit*percentDD/100);//если процент положительный уменьшаю профит что бы быстрее закрыть ордера.
profit=NormalizeDouble(price+newtProfit,Digits); //С учетом нового профита высчитываю новую цену для закрытия ордеров по профиту.
}
}
}
if(type==OP_SELL)
{
profit=NormalizeDouble(price-tProfit,Digits);
if(lots>0)
{
double tempProfit = profit * lots;
double tempOpen = price * lots;
double margin = (tempProfit-tempOpen)/Point;
double percentDD = commission*100/margin;
double newtProfit=0;
if(percentDD!=0)
{
if(percentDD<0)
{
percentDD=percentDD*-1;
newtProfit=tProfit+(tProfit*percentDD/100);
}
else
newtProfit=tProfit-(tProfit*percentDD/100);
profit=NormalizeDouble(price-newtProfit,Digits);
}
}
}
return(profit);
}