Привет всем! На изучение программирования нет ни времени ни желания (т.к. автоматическая торговля не интересует), а вот некоторые скрипты очень даже помогают. Поэтому прошу помощи в реализации некоторых функций.
Требуется:
Текущая цена 120.
Ставим два отложенных ордера "вручную", например BuyLimit - 100, со StopLoss - 80 и SellStop - 85, со StopLoss - 105.
Цена падает на 100 - срабатывает BuyLimit.
Цена падает на 85 - срабатывает SellStop.
Цена падает на 80 - срабатывает StopLoss для BuyLimit и в этот же момент должен установиться BuyStop - 100, со StopLoss - 80.
Цена поднимется на 100 - срабатывает BuyStop.
Цена поднимается на 105 - срабатывает StopLoss для SellStop и в этот же момент устанавливается SellStop - 85, со StopLoss - 105.
Скрипт прекращает работу после "ручного" закрытия ордеров и начинает - после "ручной" установки отложенных ордеров.
В дух словах - после закрытия ордера по стопу, должен открываться ордер на том же месте.
Или это не скрипт? :)
Спасибо.
- 'Закрыть все'/'Открыть' инструменты
- Подскажите, пожалуйста, а то я никогда ранее не обращался за помощью к программистам
- Сеточный советник (сетка)
Это эксперт уже. Ппоэтому либо изучайте язык, либо го в новый сервис метаквотов: Работа
-DENIS-:
смотрите в личные сообщения
Или это не скрипт? :)
Спасибо.
Я думаю возможно скриптом расставить сетку отложников.
это не совсем сетка, я бы даже сказал совсем НЕ сетка - это просто восстановление закрытого по стопу ордера.
Я тут почитал учебник, понял следующее:
if(условие) { OrderSend(Symbol(), LastClosedOrder, Lots, LastClosedOrderPrice, 3, LastClosedOrderStop, 0, Без коментариев, не понял для чего это, 0, Green); }
но вот с условием что-то не выходит.
Как обратиться на последний закрытый ордер?
Путем перебора всех позиций. Примерно так:
datetime OCT = 0; //..тут создать переменные для остальных характеристик выбранного ордера (позиции) void LastOrder() { datetime oct = 0; for ( int i = OrdersHistoryTotal() - 1; i >= 0; i -- ) { if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) ) { Print( "OrderSelect( ", i, ", SELECT_BY_POS, MODE_HISTORY ) - Error #", GetLastError() ); continue; } if ( OrderSymbol() != Symbol() ) { continue; } //..только нужный символ if ( OrderType() > 1 ) { continue; } //..в данном случае только рыночные позиции (OP_BUY & OP_SELL) if ( OrderMagicNumber() != MagicNumber ) { continue; } //..если торгуете руками эту строчку убрать oct = OrderCloseTime(); if ( OCT < oct ) { OCT = oct; //..присваиваем значения всем нужным характеристикам } } }
будет так правильно?:
datetime OCT = 0; double LastClosedOrder, LastClosedOrderPrice, LastClosedOrderStop; void LastOrder() { datetime oct = 0; for ( int i = OrdersHistoryTotal() - 1; i >= 0; i -- ) { if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) ) { Print( "OrderSelect( ", i, ", SELECT_BY_POS, MODE_HISTORY ) - Error #", GetLastError() ); continue; } if ( OrderSymbol() != Symbol() ) { continue; } //..только нужный символ if ( OrderType() > 1 ) { continue; } //..в данном случае только рыночные позиции (OP_BUY & OP_SELL) oct = OrderCloseTime(); if ( OCT < oct ) { OCT = oct; LastClosedOrder = OrderType(); LastClosedOrderPrice = OrderClosePrice(); LastClosedOrderStop = OrderStopLoss(); } } } if(условие) { OrderSend(Symbol(), LastClosedOrder, Lots, LastClosedOrderPrice, 3, LastClosedOrderStop, 0, Без коментариев, не понял для чего это, 0, Green); }
-DENIS-:
Вот здесь есть готовый советник на эту тему https://www.mql5.com/ru/code/9608, посмотрите, может подойдёт.
Привет всем! На изучение программирования нет ни времени ни желания (т.к. автоматическая торговля не интересует), а вот некоторые скрипты очень даже помогают. Поэтому прошу помощи в реализации некоторых функций.
Привет профи программирования!
Я тут посидел, почитал, даже подумал... :) вот что получилось
double Orders; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { Orders=OrdersTotal(); //---- if (Orders==0) // Если нет отложенных ордеров... { Alert("Нет отложенных ордеров"); // ... сообщение об ошибке } if (Orders>4) // Если ордеров больше допустимого... { Alert("Количество ордеров больше допустимого"); // ... сообщение об ошибке } if (Orders<4) // Если ордеров меньше допустимого.. { LastOrder(); // .. открывается последний закрытый ордер } //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Users function | //+------------------------------------------------------------------+ datetime OCT=0; double LastOrderType, LastOrderLots, LastOrderPrice, LastOrderStoploss; //---- void LastOrder() { datetime oct=0; for (int i=OrdersHistoryTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { Print("OrderSelect(", i, ", SELECT_BY_POS, MODE_HISTORY) - Error #", GetLastError()); continue; } if (OrderSymbol()!=Symbol()) { continue; } oct=OrderCloseTime(); if (OCT<oct) { OCT=oct; LastOrderType=OrderType(); LastOrderLots=OrderLots(); LastOrderPrice=OrderClosePrice(); LastOrderStoploss=OrderStopLoss(); } } } return;
Подскажите плиз все ли тут правильно и будет ли это работать....
Спасибо
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь