![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Чет перемудрил автор...
Тут даже писать особо не о чем... TF - интервал таймфрейма в секундах
if(OpBuy && (TimeLocal()>(T+TF))) //...проверка возможности покупки и кончился ли бар открытия предыдущей сделки
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"SWT_exp",Magic,0,Green);
if(ticket>0)
{ T=TimeLocal(); //...если позиция открыта, присваиваем переменной Т текущее время
................................
}
else
....................................
}
Не углубляясь в статью, изходя из примьера самое простое что я бы использовала это:
int Time_open=0;
void OnTick(void)
{
int l_itime=0;
l_itime=(int)iTime(_Symbol,_Period,0); //при этом в место _Period можно выбирать любой из PERIOD_M1, PERIOD_M5 ... и так далее, по желанию ограничения времени открытия нового ордера
if(l_itime==0) //обязательная проверка на ошибки
return;
total=OrdersTotal();
if(total<1)
{
if(Time_open!=l_itime)
{
ticket=-1; //обязательное присвоение начальной величины
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
Time_open=l_itime;
}
}
}
К сожалению, описанный метод не защищает в том случае, если пользователь в течение одной свечи несколько раз отсоединит-присоединит эксперт к графику. А ведь решение тоже простое, хотя и занимает чуть больше кода:
Методов много и каждый выбирает свой. Если говорить о том что чтото надо "Запомнить", тогда можно в глобальных переменных клиентского терминала сохранить и переменную "Time_open".
P.S.
Хотя я склоняюсь к тому что нельзя при тестировании стратегии пропускать сигналы на покупку или продажу из за того что в момент поступления нового сигнала имеется открытие позиции или действует ограничения по времени. Ведь в реальной жизни может этой открытой позиции не существовать и будет открыта позиция которая в тестере не была открыта в связи с имеющимися открытыми позициями, и не кто не знает как это может закончиться. Потому изпользую ограничения открытия ордеров только во время текущего сигнала, но по мере поступления нового сигнала ограничения отменяются.
Ваш "принцип" откровенная неработоспособная ахинея.
Вот что вы предлагаете:
-- вы вводите некую переменную Time_open (секунды)
-- которая даёт возможность отработать сигнал только в пределах: от начала бара + Time_open
-- если ордер открывается, то диапазон переменной Time_open сужается
-- всё это зациклено и в конечном итоге приводит к тому, что любой сигнал может отрабатывать всё ближе и ближе к открытию текущего бара
Ведь задача изначально стояла до боли простой: разрешить в рамках текущего бара входить только один раз.
И вся эта муть в Статьях, куда реально обращаются за правильными работоспособными идеями, решениями, подсказками, советами.
Нельзя такими "статьями" девальвировать ценность раздела.
Хотя я тебя и недолюбливаю, но согласен сейчас на 100%.
Статья вообще ни о чём!
Не в обиду автору, допуск делали модераторы. Почему пропустили? ХЗ
Хотя я тебя и недолюбливаю ...
У тебя имя "Василий" -- значит пол вроде как мужской.
В плане "любви" -- по всем вопросам ЛГБД -- не ко мне.
У тебя имя "Василий" -- значит пол вроде как мужской.
В плане "любви" -- по всем вопросам ЛГБД -- не ко мне.
:))))
Ну вот.
Методов много и каждый выбирает свой. Если говорить о том что чтото надо "Запомнить", тогда можно в глобальных переменных клиентского терминала сохранить и переменную "Time_open".
[...] вариант со сканированием истории является универсальным.
Ihor Herasko:
К сожалению, универсальных методов не так уж и много, чтобы между ними можно было выбирать. А вариант с глобальной переменной тоже не универсален, т. к. при запуске советника на другом компьютере, но там же счете, глобальная переменная будет отсутствовать.
Я бы просто запретила открывать позиции на текущем баре на котором запускает эксперта. Это исключает возможность открытия позиции несколько раз под ряд в течение одной свечи если пользователь в течение одной свечи запускает эксперт на другом компьютере, на том же счете.
int Time_open=0;
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(void)
{
int l_itime=0;
l_itime=(int)iTime(_Symbol,_Period,0); //при этом в место _Period можно выбирать любой из PERIOD_M1, PERIOD_M5 ... и так далее, по желанию ограничения времени открытия нового ордера
if(l_itime==0) //обязательная проверка на ошибки
return;
//---
static int counter=0;
if(IsTradeAllowed())
{
if(counter<=0)
{
Time_open=l_itime;
counter++;
}
}
else
counter=0;
//---
total=OrdersTotal();
if(total<1)
{
if(Time_open!=l_itime)
{
ticket=-1; //обязательное присвоение начальной величины
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
Time_open=l_itime;
}
}
}
Если при инициализации такой подход приемлен то пры постоянной работе эксперта это лишний расход вычислительных мощностей.
Вовсе не энергоемкий. Сканирование истории происходит всего один раз - при инициализации эксперта. Далее используется обновление переменной, отвечающей за время открытия последнего ордера на основании списка рабочих ордеров.