для MT5 - см. CopyTicks в документации
для 4-ки задача нетривиальна.
//+------------------------------------------------------------------+ //| Test.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" // Переменные, изменяемые программно int Corr; // Автоматический корректор котировок, 10 для 5-значных котировок и 1 для 4-значных int TwoDigCorr; // Корректор для работы с двухзначными котировками bool New_Bar=false; // Флаг образования нового бара int Oppoz; // Флаг выставления противоположной отложки при СЛ int TradeFlag; // Флаг возможности открытия сделок //--- input parameter input double InpPips=20; extern double Lot=0.01; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { // Проверка необходимых для работы условий if (IsTradeAllowed()) Alert("Работа советника по символу ",Symbol()," начата."); else { Alert("Торговля советниками не разрешена! Советник не будет работать. Проверьте настройки Вашего терминала."); } // Проверка пользовательских объемов double Mlot=MarketInfo(Symbol(),MODE_MINLOT); if(Lot<Mlot) { Alert("Недопустимо маленькое значение объема сделок. Объем установлен на допустимый минимум!"); Print("Недопустимо маленькое значение объема сделок. Объем установлен на допустимый минимум!"); Lot=Mlot; } // Инициализация первичных данных if (Point==0.0001) Corr=1; else Corr=10; if(Digits==2) TwoDigCorr=10; else TwoDigCorr=1; return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void OnTick() { //--- static double prev_price=0; double price=0; //--- MqlTick last_tick; //--- if(SymbolInfoTick(Symbol(),last_tick)) { prev_price=last_tick.bid; double temp=prev_price-price; double rezult=temp*MathPow(10,Digits()); prev_price=price; if(rezult>InpPips) { OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Bid-100*Point,Bid+150*Point,0,444,5,clrBlue);// открываем бай OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Ask+100*Point,Ask-150*Point,0,555,10,clrRed); // открываем селл } for (int i=1; i<=OrdersTotal(); i++) //Цикл по всем ордерам,.. { //отражённым в терминале if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий { OrderSelect(444,SELECT_BY_TICKET); OrderSelect(555,SELECT_BY_TICKET); } } //Конец тела цикла } else Print("SymbolInfoTick() failed, error = ",GetLastError()); }
у вас нет контроля открытых ордеров, что это за конструкция
OrderSelect(444,SELECT_BY_TICKET); OrderSelect(555,SELECT_BY_TICKET);
с чего вы решили, что ордера будут иметь эти тикеты, зачем внутри OrderSelect делать еще два выбора ордеров по не существующим тикетам
Kirill Andreev:
Внимательно изучите структуру MqlTick - вам придётся её анализировать на тему пропуска тиков. Иначе выходит не размер а тыква :-)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ниже скину код
Не получается настроить чтоб работал как я хочу.
Должно быть примерно так:
if(rezult>InpPips) // означает что размер 1 тика стал больше чем нами заданное значение (например 5 пунктов) и если это так то открывает 1 ордер селл и 1 ордер бай
но почему то он хочет так делать, а открывает сразу кучу ордеров.
P.S начинающий программист )