В справке написано OrderType() возвращает тип операции (OP_BUY, OP_SELL.. .). Вот хочу посмотреть на это воочию:
ticket[nt]=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit,"Candles", 123,0,Red);
if(OrderSelect(ticket[nt],SELECT_BY_TICKET)) Alert(OrderType()); else Alert("!!!!!!!!");
Ордер устанавливается, но его тип: "0". Пожалуйста, объясните что этот нуль означает?! (желательно с указанием источника информации).
OP_BUY | 0 | Покупка |
OP_SELL | 1 | Продажа |
OP_BUYLIMIT | 2 | Отложенный ордер BUY LIMIT |
OP_SELLLIMIT | 3 | Отложенный ордер SELL LIMIT |
OP_BUYSTOP | 4 | Отложенный ордер BUY STOP |
OP_SELLSTOP | 5 | Отложенный ордер SELL STOP |
https://docs.mql4.com/ru/constants/trading
Премного благодарен.
Еще вопросик: как можно выбирать только открытые ордера, или какой функцией проверить?
Премного благодарен.
Еще вопросик: как можно выбирать только открытые ордера, или какой функцией проверить?
for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //выбираем ордер if (OrderType()<=OP_SELL) // если тип ордера бай или селл.. { ... } }
к сожалению, в этом языке я пока полный ноль..
!. как сделать так чтобы при достижении определенной цены (задаю сам) создавался ОТЛОЖЕННЫЙ ордер на определенное к-во лотов и затем если цена продолжает движение и доходит до следующего уровня, он отменялся?
2. как отменить все ордера и отложенные и уже открытые позиции?
к сожалению, в этом языке я пока полный ноль..
!. как сделать так чтобы при достижении определенной цены (задаю
сам) создавался ОТЛОЖЕННЫЙ ордер на определенное к-во лотов
и затем если цена продолжает движение и доходит до следующего
уровня, он отменялся?
2. как отменить все ордера и отложенные и уже открытые позиции?
Первый ваш вопрос можно сделать примерно так:
//установка отложенного ордера при достижении определенной цены double uroven1; double uroven2; uroven1=... // вместо троеточия задаете вашу цену (на первом уровне) // например уровнем какого-нибудь индикатора uroven2=... // вместо троеточия задаете вашу цену (на втором уровне) // например уровнем какого-нибудь индикатора if (Bid>=uroven1 && Bid<=uroven1+5*Point) // допустим цена дошла до вашего // уровня и находится в 5 пунктах // от него { //ставится отложенный ордер допустим на 20 пунктов ниже данного уровня res=OrderSend(Symbol(),OP_SELLSTOP,1,uroven1-20*Points,3,0,0,"",123456,0,Red); return; } if (Bid>=uroven2 && Bid<=uroven2+5*Point) // допустим цена дошла до второго // уровня и находится в 5 пунктах // от него { for(int j=0;j<OrdersTotal();j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break; if (OrderSymbol()!=Symbol() || OrderType()<=OP_SELL) continue; if (OrderMagicNumber() == 123456) // если это нужный нам ордер { OrderDelete(OrderTicket()); } } return; }Советую разобрать в данном коде каждое слово с помощью справочника MQL4. Тогда будет все ясно.
Насчет вашего второго вопроса, то открытые позиции можно закрыть с помощью функции OrderClose(), а отложки удалить с помощью OrderDelete() (смотрите в вышенаписанном коде). Удаление открытых позиций можно осуществить также в цикле for. Я понимаю что сейчас этот код страшен и непонятен, но единственным выходом будет посидеть над справочником MQL4 и попытаться понять суть написанного кода
Я тоже чайник, так что если тут допустила ошибку, надеюсь профессионалы поправят. Удачи вам в освоении языка!
for(cnt=0;cnt<OrdersTotal();cnt++) { //выбираем ордер OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); // если тип ордера бай или селл.. if (OrderType()<=OP_SELL) { ... } }
да эт-т понятно... только если проверить...
// устанавливаем ордер
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,
Ask-TakeProfit,"Candles",123,0,Red);
OrderClose(ticket[nt],Lots,Ask,3,CLR_NONE); // закрываем
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET); // выбираем
// выводит invalid ticket for OrderClose function
if(OrderType()<=OP_SELL) Alert("Selected order: ",ticket[nt]);
// Alert: Selected order: 0
// т.е. условие проходит!
уточняю: только открытые ордера.
И даже если сделать так:
if(selord==true) if(OrderType()<=OP_SELL) Alert("Selected order: ",ticket[nt]); // упорно выводит закрытый
for(cnt=0;cnt<OrdersTotal();cnt++) { //выбираем ордер OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); // если тип ордера бай или селл.. if (OrderType()<=OP_SELL) { ... } }
да эт-т понятно... только если проверить...
// устанавливаем ордер
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,
Ask-TakeProfit,"Candles",123,0,Red);
OrderClose(ticket[nt],Lots,Ask,3,CLR_NONE); // закрываем
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET); // выбираем
// выводит invalid ticket for OrderClose function
if(OrderType()<=OP_SELL)
Alert("Selected order: ",ticket[nt]);
// Alert: Selected order: 0
// т.е. условие проходит!
уточняю: только открытые ордера.
так:
if(OrderSelect(ticket[nt],SELECT_BY_TICKET)) // выбираем { OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE); // закрываем }
Издеваетесь?... извиняюсь, но OrderTicket() - "Возвращает номер тикета. .." и OrderSend() - "Возвращает номер тикета...", в чем разница, зачем использовать один вместо другого?... пробуем:
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,Ask-TakeProfit,"Candles", 123,0,Red);
OrderSelect(ticket[nt],SELECT_BY_TICKET,);
OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE);
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET);
if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ", ticket[nt]); //Alert: Selected order: 1
другими словами, по номеру тикета (тому что возвращает сервер) невозможно определить открытый он или уже закрытый?
Вот еще косяк в справке (или MACD Sample.mq4?) обнаружил: bool OrderSelect (int index, int select, int pool=MODE_TRADES): pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Смотрим MACD Sample.mq4: OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES) - Спрашивается нафиг?
Давайте тогда перепишем подобным образом, мене уже прикалывается заниматься подобным методом тыка:
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,Ask-TakeProfit,"Candles", 123,0,Red);
OrderSelect(ticket[nt],SELECT_BY_TICKET,MODE_TRADES);
OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE);
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET);
if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ", ticket[nt], " ",OrderTicket());
Говорит: invalid ticket for OrderClose function , а почему неправильный номер тика что ticket[nt], что OrderTicket() - возвращают 1...
Вообще про OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE) сказано: "ticket - Уникальный порядковый номер ордера.", т. е. НЕ номер тикета! Но опять смотрим в MACD Sample.mq4:
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); - видим противоречие...
Может кто-нибудь тогда точно ответить, первая переменная в функции ОредерКлозе - это номер тикета возвращаемый сервером или номер позиции ордера в списке терминала???
все... немогу... пошел следующим путем... но опять что-то не так:
selord=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit, "Candles",123,0,Red); ot=OrdersTotal(); for(int cnt=0;cnt<=ot;cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY) // получается верным для ордеров имеющих порядковый номер '0' и '1', // когда ордера с номер 1 нету! Alert("Порядковый номер ордера: ",cnt," Тикет ордера:",OrderTicket(), " ИЗ:",ot); }
я что-то не понимаю????? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В справке написано OrderType() возвращает тип операции (OP_BUY, OP_SELL...). Вот хочу посмотреть на это воочию:
ticket[nt]=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit,"Candles", 123,0,Red);
if(OrderSelect(ticket[nt],SELECT_BY_TICKET)) Alert(OrderType()); else Alert("!!!!!!!!");
Ордер устанавливается, но его тип: "0". Пожалуйста, объясните что этот нуль означает?! (желательно с указанием источника информации).