Суть, написал советник. Какое то время торговал и вот, в один день как взбесился. Открываю терминал смотрю (CHFJPY) штук 30 открытых ордеров (больше видно не дал счет открыть), и еще с 50 может больше отложенных ордеров. Грешу на этот код, но не знаю где и как поймать ошибку ((((( :
Вопрос наверное в том даже, как поставить проверку на количество отложенных уже ордеров по конкретной паре? СПАСИБО!!! Вот мой многострадальный код:
void FindAndOpenStopLossOrder() {
string Symb = Symbol();
double OOP=0,OTP=0,OSL=0,OL=0;
int OT =0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
OT = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
if ((OT==0||OT==1) && (OrderProfit()<0)) {//Включаем ордера с типом OP_BUY=0, OP_SELL=1 (потому что все закрытые ордера с результатом, только с типом 0 или 1) и Выберем ордера только убыточные
if ( (Symb==OrderSymbol()) && ((TimeCurrent()-OrderCloseTime()) < 18000) ) {//моя проверка, 36000 - это 10 часов (в настройках в истории храниться 512000 баров)
//if (NormalizeDouble(OrderClosePrice(),Digits)==OSL) { //Отменил, пока, т.к. при проверке цена закрытия ордера не всегда равняется цене стоп лосса
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OL = OrderLots();
// }
}
else OOP=0;
break;
}
}
}
if (OOP!=0) {
for (i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
if (NormalizeDouble(OrderOpenPrice(),Digits) == OOP && OL == OrderLots()) return(0);
}
}
bool Otkrivaem_Pokupka = false; bool Otkrivaem_Prodaga = false;
if(OT==OP_BUY ){OT=OP_BUYLIMIT; Otkrivaem_Pokupka = true;}
if(OT==OP_SELL){OT=OP_SELLLIMIT;Otkrivaem_Prodaga = true;}
//Открываем отложенный ордер
SendOrder(Symb, Otkrivaem_Pokupka, Otkrivaem_Prodaga, OOP, OSL);
}
}
а что на ваш взгляд этот код делает ? (или должен был делать при рождении) - для этого пишут коменты, чтобы самому не забыть и разобраться если вдруг что не так
на беглый взгляд функция ищет самый старый(!!) убыточный ордер и открывает лимитку по его цене. И так наверное каждый тик. Непонятно зачем, ну да вам виднее :-) Но если внутри ВАШЕЙ SendOrder есть вариант входа по рынку вместо отложки (например если цена слишком близко), то вполне получите то что получили.
а что на ваш взгляд этот код делает ? (или должен был делать при рождении) - для этого пишут коменты, чтобы самому не забыть и разобраться если вдруг что не так
на беглый взгляд функция ищет самый старый(!!) убыточный ордер и открывает лимитку по его цене. И так наверное каждый тик. Непонятно зачем, ну да вам виднее :-) Но если внутри ВАШЕЙ SendOrder есть вариант входа по рынку вместо отложки (например если цена слишком близко), то вполне получите то что получили.
Блин, ну так у меня стоп лосс в 30 пп!!!??? Я могу представить, что произошло следующее. ордер закрылся по стоп лосс, после открывается Ордер, тутже закрывается по убытку и снова открывается и т.д. карусель (несмотря на то что у меня стоплосс в 30 пп повторюсь). Но как объяснить то, что было очень много отложенных ((( А можете подсказать, примерный код: 1. Чтобы не запускать данную функцию каждый тик, 2. Как можно ограничить количество открываемых ордеров? Спасибо.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Суть, написал советник. Какое то время торговал и вот, в один день как взбесился. Открываю терминал смотрю (CHFJPY) штук 30 открытых ордеров (больше видно не дал счет открыть), и еще с 50 может больше отложенных ордеров. Грешу на этот код, но не знаю где и как поймать ошибку ((((( :
Вопрос наверное в том даже, как поставить проверку на количество отложенных уже ордеров по конкретной паре? СПАСИБО!!! Вот мой многострадальный код:
void FindAndOpenStopLossOrder() {
string Symb = Symbol();
double OOP=0,OTP=0,OSL=0,OL=0;
int OT =0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
OT = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
if ((OT==0||OT==1) && (OrderProfit()<0)) {//Включаем ордера с типом OP_BUY=0, OP_SELL=1 (потому что все закрытые ордера с результатом, только с типом 0 или 1) и Выберем ордера только убыточные
if ( (Symb==OrderSymbol()) && ((TimeCurrent()-OrderCloseTime()) < 18000) ) {//моя проверка, 36000 - это 10 часов (в настройках в истории храниться 512000 баров)
//if (NormalizeDouble(OrderClosePrice(),Digits)==OSL) { //Отменил, пока, т.к. при проверке цена закрытия ордера не всегда равняется цене стоп лосса
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OL = OrderLots();
// }
}
else OOP=0;
break;
}
}
}
if (OOP!=0) {
for (i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
if (NormalizeDouble(OrderOpenPrice(),Digits) == OOP && OL == OrderLots()) return(0);
}
}
bool Otkrivaem_Pokupka = false; bool Otkrivaem_Prodaga = false;
if(OT==OP_BUY ){OT=OP_BUYLIMIT; Otkrivaem_Pokupka = true;}
if(OT==OP_SELL){OT=OP_SELLLIMIT;Otkrivaem_Prodaga = true;}
//Открываем отложенный ордер
SendOrder(Symb, Otkrivaem_Pokupka, Otkrivaem_Prodaga, OOP, OSL);
}
}