I forgot:
double Dist = 1000000.0;
Пожалуйста, может ли кто-нибудь помочь мне?
1. Это только часть вашего кода, покажите нам, например, функцию CheckFirstOP().
2. В цикле for происходит инкремент. Это не будет работать правильно, если закрывать ордера в цикле, пожалуйста, смотрите -> https://www.mql5.com/en/forum/119840.
3. Ваше соглашение об именовании переменных... не очень хорошее.
4. Пожалуйста, используйте кнопку SRC для размещения вашего кода, чтобы он сохранил форматирование. Очень трудно читать ваш код в таком виде.
1. Это только часть вашего кода, покажите нам, например, функцию CheckFirstOP().
2. В цикле for происходит инкремент. Это не будет работать правильно, если закрывать ордера в цикле, см. -> https://www.mql5.com/en/forum/119840.
3. Ваше соглашение об именовании переменных... не очень хорошее.
4. Пожалуйста, используйте кнопку SRC для размещения вашего кода, чтобы он сохранил форматирование. Очень трудно читать ваш код в таком виде.
double Dist=1000000.0; if ( CheckFirstOP(OP_BUY) > 1) { for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) { OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue; double Price = OrderOpenPrice(); if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) { Dist = MathAbs(Bid - Price); int Ticket = OrderTicket(); double Lot = OrderLots(); OrderClose( Ticket, Lot, OrderClosePrice(), 3); } } } int CheckFirstOP(int a_cmd_0) { int l_count_4 = 0; for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) { if (OrderSelect( l_pos_8, SELECT_BY_POS)) { if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { if (OrderType() == a_cmd_0) { l_count_4++; break; } } } } return ( l_count_4); }
my fault...i'm very new to this stuf...
3. Ваше соглашение об именовании переменных... не очень хорошее.
похоже на соглашение об именах декомпилятора ...
"он новичок в этом деле"
похоже на соглашение о названиях декомпиляторов ...
"Он новичок в этом деле"
вероятно да... я хочу модифицировать советника, которого купил... они также прислали мне код (сказали, что по ошибке)... теперь я понимаю причину этой странной номенклатуры... как я уже сказал, я новичок (только что прочитал книгу по MQL4 на этом сайте) и не хотел модифицировать много вещей, по крайней мере в начале, поэтому я позволил названиям быть такими, какими я их нашел.
Здравствуйте
Выбранный ордер может быть полностью закрыт выражением: "OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;"
С наилучшими пожеланиями
не решает мою проблему...
2. В цикле for происходит инкремент. Это не будет работать правильно, если закрывать ордера в цикле, пожалуйста, смотрите -> https://www.mql5.com/en/forum/119840.
Почему инкремент не работает? В книге по MQL4 это не упоминается (я думаю)... в любом случае я пробовал:
if ( CheckFirstOP(OP_BUY) > 1) { for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect( i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue; double Price = OrderOpenPrice(); if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) { Dist = MathAbs(Bid - Price); int Ticket = OrderTicket(); double Lot = OrderLots(); OrderClose( Ticket, Lot, OrderClosePrice(), 3); } } }
it doesn't work, don't know why
просто будьте уверены, что в этой строке теперь
Да, конечно, я пробовал, и это ничего не меняет... странные вещи с этим программированием :) было бы не трудно написать простой приказ на закрытие (я думал)...
it doesn't work, don't know whyКогда вы закрываете ордер с индексом 5, индекс ордера 6 становится индексом 5, 7 становится 6 и т.д. Подсчитывая, вы пропускаете каждый второй открытый ордер.
Когда вы закрываете ордер с индексом 5, индекс ордера 6 становится индексом 5, 7 становится 6 и т.д. Подсчитывая, вы упускаете каждый второй открытый ордер.
ах, ладно, понял... в любом случае код предназначен для того, чтобы держать только один открытый ордер и начать работать сразу, когда открыто 2 ордера, и закрывает один из них после выбора и анализа всех (т.е. 2 ордеров)... так что я не думаю, что это большая ошибка - инкремент при выборе ордеров...В любом случае, я пробовал метод декрементации без каких-либо результатов... может быть, я пытаюсь неправильно... не знаю... может ли кто-нибудь попробовать мой код и посмотреть, действительно ли он закрывает сделки... или может ли кто-нибудь написать простой код для выбора и закрытия предыдущего открытого ордера (т.е. того, который имеет более высокую цену открытия для покупки и более низкую цену открытия для продажи)?
спасибо
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствую всех вас. Я создал код (модифицируя другие коды) для закрытия рыночных ордеров.
int l_pos_44 = 0;
if (CheckFirstOP(OP_BUY) > 1) {
for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;
double Price = OrderOpenPrice();
if (NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits)) {
Dist = MathAbs(Bid - Price);
int Ticket = OrderTicket();
double Lot = OrderLots();
OrderClose(Ticket, Lot, Bid, 3);
}
}
(тот же код для закрытия позиций на продажу (очевидно, с переменной OP_SELL вместо OP_BUY))
int CheckFirstOP(int a_cmd_0) {
int l_count_4 = 0;
for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
if (OrderSelect(l_pos_8, SELECT_BY_POS)) {
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
if (OrderType() == a_cmd_0) {
l_count_4++;
break;
}
}
}
}
return (l_count_4);
}
Мне нужен код для закрытия длинных или коротких позиций, когда открыто более 1 позиции по типу... так, чтобы всего было 2 позиции (1 покупка и 1 продажа)... мне нужно также сохранить последнюю открытую позицию, т.е. в данном случае ту, у которой более высокая цена открытия для позиции покупки, и ту, у которой более низкая цена открытия для позиции продажи. Проблема в том, что код не закрывает позиции... он не закрывает ни одну из них.
Когда: "if (CheckFirstOP(OP_BUY) == 1)", то код закрывает первые позиции сразу после их открытия...т.е. после открытия ордера на покупку и продажу они закрываются на следующем тике. А когда: "if (CheckFirstOP(OP_BUY) > 1)" ни одна из позиций не закрывается. Я не знаю, что я делаю не так.
Пожалуйста, кто-нибудь может мне помочь?