В вашем куске кода русским по белому написано: Считаем текущий профит счета деленный на количество ордеров. Далее, если посчитанный
профит больше 5, то вызывается функция ЗакрытьВсеОрдера. И Спред тут совсем не причем, если цена не менялась. Пусть даже не 100 пунктов а
1000.
А вот как вы сделали вывод, что именно здесь получен минус ? Если вы закрывались в роловер, то очень может быть что при закрытии
ордеров цена проскользила. Как с этим бороться - зависит от брокера.
А техподдержка в 99 процентов случаев вам помогут решить проблемы с деньгами или сайтом. В техническом плане как правил - полные НУЛИ !
"А вот как вы сделали вывод, что именно здесь получен минус ? " - т.к. только в этом месте советник закрывает ордера )
Т.е. советник видит что AccountInfoDouble(ACCOUNT_PROFIT) > 0 , берет текущее значение bid и закрывает ордера и оказывается в минусе. Я не понимаю как это возможно Цена менялась не более чем на пару пунктов.
Советник содержит следующий кусок кода:
double avgProfit = AccountInfoDouble(ACCOUNT_PROFIT)/OrdersTotal();
if(avgProfit >= 5){
closeAllOrders(); //простой цикл по всем ордерам и закрытие каждого
}
Обнаружил у себя большие минуса из-за этого куска кода.
Техподдержка брокера говорит что в ту ночь у них был большой спред и мол я сам виноват.
Судя по цене закрытия спред был не менее 100 пунктов.
Возможно ли такое что AccountInfoDouble(ACCOUNT_PROFIT) не учитывает спред?
Как корректно проверять реальный суммарный профит?
AccountInfoDouble(ACCOUNT_PROFIT) учитывает спред.
Убыток мог случиться из-за проскальзываний.
Конспектируйте цену в момент получения сигнала на закрытие и потом сравните ее с реальными ценами закрытия сделок.
Тулзой
для оценки проскользов могу поделиться в личку.
Похоже, что дело в проскальзываниях.
От техподдержки получил ответ, что "В заявках на исполнение Ордеров, поданных Вами 05.08.2019 с 00:05:03 по 00:05:07, был указан диапазон цен на закрытие позиции: 1.11056 / 1.11119."
При том, что у меня задано проскальзывание в 30 пунктов:
if(!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble( price, Digits),30,Red))
Получается что вопрос сводится к тому как определять проскальзывания так чтобы и цена не устаревала и сам не попадал в минуса. А
действительно как?
сделайте следующее:
заведите переменную
Spread=0.0002; //некий фиксированный, выставьте так, как Вам надо
currSpread=MarketInfo(Symbol(),MODE_SPREAD)*Point; //текщий рыночный спред
if(currSpread<=Spread && avgProfit >= 5)closeAllOrders();
в коде функции closeAllOrders() также пропишите эту же логику на спред при необходимости
Похоже, что дело в проскальзываниях.
От техподдержки получил ответ, что "В заявках на исполнение Ордеров, поданных Вами 05.08.2019 с 00:05:03 по 00:05:07, был указан диапазон цен на закрытие позиции: 1.11056 / 1.11119."
При том, что у меня задано проскальзывание в 30 пунктов:
if(!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble( price, Digits),30,Red))
Дело не в том, какое проскальзывание было указано в приказе, а то, что пока приказы исполнялись, цена улетела.
Получается что вопрос сводится к тому как определять проскальзывания так чтобы и цена не устаревала и сам не попадал в минуса. А действительно как?
Без проскользов - только лимитками, и то - не у любого брокера.
Вариант проще (и быстрее) — вместо закрытия 10 сделок открыть одну встречную, с объемом равным сумме объемов открытых сделок, а потом закрыть все сделки встречно (тогда уже не важно будет, куда уйдет цена).
сделайте следующее:
заведите переменную
Spread=0.0002; //некий фиксированный, выставьте так, как Вам надо
currSpread=MarketInfo(Symbol(),MODE_SPREAD)*Point; //текщий рыночный спред
if(currSpread<=Spread && avgProfit >= 5)closeAllOrders();
в коде функции closeAllOrders() также пропишите эту же логику на спред при необходимости
Если все равно, по какой цене закрывать, зачем анализировать спред?
А если не все равно, то как можно ждать восстановления спреда? Цена может быть где угодно в тот момент.
Если все равно, по какой цене закрывать, зачем анализировать спред?
А если не все равно, то как можно ждать восстановления спреда? Цена может быть где угодно в тот момент.
да нет, не все равно
спредом играют так, аж диву даешься
например,в данном случае, закинули например Ask пунктов на 100, и средний профит стал больше 5
выполнилось условие для закрытия ордеров
начинается закрытие, Ask уже вернулся, естественно реквотка по невозможности закрыться по прежнему Ask-у и дальнейшее закрытие продолжается уже в убыток
Вот это и не надо топик-стартеру
Так что самый лучший вариант - это работать с учетом среднестатистического спреда, т.е. практически фиксированного, все время отслеживать спред
да нет, не все равно
спредом играют так, аж диву даешься
например,в данном случае, закинули например Ask пунктов на 100, и средний профит стал больше 5
выполнилось условие для закрытия ордеров
начинается закрытие, Ask уже вернулся, естественно реквотка по невозможности закрыться по прежнему Ask-у и дальнейшее закрытие продолжается уже в убыток
Вот это и не надо топик-стартеру
Так что самый лучший вариант - это работать с учетом среднестатистического спреда, т.е. практически фиксированного, все время отслеживать спред
Если Аск увеличится, прибыль уменьшится. А в -100 пунктов он не прыгнет.
Да и нельзя закладываться на то, что спред через секунду (2, 5, 10) вернется в норму.
Вроде бы очевидные вещи.
Если Аск увеличится, прибыль уменьшится. А в -100 пунктов он не прыгнет.
Да и нельзя закладываться на то, что спред через секунду (2, 5, 10) вернется в норму.
Вроде бы очевидные вещи.
не то что через секнуду, за доли
своими глазами вчера такое на битке наблюдал
согласен, Bid лётал при стоячем Ask-е, ну и профит тоже
вещи очевидные, но тем не менее, деньги на первом месте, естественно для обоих сторон
именно поэтому обратил внимание на эту ветку и предложил копию своего решения
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Советник содержит следующий кусок кода:
double avgProfit = AccountInfoDouble(ACCOUNT_PROFIT)/OrdersTotal();
if(avgProfit >= 5){
closeAllOrders(); //простой цикл по всем ордерам и закрытие каждого
}
Обнаружил у себя большие минуса из-за этого куска кода.
Техподдержка брокера говорит что в ту ночь у них был большой спред и мол я сам виноват.
Судя по цене закрытия спред был не менее 100 пунктов.
Возможно ли такое что AccountInfoDouble(ACCOUNT_PROFIT) не учитывает спред?
Как корректно проверять реальный суммарный профит?