Форум » Консультации по программированию » советние открывает ордера на каждом тике » Ответить

советние открывает ордера на каждом тике

kirill: проблема в том, что советник открывает ордера на каждом тике, а мне нужно только когда соответсвует условиям в программе как можно решить эту проблему? //+------------------------------------------------------------------+ //| 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,0,clrBlue);// открываем бай OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Ask+100*Point,Ask-150*Point,0,444,0,clrRed); // открываем селл } for (int i=1; i<=OrdersTotal(); i++) //Цикл по всем ордерам,.. { //отражённым в терминале if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий { OrderSelect(444,SELECT_BY_TICKET); OrderSelect(444,SELECT_BY_TICKET); } } //Конец тела цикла } else Print("SymbolInfoTick() failed, error = ",GetLastError()); }

Ответов - 2

Scriptong: kirill пишет: проблема в том, что советник открывает ордера на каждом тике, а мне нужно только когда соответсвует условиям в программе как можно решить эту проблему? Потому что на каждом тике выполняется условие: if(rezult>InpPips) Посмотрите, чему равен rezult: это разность в пунктах между текущей ценой и нулем (в переменную price до этого момента ничего, кроме нуля, еще не было записано): prev_price=last_tick.bid; double temp=prev_price-price; double rezult=temp*MathPow(10,Digits()); Ошибка заключается в том, что значение price каждый раз инициализируется нулем, но потом не заполняется. На мой взгляд здесь нужно сделать так: price = last_tick.bid; double temp = prev_price - price; double rezult = temp * MathPow(10,Digits()); prev_price = price;

Scriptong: И еще непонятен практический смысл вот этого блока: for (int i=1; i<=OrdersTotal(); i++) //Цикл по всем ордерам,.. { //отражённым в терминале if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий { OrderSelect(444,SELECT_BY_TICKET); OrderSelect(444,SELECT_BY_TICKET); } } //Конец тела цикла Происходит выбор ордера по индексу в списке, а потом вдруг переключаемся на выбор ордера по тикету. Причем в качестве тикета указывается Magic Number. Не путайте два этих термина. Хотя даже при исправлении все равно блок остается совершенно бессмысленным.



полная версия страницы