Неужели я так сложно намекнул? ДЦ зарабатывает на спредах и комиссиях, программист зарабатывает на написании кода.
Один из трейдеров говорит что надо экономить на спредах и комиссиях (по возможности не платить).
Другой из трейдеров говорит что писать код за деньги не справедливо (по возможности не платить).
И тот и другой заботятся о своём кошельке. Вроде-бы они и не отличаются друг от друга...
Только вот вы, как программист, первого поддерживаете, а со вторым спорите доказывая что он неправ.
Понимаю трейдера, который хочет найти более дешевого программиста. Также понимаю трейдера, который ищет более выгодные для себя торговые условия. В чем проблема? Чем плохо желание сэкономить?
Но тут совсем другая история. Продумать свой алгоритм, чтобы он более эффективно работал с ордерами, и за счет этого увеличить профит системы — значит быть хорошим разработчиком. А пренебрегать несколькими пипсами можно, на мой взгляд, только на этапе грубой проверки идеи.
Понимаю трейдера, который хочет найти более дешевого программиста. Также понимаю трейдера, который ищет более выгодные для себя торговые условия. В чем проблема? Чем плохо желание сэкономить?
Но тут совсем другая история. Продумать свой алгоритм, чтобы он более эффективно работал с ордерами, и за счет этого увеличить профит системы — значит быть хорошим разработчиком. А пренебрегать несколькими пипсами можно, на мой взгляд, только на этапе грубой проверки идеи.
Прекрасно. А я почему-то больше понимаю ваше нежелание писать бесплатно. И тоже никаких проблем...
В общем-то я не против попытки сэкономить, но не до маразма-же. Не ставить-же экономию на спреде во главу трейдинга...
Если посчитать, не такой и маразм. Но у меня нет цели убедить.
Считать нужно прибыль, а не расходы.
При экономии расходов, очень легко получать убытки. Если ТС рассчитана нести расходы, но при этом даёт доход, то это хорошая ТС, потому как при другом раскладе, может приносить убыток.
А нельзя ли с 7 по текущую страницу выделить в отдельную тему (можно даже дать на неё ссылку типа "Дальнейшее обсуждение здесь"), а в этой теме продолжить то, для чего она создана?
При экономии расходов, очень легко получать убытки. Если ТС рассчитана нести расходы, но при этом даёт доход, то это хорошая ТС, потому как при другом раскладе, может приносить убыток.
Да и вообще, победителей не судят!
Не могу уловить, о чем этот комментарий.
О неважности размера комиссии для супер-прибыльных стратегий?
// В случае изменения количества ордеров по основному символу, сигнализирует об их количестве// #include <MT4Orders.mqh>constbool Init = EventSetMillisecondTimer(1);
int AmountOrders( conststring &Symb )
{
int Res = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb))
Res++;
return(Res);
}
voidOnTimer()
{
staticint PrevAmount = 0;
constint Amount = AmountOrders(_Symbol);
if (Amount != PrevAmount)
{
PrevAmount = Amount;
Alert(Amount);
}
}
Откроем произвольно 5 ордеров по EURUSD и 5 ордеров по USDJPY. А теперь взглянем внимательно на безобидный код AmountOrders и представим себе такой сценарий
Находимся во время выполнения советника внутри AmountOrders, где i == 3.
Закрываем позицию по USDJPY. После чего идет перетряхивание ордеров в таблице текущих.
Из-за перетряхивания при i == 2 через OrderSelect мы может нарваться на тот же ордер, что был в п.1. Из-за этого AmountOrders может вернуть значение на единицу больше, чем на самом деле.
А вот и подтверждение сказанному
#property strictvoidOnStart()
{
for (int i = 0; i < 5; i++)
OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
int PrevTicket = 0;
for (int i = OrdersTotal() - 1; i > 0; i--)
if (OrderSelect(i, SELECT_BY_POS))
{
constint Ticket = OrderTicket();
if (Ticket == PrevTicket)
Alert("Hello World!");
PrevTicket = Ticket;
if (OrderSelect(i - 1, SELECT_BY_POS))
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
}
}
Результат
2017.10.0601:28:05.885 TestTets EURUSD,M1: close #240725107buy 1.00 EURUSD at 1.17121 at price 1.170992017.10.0601:28:05.775 TestTets EURUSD,M1: Alert: Hello World!2017.10.0601:28:05.775 TestTets EURUSD,M1: close #240725108buy 1.00 EURUSD at 1.17121 at price 1.170992017.10.0601:28:05.673 TestTets EURUSD,M1: Alert: Hello World!2017.10.0601:28:05.673 TestTets EURUSD,M1: close #240725110buy 1.00 EURUSD at 1.17121 at price 1.170992017.10.0601:28:05.578 TestTets EURUSD,M1: Alert: Hello World!2017.10.0601:28:05.578 TestTets EURUSD,M1: close #240725111buy 1.00 EURUSD at 1.17121 at price 1.170992017.10.0601:28:05.480 TestTets EURUSD,M1: open #240725112buy 1.00 EURUSD at 1.17121 ok
2017.10.0601:28:05.343 TestTets EURUSD,M1: open #240725111buy 1.00 EURUSD at 1.17121 ok
2017.10.0601:28:05.253 TestTets EURUSD,M1: open #240725110buy 1.00 EURUSD at 1.17121 ok
2017.10.0601:28:05.138 TestTets EURUSD,M1: open #240725108buy 1.00 EURUSD at 1.17121 ok
2017.10.0601:28:05.035 TestTets EURUSD,M1: open #240725107buy 1.00 EURUSD at 1.17121 ok
Один и тот же тикет может выбраться дважды в безобидном цикле подсчета ордеров!
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Один и тот же тикет может выбраться дважды в безобидном цикле подсчета ордеров!
Чтобы все сомнения отбросить, делаем так.
Ставим советник
// Советник будет алертовать, если OrderSelect соседних индексов выберет один и тот же ордерconstbool Init = EventSetMillisecondTimer(1);
voidOnTimer()
{
int PrevTicket = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS))
{
constint Ticket = OrderTicket();
if (Ticket == PrevTicket)
Alert("Hello World!");
PrevTicket = Ticket;
Sleep(1); // 1 миллисекунда - это много или мало?
}
}
Запускаем скрипт
#property strictvoidOnStart()
{
// Открыли позицииfor (int i = 0; i < 25; i++)
OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0);
int Tickets[];
constint Total = OrdersTotal();
ArrayResize(Tickets, Total);
for (int i = 0; i < Total; i++)
if (OrderSelect(i, SELECT_BY_POS))
Tickets[i] = OrderTicket();
// Закрыли позицииfor (int i = 0; i < Total; i++)
OrderClose(Tickets[i], 1, SymbolInfoDouble(_Symbol, SYMBOL_BID), 100);
}
И наблюдаем, как советник под разными индексами выбирает один и те же ордера. А это может привести к полному выходу из строя торговой логики.
советник под разными индексами выбирает один и те же ордера. А это может привести к полному выходу из строя торговой логики.
Ну и собственно сабж во всей красе! Как организовать цикл перебора ордеров? Например, как правильно написать такую функцию?
// Возращает количество ордеров данного символаint AmountOrders( conststring &Symb )
{
int Res = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb))
Res++;
return(Res);
}
Ветка начиналась с озвучивания необходимости некоторых повторных действий, когда происходит пауза внутри цикла переборов. Здесь достаточно паузы в районе миллисекунды, чтобы увидеть эффект.
Пока такой костыль
bool IsChange( constbool InitFlag = false )
{
staticint PrevTotal = 0;
staticint PrevHistoryTotal = 0;
constint Total = OrdersTotal();
constintHistoryTotal = OrdersHistoryTotal();
if (InitFlag)
{
PrevTotal = Total;
PrevHistoryTotal = HistoryTotal;
}
return(!InitFlag && ((Total != PrevTotal) || (HistoryTotal != PrevHistoryTotal)));
}
// Возращает количество ордеров данного символаint AmountOrders( conststring &Symb )
{
int Res = 0;
IsChange(true);for (int i = OrdersTotal() - 1; i >= 0; i--)
if (IsChange())
{
i = OrdersTotal();
Res = 0;
}
elseif (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb))
Res++;
return(Res);
}
Но нет уверенности, что всегда будет работать правильно.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Неужели я так сложно намекнул? ДЦ зарабатывает на спредах и комиссиях, программист зарабатывает на написании кода.
Один из трейдеров говорит что надо экономить на спредах и комиссиях (по возможности не платить).
Другой из трейдеров говорит что писать код за деньги не справедливо (по возможности не платить).
И тот и другой заботятся о своём кошельке. Вроде-бы они и не отличаются друг от друга...
Только вот вы, как программист, первого поддерживаете, а со вторым спорите доказывая что он неправ.Понимаю трейдера, который хочет найти более дешевого программиста. Также понимаю трейдера, который ищет более выгодные для себя торговые условия. В чем проблема? Чем плохо желание сэкономить?
Но тут совсем другая история. Продумать свой алгоритм, чтобы он более эффективно работал с ордерами, и за счет этого увеличить профит системы — значит быть хорошим разработчиком. А пренебрегать несколькими пипсами можно, на мой взгляд, только на этапе грубой проверки идеи.
Понимаю трейдера, который хочет найти более дешевого программиста. Также понимаю трейдера, который ищет более выгодные для себя торговые условия. В чем проблема? Чем плохо желание сэкономить?
Но тут совсем другая история. Продумать свой алгоритм, чтобы он более эффективно работал с ордерами, и за счет этого увеличить профит системы — значит быть хорошим разработчиком. А пренебрегать несколькими пипсами можно, на мой взгляд, только на этапе грубой проверки идеи.
Прекрасно. А я почему-то больше понимаю ваше нежелание писать бесплатно. И тоже никаких проблем...
В общем-то я не против попытки сэкономить, но не до маразма-же. Не ставить-же экономию на спреде во главу трейдинга...
В общем-то я не против попытки сэкономить, но не до маразма-же. Не ставить-же экономию на спреде во главу трейдинга...
Если посчитать, не такой и маразм. Но у меня нет цели убедить.
Если посчитать, не такой и маразм. Но у меня нет цели убедить.
Считать нужно прибыль, а не расходы.
При экономии расходов, очень легко получать убытки. Если ТС рассчитана нести расходы, но при этом даёт доход, то это хорошая ТС, потому как при другом раскладе, может приносить убыток.
Да и вообще, победителей не судят!
А нельзя ли с 7 по текущую страницу выделить в отдельную тему (можно даже дать на неё ссылку типа "Дальнейшее обсуждение здесь"), а в этой теме продолжить то, для чего она создана?
Считать нужно прибыль, а не расходы.
При экономии расходов, очень легко получать убытки. Если ТС рассчитана нести расходы, но при этом даёт доход, то это хорошая ТС, потому как при другом раскладе, может приносить убыток.
Да и вообще, победителей не судят!
Не могу уловить, о чем этот комментарий.
О неважности размера комиссии для супер-прибыльных стратегий?
Откроем произвольно 5 ордеров по EURUSD и 5 ордеров по USDJPY. А теперь взглянем внимательно на безобидный код AmountOrders и представим себе такой сценарий
А вот и подтверждение сказанному
Результат
Один и тот же тикет может выбраться дважды в безобидном цикле подсчета ордеров!
Один и тот же тикет может выбраться дважды в безобидном цикле подсчета ордеров!
Чтобы все сомнения отбросить, делаем так.
Ставим советник
Запускаем скрипт
И наблюдаем, как советник под разными индексами выбирает один и те же ордера. А это может привести к полному выходу из строя торговой логики.
советник под разными индексами выбирает один и те же ордера. А это может привести к полному выходу из строя торговой логики.
Ну и собственно сабж во всей красе! Как организовать цикл перебора ордеров? Например, как правильно написать такую функцию?
Ветка начиналась с озвучивания необходимости некоторых повторных действий, когда происходит пауза внутри цикла переборов. Здесь достаточно паузы в районе миллисекунды, чтобы увидеть эффект.
Пока такой костыль
Но нет уверенности, что всегда будет работать правильно.
Чтобы все сомнения отбросить, делаем так.
Ставим советник
Запускаем скрипт
И наблюдаем, как советник под разными индексами выбирает один и те же ордера. А это может привести к полному выходу из строя торговой логики.
Изменил
Теперь без алертов.