Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот, небольшая поправка (у Вас не так):
объем = профит / (кол-во пунктов * стоимость пункта)
x = ((d*c)-a)/(b-d);
a += цена открытия открытого ордера * объем открытого ордера;
b = цена открытия противоположного ордера;
c += объем открытого ордера;
d = цена ТП противоположного ордера;
x = объем противоположного ордера.
Формула записана в функцию. Лот получался со знаком минус, пришлось умножить на -1.
При тестировании (Т\П=50, Лот=1.00) получен убыток 35 единиц вместо запланированной прибыли 50 единиц.
Чего-то не хватает?{
datetime o;
double po, pp, Profit,lot,_a,_b,_c,_d,_X;
double l=-1;
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==Symbol()) {
if (OrderType()==OP_BUY ) {
po=MarketInfo(OrderSymbol(), MODE_POINT);
pp=MarketInfo(OrderSymbol(), MODE_BID);
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (o<OrderOpenTime()) {
o=OrderOpenTime();
lot=OrderLots();
_a +=OrderOpenPrice()*lot;
_b = MarketInfo(OrderSymbol(), MODE_ASK);
_c += lot;
_d = _b-_TP*po;
_X=((_d*_c)-_a)/(_b-_d)*-1;
_X= MathRound(_X / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP);
}
}
}
}
}
}
}
return(_X);
}
Вот, небольшая поправка (у Вас не так):
объем = профит / (кол-во пунктов * стоимость пункта)
После внесённых изменений лот увеличивается даже когда бай позиция в прибыли.
Причём, увеличивается многократно.Profit= OrderProfit() + OrderCommission() + OrderSwap();
lot= Profit/(_TP*po*MarketInfo(_Symbol, MODE_TICKVALUE));
Пример был удален, так как подозрение что его спрашивает не новичок а тот кому лень думать.
После внесённых изменений лот увеличивается даже когда бай позиция в прибыли.
Причём, увеличивается многократно.Profit= OrderProfit() + OrderCommission() + OrderSwap();
lot= Profit/(_TP*po*MarketInfo(_Symbol, MODE_TICKVALUE));
Вот набросок функции для получения лота противоположной позиции. Нужно передать тикет по текущей позиции и ТП для противоположной позиции
{
if(!OrderSelect(ticketOrder, SELECT_BY_TICKET)) return -1;
// --- Стоимость пункта по тек.символу за 1 лот
double pipCost = MarketInfo(_Symbol, MODE_TICKVALUE);
// --- Текущий профит по ордеру, м.б. отрицательным
double curProfit = OrderProfit() + OrderCommission() + OrderSwap();
// --- Находим по текущему ордеру планируемый профит в пунктах
double profitPlanInPoint = 0;
if(OrderType() == OP_BUY) profitPlanInPoint = (OrderTakeProfit() - OrderOpenPrice()) / Point();
if(OrderType() == OP_SELL) profitPlanInPoint = (OrderOpenPrice() - OrderTakeProfit()) / Point();
// --- Находим по текущему ордеру планируемый профит в валюте
double profitPlan = profitPlanInPoint * pipCost * OrderLots();
// --- Разница между планируемой и достигнутой в данный момент прибылью/убытком
double difToProfit = profitPlan - curProfit;
// --- Вычисляем лот для противоположной позиции при известном значении тейкпрофита (OpposTP) для нее
double lot = difToProfit / (OpposTP * pipCost) + OrderLots();
return lot;
}
Пример был удален, так как подозрение что его спрашивает не новичок а тот кому лень думать.
Вряд ли кто станет обращаться за помощью, если может решить задачу самостоятельно.
Вот набросок функции
Спасибо, большое.
Результат очень близок ожидаемому.
Отдельная благодарность, за комментарии.
Теперь если поступил сигнал к покупке, в расчете лота нужно учитывать помимо селл позиции, открытую ранее позицию бай.
Как это сделать?
Пожалуйста.
Теперь если поступил сигнал к покупке, в расчете лота нужно учитывать помимо селл позиции, открытую ранее позицию бай.
Как это сделать?
Захеджируйте Sell-ордер, возьмите текущий профит по ранее открытому Бай и захеджированному Sell, отнимите от планируемого первоначального профита. И можно по этой же функции (getOpposLot()) получить новый Бай-ордер.
Хотя, придется переделать ее, добавьте в формальные параметры double curProfit, и за пределами функции вычисляйте профит по тем ордерам, которые у Вас есть в наличии.
Захеджируйте Sell-ордер, возьмите текущий профит по ранее открытому Бай и захеджированному Sell, отнимите от планируемого первоначального профита. И можно по этой же функции (getOpposLot()) получить новый Бай-ордер.
Хотя, придется переделать ее, добавьте в формальные параметры double curProfit, и за пределами функции вычисляйте профит по тем ордерам, которые у Вас есть в наличии.