//+------------------------------------------------------------------------------+ //| проверим последний сработавший ордер этого советника в истории на СТОПЛОСС | //+------------------------------------------------------------------------------+ bool LastHistoryOrderIsStopLoss() { i=OrdersHistoryTotal()-1; while (true) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderType()<=1) { if (OrderStopLoss()==OrderClosePrice()) return(true); else return(false); } i--; if (i<0) return(false); } }Для определения факта тейкпрофита в историиможете создать аналогичную функцию.
if (OrderStopLoss()==OrderClosePrice())
if (OrderSelect(...)) { if (OrderCloseTime()>0) { // Закрыт if (OrderType()==OP_BUY) { if (OrderClosePrice()<=OrderStopLoss()) // закрыт по SL ... else ... закрыт по TP или ещё как :) } if (OrderType()==OP_SELL) { if (OrderClosePrice()>=OrderStopLoss()) // закрыт по SL ... else ... закрыт по TP или ещё как :) } } }
А если было проскальзывание при закрытии?
Проскальзывание уже учтено сервером, поэтому OrderStopLoss()=OrderClosePrice()
Для определения факта тейкпрофита в историиможете создать аналогичную функцию.
Хм..спасибо..попробую.
Проскальзывание уже учтено сервером, поэтому OrderStopLoss()=OrderClosePrice()
Это как? Поясните пожалуйста.
Поставили Вы стоп на 1.2240. При закрытии было проскальзывание до 1.2238. У ордера изменится старое значение стоп-лосса что ли?
Вот более правильный вариант, к тому же и более универсальный :
//+-------------------------------------------------------------------------------------------------------+ //| проверим цену закрытия последнего сработавшего ордера в истории на достижение заданного уровня цены | //| возвращаемые значения : | //| В случае нахождения - тикет ордера | //| Иначе : -1; | //+-------------------------------------------------------------------------------------------------------+ int GetTicketLstHOrdClsdOnPrc(string SYMBL, int OrdType, int MGK, double prc, double err = 0) { for(int i=OrdersHistoryTotal()-1; i>=0;i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) break; if(OrderSymbol()!=SYMBL ) continue; if(OrderType() !=OrdType) continue; if((MGK!=0)&&(OrderMagicNumber()!=MGK )) continue; if(MathAbs(prc-OrderClosePrice())<=err ) return(OrderTicket()); else return(-1); } return(-1); }//int GetTicketLstHOrdClsdOnPrc(string SYMBL, int OrdType, int MGK, double prc, double err = 0)
Удачи.
А как запретить открытие покупки 2й раз?
Нужно проверять перед открытием позиции наличие аналогичных рыночных.
Можно по аналогии с функцией, что я выложил выше.
И вообще, Вы то не первый новичок на форуме. Большинство вопросов, которые Вы задаете и которые у Вас еще возникнут, 100 раз обсуждались на форуме. Можно воспользоваться поиском ;) - помогает.
Удачи.
Вот более правильный вариант, к тому же и более универсальный :
Удачи.
int GetTicketLstHOrdClsdOnPrc(string SYMBL, int OrdType, int MGK, double prc, double err = 0)
prc - это цена? Цена какая?
MGK - это magic number? который указывается в OrderSend при открытии ордера? Его указывать тут?
err - ставить ноль всегда?
SYMBL - это символ
OrdType - Это тип ордера...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Цена например у нас равна 1.2200.
Прописал я в коде, что если цена достигнет 1.2300 - покупаем с фиксированным стопом и тейком.
Если достигнет 1.2100 - продаем с фиксированным стопом и тейком.
Причем стоп у покупки и у продажи противоположные. Т.е. если бай закроется по стопу, то откроется продажа.
Допустим открылась у нас покупка. И сработал тейк. Как это момент узнать? Если сработал ТП - то прекратить торговлю.
Если сработал лось по баю - то в силе у нас остается только продажа. Покупки уже быть не может.
Если продажа закрылась с лосем - прекращаем торговлю, если продажа закрылась с тп - прекращаем торговлю.
Сам факт проверки тикета на тп или лося - понять не могу...