Первое что бросается в глаза - Вы пытаетесь закрыть ордер по Бид текущего инструмента (на котором установлен советник), а нужно по Бид инструмента выбранного ордера.
Проверка OrderSymbol() спасёт.
- docs.mql4.com
Первое что бросается в глаза - Вы пытаетесь закрыть ордер по Бид текущего инструмента (на котором установлен советник), а нужно по Бид инструмента выбранного ордера.
Да, это основная проблема кода.
Также более мелкие проблемы:
- Цикл перебора организовывать от Total - 1. Индекса Total в списке нет.
- Убрать проверку if(Total>0). Она дублирует условия цикла.
- Приводить код, используя кнопку SRC.
Первое что бросается в глаза - Вы пытаетесь закрыть ордер по Бид текущего инструмента (на котором установлен советник), а нужно по Бид инструмента выбранного ордера.
Очень верно! Как-то не пришло в голову...
Тогда как-то через
double vbid = MarketInfo(Pair,MODE_BID);
ticket = OrderClose(OrderTicket(),OrderLots(),vbid,30,White);
или?
Да, это основная проблема кода.
Также более мелкие проблемы:
- Цикл перебора организовывать от Total - 1. Индекса Total в списке нет.
- Убрать проверку if(Total>0). Она дублирует условия цикла.
- Приводить код, используя кнопку SRC.
1.Цикл перебора организовывать от Total - 1.
== не понял, почему?
Индекса Total в списке нет.
== int Total; - это разве не то? Или Вы что-то другое имеете ввиду?
2. Убрать проверку if(Total>0). Она дублирует условия цикла.
== отчасти согласен, но, как мне кажется, если Total==0, то и самого перебора не будет за ненадобностью. Кроме того, это - только часть кода, разумеется. Там дальше, под общим условием if(Total>0) ещё куча всего, что при нуле выполнять не надо.
Господа, всё, что вы говорите - верно, но!
Если, как пишет Andrei Fandeev, Bid берётся от другого инструмента, то ордер попросту НЕ ЗАКРОЕТСЯ и выдаст ошибку. Но беда в том, что он - зараза! - именно закрывается по "местному" Bid'у, но...............вот тут я и не понимаю: то ли по каким-то "чужим", из других пар, ТЕКУЩИМ условиям, то ли отказывается перед расчётом индекса обнулять его значение, полученное ранее:
CCI = 0;
CCI = iCCI(Pair,PERIOD_H1,24,PRICE_TYPICAL,0);
И в результате мы имеем неправильный CLOSE, который никак не отвечает заложенной в код логике.
А то и хуже того: иногда имеем, иногда - нет. О как!
А Print() после CLOSE выдаёт иной раз вообще бред, типа CCI=56743876501,540056Господа, всё, что вы говорите - верно, но!
Если, как пишет Andrei Fandeev, Bid берётся от другого инструмента, то ордер попросту НЕ ЗАКРОЕТСЯ и выдаст ошибку. Но беда в том, что он - зараза! - именно закрывается по "местному" Bid'у, но...............вот тут я и не понимаю: то ли по каким-то "чужим", из других пар, ТЕКУЩИМ условиям, то ли отказывается перед расчётом индекса обнулять его значение, полученное ранее:
CCI = 0;
CCI = iCCI(Pair,PERIOD_H1,24,PRICE_TYPICAL,0);
И в результате мы имеем неправильный CLOSE, который никак не отвечает заложенной в код логике.
А то и хуже того: иногда имеем, иногда - нет. О как!
Я бы написал так
double vbid = MarketInfo(OrderSymbol(),MODE_BID); ticket = OrderClose(OrderTicket(),OrderLots(),vbid,30,White);
Я бы написал так
Ещё точнее, верно, согласен.
если ордер перед этим выбран, то можно так)
bool i2=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,White);
если ордер перед этим выбран, то можно так)
...а если "ордер перед этим выбран", но ЕЩЁ НЕ ЗАКРЫТ, то OrderClosePrice() = это что?.......
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые Гуру!
Подскажите, пожалуйста, как решить проблему работы советника с ордерами, открытыми по разным парам? То есть, в моменте имеются насколько (больше одной) позиций, открытых на разных парах, и надо следить за их закрытием, соответственно, по своим индикаторам.
Я соорудил вот такую конструкцию:
====================================================
string Pair;
double CCI;
int cnt;
int Total;
int ticket;
int pause=180000;
int error;
Total = OrdersTotal();
if(Total>0)
{//1
for(cnt = Total; cnt >= 0; cnt--)
{//2
if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==true)
{//3
if(OrderProfit() > 0)
{//4
Pair = OrderSymbol();
CCI = 0;
CCI = iCCI(Pair,PERIOD_H1,24,PRICE_TYPICAL,0);
//Close BUY-------------------------------------------
if(OrderType() == OP_BUY && CCI >= 115.0)
{//5
ticket = OrderClose(OrderTicket(),OrderLots(),Bid,30,White);
и т.д.
=============================================================================
(Это одно из условий, есть другие, но речь не об этом.)
Точно сказать не могу, но такое впечатление, что иногда советник путает позиции и закрывает одну по сигналу из другой. Во всяком случае, другой причины некорректной работы я не вижу.
Подскажите, насколько работоспособен вот такой принцип (Pair = OrderSymbol();) разделения по парам, и, может быть, подскажите другой путь решения этой проблемы.
Заранее Благодарен!