Просчет профита закрытых ордеров "HELP" - страница 4 123456789 Новый комментарий [Удален] 2016.12.11 16:53 #31 Renat Akhtyamov: Нет, эту строчку убираем. Здесь уже расчет профита, работать так не будет. Где команда на закрытие в коде - туда//+----------------------------------------------------------------------------+// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |//+----------------------------------------------------------------------------+double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция) double LastProfit=0; for(i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) { if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue; if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();} } return(LastProfit); }и в условии на закрытие{CloseOrder(OrderTicket());t=TimeCurrent();} {DeleteAll();t=TimeCurrent();}1 не считает, 2 правильно считает, 3 не считает 0 Как кодировать? Выбрать последний ордер из Любые вопросы новичков по Renat Akhtyamov 2016.12.11 16:59 #32 Natashe4ka: //+----------------------------------------------------------------------------+// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |//+----------------------------------------------------------------------------+double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция) double LastProfit=0; for(i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) { if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue; if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();} } return(LastProfit); }и в условии на закрытие{CloseOrder(OrderTicket());t=TimeCurrent();} {DeleteAll();t=TimeCurrent();}1 не считает, 2 правильно считает, 3 не считает 0а так{t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();}И ещеУ Вас ордера закрываются по тикету?Значит нужно еще раньше запомнить время начала закрытия серииТ.е. там где только сформировалось решение на закрытие серии, не важно - будет реальное закрытие или нет Частичное закрытие ордера Закрытие сделки Поиск удалившегося ордера по Vitaly Muzichenko 2016.12.11 17:02 #33 Natashe4ka: //+----------------------------------------------------------------------------+ Понимаю вашу настойчивость, но Я вам дал рабочий вариант, с хорошей функцией закрытия серии позиций для реальной торговли, а не работы в тестере.Там всё считает и запоминает, даже в случае перезагрузки терминала.Вот проверьте, просто запустите в тестере, и сравните результаты с историей сделок PS. Забыл в коде записать - вот исправление Файлы: e-info.mq4 10 kb Как правильно посчитать прибыль Эксперт для MT4, который Субботник по наполнению FAQ [Удален] 2016.12.11 17:13 #34 Vitaly Muzichenko: Понимаю вашу настойчивость, но Я вам дал рабочий вариант, с хорошей функцией закрытия серии позиций для реальной торговли, а не работы в тестере.Там всё считает и запоминает, даже в случае перезагрузки терминала.Вот проверьте, просто запустите в тестере, и сравните результаты с историей сделокА как применить это в моём коде?У меня от значения LastProfitCL зависит дальнейшее действие [Удален] 2016.12.11 17:15 #35 Renat Akhtyamov: а так{t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();}И ещеУ Вас ордера закрываются по тикету?Значит нужно еще раньше запомнить время начала закрытия серииТ.е. там где только сформировалось решение на закрытие серии, не важно - будет реальное закрытие или нетА если по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профита Vitaly Muzichenko 2016.12.11 17:17 #36 Natashe4ka: А как применить это в моём коде?У меня от значения LastProfitCL зависит дальнейшее действиеНу так это понятно, просто применяйте по усмотрению в таком виде double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit"))); Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );Объявите единоразово "LastProfit" и используйте где нужно Renat Akhtyamov 2016.12.11 17:17 #37 Natashe4ka: А ели по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профитаДа, пропустит.Можно каждый тик проверять сколько осталось в "живых" ордеров.Если столько же, то запоминать время предыдущего тика, как вариантТогда и получится то что Вам нужноНо стопов обычно в автоматах не бывает Вопросы от начинающих MQL4 [АРХИВ]Любой вопрос новичка, чтоб Как поставить условие при Vitaly Muzichenko 2016.12.11 17:18 #38 Natashe4ka: А если по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профитаОн будет считать только те, что закрыты последние по времени, и не зависит от суммы закрытия. Вообще, задача полностью не ясна, поэтому дальнейшее обсуждение не веду.//--------------------------------------------------------- Вот тут всё расписал, более не понимаю задачу: Файлы: e_info.mq4 10 kb [Удален] 2016.12.11 17:38 #39 Vitaly Muzichenko:Вот тут всё расписал, более не понимаю задачу:Ок, спасибо [Удален] 2016.12.11 18:31 #40 Так тоже правильно считает если "cnt" обнулить, но потом опять не понятное значение как на скрине №3 было (должно быть значение профита 4,27)double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция) int cnt=0; double LastProfit=0; for(i=0;i<OrdersHistoryTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) { if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue; if ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;} } return(LastProfit); } Как кодировать? Любые вопросы новичков по Какое время у закрытого 123456789 Новый комментарий
Нет, эту строчку убираем. Здесь уже расчет профита, работать так не будет.
Где команда на закрытие в коде - туда
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
и в условии на закрытие
{CloseOrder(OrderTicket());t=TimeCurrent();}
{DeleteAll();t=TimeCurrent();}1 не считает, 2 правильно считает, 3 не считает 0
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
и в условии на закрытие
{CloseOrder(OrderTicket());t=TimeCurrent();}
{DeleteAll();t=TimeCurrent();}1 не считает, 2 правильно считает, 3 не считает 0
а так
{DeleteAll();}
И еще
У Вас ордера закрываются по тикету?
Значит нужно еще раньше запомнить время начала закрытия серии
Т.е. там где только сформировалось решение на закрытие серии, не важно - будет реальное закрытие или нет
Понимаю вашу настойчивость, но Я вам дал рабочий вариант, с хорошей функцией закрытия серии позиций для реальной торговли, а не работы в тестере.
Там всё считает и запоминает, даже в случае перезагрузки терминала.
Вот проверьте, просто запустите в тестере, и сравните результаты с историей сделок
PS. Забыл в коде записать - вот исправление
Понимаю вашу настойчивость, но Я вам дал рабочий вариант, с хорошей функцией закрытия серии позиций для реальной торговли, а не работы в тестере.
Там всё считает и запоминает, даже в случае перезагрузки терминала.
Вот проверьте, просто запустите в тестере, и сравните результаты с историей сделок
А как применить это в моём коде?
У меня от значения LastProfitCL зависит дальнейшее действие
а так
{DeleteAll();}
И еще
У Вас ордера закрываются по тикету?
Значит нужно еще раньше запомнить время начала закрытия серии
Т.е. там где только сформировалось решение на закрытие серии, не важно - будет реальное закрытие или нет
А как применить это в моём коде?
У меня от значения LastProfitCL зависит дальнейшее действие
Ну так это понятно, просто применяйте по усмотрению в таком виде
Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );
Объявите единоразово "LastProfit" и используйте где нужно
А ели по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профита
Да, пропустит.
Можно каждый тик проверять сколько осталось в "живых" ордеров.
Если столько же, то запоминать время предыдущего тика, как вариант
Тогда и получится то что Вам нужно
Но стопов обычно в автоматах не бывает
А если по стопу закроется то {t=TimeCurrent();CloseOrder(OrderTicket());} {DeleteAll();} уже пропустит значение профита
Он будет считать только те, что закрыты последние по времени, и не зависит от суммы закрытия.
Вообще, задача полностью не ясна, поэтому дальнейшее обсуждение не веду.
//---------------------------------------------------------
Вот тут всё расписал, более не понимаю задачу:
Вот тут всё расписал, более не понимаю задачу:
Так тоже правильно считает если "cnt" обнулить, но потом опять не понятное значение как на скрине №3 было (должно быть значение профита 4,27)
int cnt=0;
double LastProfit=0;
for(i=0;i<OrdersHistoryTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue;
if ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
}
return(LastProfit);
}