Нет я в смысле Как это сделать с помощью mql???
Пишу советник и вот на этой проблеме застрял.
Здравствуйте дорогие форумчане!
Помогите решить одну задачу...
Как узнать сколько убыточных сделок было совершено в текущую неделю?
С уважением...
Здравствуйте. Предлагаю Вам для примера и правки под Ваши условия свой участок кода, отвечающий за поиск по истории ордеров количество подряд убыточных сделок, начиная с самой свежей закрытой позиции
//---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- Iteration = 0; // зануляем инерации перед их учетом в цикле по истории Sum_Loss = 0; // суммарный убыток по этим итерациям datetime Time_at_History_Current = 0, Time_at_History_Previos = 0; if(OrdersHistoryTotal() != 0) { for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--) { OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY); if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY || OrderType() == OP_SELL) { if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера // для последующего его анализа при подсчете количества итераций { double lastLoss = OrderProfit(); Sum_Loss=Sum_Loss+lastLoss; // считаем общий убыток по закрытым подряд убыточным ордерам Time_at_History_Current = OrderCloseTime(); } //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS)); //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS)); if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными { Time_at_History_Previos = Time_at_History_Current ; Iteration++; //Print("Iteration at History в условии сравнения = ", Iteration); } else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла { if(OrderProfit() >= 0) break; } } } } }
Разбирайтесь, вносите правки под свои условия, например, для определения недели от настоящего момента - первое, что пришло это использовать переменные даты и времени, например, TimeLocal(). Далее о этого значения отнимаете количество секунд, находящихся в одной неделе, т.е. 60(сек в мин) * 60 (минут в час) * 24 (часа в сутках) * 5 (торговых суток в одной неделе) = 432 000. Получаете Ваше значение времени, например, некое, ВРЕМЯ_Ч, до которого считаете убыточные ордера, т.е.
ВРЕМЯ_Ч = TimeLocal()- 432 000;Затем сравниваете ВРЕМЯ_Ч со временем закрытия очередного выбранного ордера из истории, также в цикле от свежего закрытого, OrderCloseTime() и если OrderCloseTime() этого очередного выбранного ордера меньше, чем ВРЕМЯ_Ч, то время недели закончилось, выходите из цикла, естественно, в цикле считаете количество убыточных сделок неделю назад. Как-то так, для начала.
Для советника надо что бы он имел ограничение по убыточным сделкам в неделю. Если уже совершены две убыточные то не разрешать ему торговать в этой недели.
+ соответственно в этот же цикл вносите условие, что если уже совершены две убыточные, то выход из цикла. И запрет торговли на неделю. Если до конца недели, то можете пользовать эту ф-ию.
...
Как узнать сколько убыточных сделок было совершено в текущую неделю?
Щас вчитался в условие... :-)
Если за текущую неделю, то ВРЕМЯ_Ч ищите отнимая из ф-ии TimeLocal(), секунды прошедшие за количество дней, возвращаемых ф-ией int DayOfWeek().
Например, в четверг была была с понедельника совершена вторая убыточная сделка,т.е. Вы в этом цикле постоянно отслеживаете самую свежую убыточную сделку, по времени ее закрытия - получаете день недели через int DayOfWeek(). И если происходит следующая картина, что
ВРЕМЯ_Ч = TimeLocal() - 60(сек в мин) * 60 (минут в час) * 24 (часа в сутках) * 4 (торговых суток в одной неделе), т.к. ф-ия int DayOfWeek() вернет значение 4 и если до этого времени_Ч будет еще одна сделка в истории с OrderCloseTime() > ВРЕМЯ_Ч, то Вы выходите из цикла и прерываете торговлю сова до конца текущей недели.
П.С. Этот расчет сделан грубо, а именно не учитываются часы и минуты дня недели, на котором прошла вторая убыточная сделка, т.е. считаются сутки полностью, т.е. если был убыток получен в 2 часа, то время будет "отматываться", какое интересное слово...:-) к началу недели учитывая полностью эти текущие сутки, т.е. все 24 часа, а не 2. До нужной Вам точности расчета можете довернуть используя ф-ии расчета даты и времени.
П.П.С. Это строго мое видение решения этого вопроса, уверен, что существуют и иные варианты, не исключая, что и более элегантные.
Спасибо огромное. Попробую разобраться! Результат скину сюда что бы вновь пришедшие уже такой вопрос не задавали.
О! Эт грамотная мысль...
Я сам по этому участку кода, который привел выше по циклу по истории ордеров с нахождением подряд убыточных закрытых позиций, интересовался здесь, у людей на форуме, мне кое-что подсказали по коду, в итоге все работает и я с Вами делюсь этими наработками.
void CalculateLossOrders() { for(int i=OrdersHistoryTotal();i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break; if(OrderType() == OP_SELLSTOP) { Print(OrderProfit()); if(OrderProfit() < 0) { Print("Metka"); if(minusSell == 0) { minusSell = 1; SellDay1 = TimeDayOfWeek(OrderOpenTime()); } else if(minusSell == 1) { minusSell = 0; SellDay2 = TimeDayOfWeek(OrderOpenTime()); if((SellDay2 + (SellDay1 - SellDay2)) <= 5) { SellBan = True; mySellDay = SellDay2; Print("Два Sella за неделю в -"); } else { SellBan = False; } } } } else if(OrderType() == OP_BUYSTOP) { if(OrderProfit() < 0) { if(minusBuy == 0) { minusBuy = 1; BuyDay1 = TimeDayOfWeek(OrderOpenTime()); } else if(minusBuy == 1) { minusBuy = 0; BuyDay2 = TimeDayOfWeek(OrderOpenTime()); if((BuyDay2 + (BuyDay1 - BuyDay2)) <= 5) { BuyBan = True; myBuyDay = BuyDay2; Print("Два Buya за неделю в -"); } else { BuyBan = False; } } } } } }
Вот пытаюсь сделать что-то подобное...
Только не понимаю почем Print(OrderProfit) - постоянно показывает 0. А к Print("Metka"); даже не доходит. Как думаете что это может быть?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте дорогие форумчане!
Помогите решить одну задачу...
Как узнать сколько убыточных сделок было совершено в текущую неделю?
С уважением...