спасибо, хороший пример поизучаю, вот набросал скрипт под MT4 - определяем прибыль в пунктах
Ну как запустить этот скрипт в MT5 рассказывать не нужно. Однако, сам скрипт содержит ошибки.
Сначала покажу историю
и результат выполнения
Прибыль последнего закрытого ордера -259 пунктов
А ошибки здесь
int LastHistoryProfit(int magic_=-1)
{
datetime t=0;
int profit=0;
for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
{
t=OrderCloseTime();
profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
profit= OrderProfit()>=0.0 ? profit : -profit;
}
}
}
}
}
return(profit);
}
как исправить? никогда не задумывался, схема вроде стандартная: 2 цены - нашли разность и разделили на пункты
с остальным согласен, но нужно подумать, схема перебора ордеров классическая, и хочется на всякий случай сравнивать время на наибольшее.... думать нужно, хотя такая задача первый раз стоит - в 99.99% случаев никто на МТ4 даже и не пытается hft ТС торговать
как исправить? никогда не задумывался, схема вроде стандартная: 2 цены - нашли разность и разделили на пункты
Потеря при кастинге double -> int.
с остальным согласен, но нужно подумать, схема перебора ордеров классическая, и хочется на всякий случай сравнивать время на наибольшее.... думать нужно, хотя такая задача первый раз стоит - в 99.99% случаев никто на МТ4 даже и не пытается hft ТС торговать
HFT не при чем. CloseAll-скрипт вполне может закрыть две позиции внутри одной секунды. В MT4 сравнивать придется, в MT5 - лишнее. Ну и сравнивать, наверное, проще через ArraySort (если, например, нужно быстро переделать на предпоследнюю закрытую позицию).
constdouble point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
возьму на вооружение, я обычно все что будет один раз вычисляться пишу в глобальной видимости, Ваш пример намного лучше читается
....
а точно это корректно? в цикле перебора ордеров будет каждый раз у Вас SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); пересчитан, ведь OrderSymbol() будет каждый раз разный?
написал с нуля за 10 минут? - ну примерно так, логика простая и понятная - берешь и пишешь, в МТ5 пока только сферического коня в вакууме обсуждаем... если сделки и существуют ли ордера, осталось обсудить типы счетов неттинг или хэдж.... ну и к утру что-нибудь напишем
А можно поинтересоваться: зачем брать абсолютную величину разности цены открытия и цены закрытия, а потом если профит позиции меньше нуля, подставлять значению знак минус.
А можно поинтересоваться: зачем брать абсолютную величину разности цены открытия и цены закрытия, а потом если профит позиции меньше нуля, подставлять значению знак минус.
писал на лету, как захотелось - захотел вывод +100 пп или -100 пп, скажем дело вкуса - задачи конкретной не было, а писать условия на определение типа ордера и сравнение цены открытия и закрытия показалось, что будет много лишних строк...
ЗЫ: тут же форум программистов? - они вот такие, один код (особенно чужой) по 10 раз смогут заоптимизировать , чтоб вместо 5 строк стало 4 )))
а точно это корректно? в цикле перебора ордеров будет каждый раз у Вас SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); пересчитан, ведь OrderSymbol() будет каждый раз разный?
Так там задача немного другая - суммарный профит в пунктах по всем символам.
спасибо, хороший пример поизучаю, вот набросал скрипт под MT4 - определяем прибыль в пунктах
Ну как запустить этот скрипт в MT5 рассказывать не нужно. Однако, сам скрипт содержит ошибки.
Сначала покажу историю
и результат выполнения
Прибыль последнего закрытого ордера -259 пунктовА ошибки здесь
А ошибки здесь
При таком вычислении легко потерять один пункт.как исправить? никогда не задумывался, схема вроде стандартная: 2 цены - нашли разность и разделили на пункты
с остальным согласен, но нужно подумать, схема перебора ордеров классическая, и хочется на всякий случай сравнивать время на наибольшее.... думать нужно, хотя такая задача первый раз стоит - в 99.99% случаев никто на МТ4 даже и не пытается hft ТС торговать
как исправить? никогда не задумывался, схема вроде стандартная: 2 цены - нашли разность и разделили на пункты
Потеря при кастинге double -> int.
с остальным согласен, но нужно подумать, схема перебора ордеров классическая, и хочется на всякий случай сравнивать время на наибольшее.... думать нужно, хотя такая задача первый раз стоит - в 99.99% случаев никто на МТ4 даже и не пытается hft ТС торговать
HFT не при чем. CloseAll-скрипт вполне может закрыть две позиции внутри одной секунды. В MT4 сравнивать придется, в MT5 - лишнее. Ну и сравнивать, наверное, проще через ArraySort (если, например, нужно быстро переделать на предпоследнюю закрытую позицию).
Потеря при кастинге double -> int.
это все ясно, но как правильно вычислить разницу 2-х цен в целых пунктах?
это все ясно, но как правильно вычислить разницу 2-х цен в целых пунктах?
Forum on trading, automated trading systems and testing trading strategies
need help for calculated total pips for order closed today (Mql5)
fxsaber, 2017.10.25 01:00
спасибо!
особенно понравилось
возьму на вооружение, я обычно все что будет один раз вычисляться пишу в глобальной видимости, Ваш пример намного лучше читается
....
а точно это корректно? в цикле перебора ордеров будет каждый раз у Вас SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); пересчитан, ведь OrderSymbol() будет каждый раз разный?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Igor Makanu, 2019.06.04 18:43
спасибо, хороший пример поизучаю, вот набросал скрипт под MT4 - определяем прибыль в пунктах:
написал с нуля за 10 минут? - ну примерно так, логика простая и понятная - берешь и пишешь, в МТ5 пока только сферического коня в вакууме обсуждаем... если сделки и существуют ли ордера, осталось обсудить типы счетов неттинг или хэдж.... ну и к утру что-нибудь напишем
писал на лету, как захотелось - захотел вывод +100 пп или -100 пп, скажем дело вкуса - задачи конкретной не было, а писать условия на определение типа ордера и сравнение цены открытия и закрытия показалось, что будет много лишних строк...
ЗЫ: тут же форум программистов? - они вот такие, один код (особенно чужой) по 10 раз смогут заоптимизировать , чтоб вместо 5 строк стало 4 )))
это все ясно, но как правильно вычислить разницу 2-х цен в целых пунктах?
Тут можно округление применять. А в какую сторону, или просто до целого уже вам решать.
а точно это корректно? в цикле перебора ордеров будет каждый раз у Вас SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); пересчитан, ведь OrderSymbol() будет каждый раз разный?
Так там задача немного другая - суммарный профит в пунктах по всем символам.