вам логическую цепочку или весь код ? MQL4 или MQL5
MQL5. Я новичок.
Пробую написать советник.
Определил условие покупки. Дальше пробую через условный оператор if-else. Не получается переоткрытие. Открываются buy и sell, если нет текущих позиций. Закрываются позиции по обратному сигналу. Но перевернуться не выходит.
Простой советник на двух скользящих.
Если позиция открыта советником, то у нее, скорее всего, будет магик. Поэтому на Mql4 будет так:
if(OrdersTotal() != 0){ //Если есть открытые ордера.. for (int i = 0; i < OrdersTotal(); i++){ //..просматриваем каждый открытый ордер OrderSelect(i, SELECT_BY_POS); //Выбираем рыночный ордер, начиная с первого (можно с последнего) //Если символ ордера соответствует символу, на котором запущен советник //и магик ордера соответствует магику советника if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic){ //Проверяем направление выставленного ордера if(OrderType() == OP_BUY){ //Если ордер выставлен на покупку /*Выставляем ордер на продажу с параметрами: Symbol() - символ, на котором запущен советник OP_SELL - направление на продажу OrderLots() - объем ранее выбранного ордера price - цена, по которой выставляется ордер slippage - проскальзывание sl - стоплос tp - тейкпрофит */ OrderSend(Symbol(), OP_SELL, OrderLots(), price.bid, slippage, sl, tp, NULL, magic); } else if(OrderType() == OP_SELL){//Если ордер выставлен на продажу //Выставляем ордер на покупку OrderSend(Symbol(), OP_BUY, OrderLots(), price.ask, slippage, sl, tp, NULL, magic); } } } }
MqlTradeRequest request; MqlTradeResult result; if(OrdersTotal() != 0){ //Если есть открытые ордера.. for (int i = 0; i < OrdersTotal(); i++){ //..просматриваем каждый открытый ордер OrderGetTicket(i); //Выбираем рыночный ордер по тикету, начиная с первого (можно с последнего) //Если символ ордера соответствует символу, на котором запущен советник //и магик ордера соответствует магику советника if(OrderGetString(ORDER_SYMBOL) == Symbol() && OrderGetInteger(ORDER_MAGIC) == magic){ //Проверяем направление выставленного ордера if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY){ //Если ордер выставлен на покупку /*Заполняем структуру отправки ордера на продажу */ request.action = TRADE_ACTION_DEAL; request.symbol = Symbol(); request.volume = OrderGetDouble(ORDER_VOLUME_CURRENT); request.price = price.bid; request.type = ORDER_TYPE_SELL; request.type_filling = ORDER_FILLING_FOK; } else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL){//Если ордер выставлен на продажу //Заполняем на покупку request.action = TRADE_ACTION_DEAL; request.symbol = Symbol(); request.volume = OrderGetDouble(ORDER_VOLUME_CURRENT); request.price = price.ask; request.type = ORDER_TYPE_BUY; request.type_filling = ORDER_FILLING_FOK; } if(request.price != 0.0) OrderSend(request, result); } } }
2 Sergey Vasilev.
Ваш код для четвёрки будет плодить рыночные ордера на каждом тике по экспоненте, а в пятёрке вообще нужно проверять позиции, а не ордера (и то только на хеджевых счетах). ))
MQL5. Я новичок.
Пробую написать советник.
Определил условие покупки. Дальше пробую через условный оператор if-else. Не получается переоткрытие. Открываются buy и sell, если нет текущих позиций. Закрываются позиции по обратному сигналу. Но перевернуться не выходит.
Простой советник на двух скользящих.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Прошу подсказать след. вопрос.
Как реализовать при поступлении сигнала следующее:
если советник только запустился - проверку, что открытых позиций нет, чтобы не добавиться и не закрыть то, что не нужно;
если позиция уже есть (допустим покупка), сделать противоположную сделку, так чтобы позиция была открыта тем же объемом в другую сторону (продажа).