Возникла некоторая загвоздка, помогите решить задачу.
Задача простая: подсчёт, ТОЛЬКО ПОСЛЕДНИХ, УБЫТОЧНЫХ, ЗАКРЫТЫХ позиций из ИСТОРИИ СДЕЛОК.
В чём загвоздка: Переменная наращивается на одну еденицу КАЖДЫЙ ТИК, пока в истории висист убыточный ордер.
Как мне сделать чтобы переменная nRSL увеличивалась на одну еденицу, каждый закрытый убыточный ордер, а не каждый тик?
Вот код:
double pos=OrderProfit();
intstatic nRSL=0; // переменная для посчёта убыточных ордеровfor(int i=0; i<OrdersHistoryTotal(); i++) //создаю цикл
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true) continue; // выбираю последний ордер
}
if (pos<0) // если этот ордер закрыт c убытком
{
nRSL++; // то наращивать переменную на одну еденицу КАЖДЫЙ ЗАКРЫТЫЙ ОРДЕР
}
Возникла некоторая загвоздка, помогите решить задачу.
Задача простая: подсчёт, ТОЛЬКО ПОСЛЕДНИХ, УБЫТОЧНЫХ, ЗАКРЫТЫХ позиций из ИСТОРИИ СДЕЛОК.
В чём загвоздка: Переменная наращивается на одну еденицу КАЖДЫЙ ТИК, пока в истории висист убыточный ордер.
Как мне сделать чтобы переменная nRSL увеличивалась на одну еденицу, каждый закрытый убыточный ордер, а не каждый тик?
Вот код:
double pos=OrderProfit();
intstatic nRSL=0; // переменная для посчёта убыточных ордеровfor(int i=0; i<OrdersHistoryTotal(); i++) //создаю цикл
{// Цикл открытif(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true) continue; // выбираю последний ордер
}// Цикл закрытif (pos<0) // если этот ордер закрыт c убытком От цикла никак не зависит
{
nRSL++; // то наращивать переменную на одну еденицу КАЖДЫЙ ЗАКРЫТЫЙ ОРДЕР
}
Мне тоже так вначале показалось, что "не зависит". Однако, если мы уберём цикл "for" и условие "if(выбор посл. ордера)", то есть уберём первые два цикла, а оставим только if (pos<0), то переменная "pos" считать ничего не будет, будет вечно ноль.(соотв. выведя в комментарий переменную "pos").
Не будет считать потому что ордер не выбран. OrderProfit - работает только, когда ордер выбран. (OrderSelect)...
А следовательно, значит, каким-то образом, он залазит за "countinue" .....
Такой вариант.... (уберём закрытие цикла
continue;
Результат - nRSL висит в нуле, ничего не считает.
int pos=OrderProfit();
int static nRSL=0;
for(int i=0; i<OrdersHistoryTotal(); i++) //создаю цикл
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
{
if (pos<0)
{
nRSL++;
}
}
}
Мне тоже так вначале показалось, что "не зависит". Однако, если мы уберём цикл "for" и условие "if(выбор посл. ордера)", то есть уберём первые два цикла, а оставим только if (pos<0), то переменная "pos" считать ничего не будет, будет вечно ноль.(соотв. выведя в комментарий переменную "pos").
Не будет считать потому что ордер не выбран. OrderProfit - работает только, когда ордер выбран. (OrderSelect)...
А следовательно, значит, каким-то образом, он залазит за "countinue" .....
Такой вариант.... (уберём закрытие цикла
Результат - nRSL висит в нуле, ничего не считает.
Примерно так должно быть
int nRSL=0; // переменная для подсчёта убыточных ордеровfor(int i=0; i<OrdersHistoryTotal(); i++) //создаю цикл
{// Цикл открытif(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) // выбираю ордер
{
double pos=OrderProfit(); // Сюда можно добавить комиссию и своп по ордеру.if (pos<0) // если этот ордер закрыт c убытком
nRSL++; // то наращивать переменную на одну единицу КАЖДЫЙ ЗАКРЫТЫЙ ОРДЕР
}
}// Цикл закрыт
теперь можно сравнивать на > или < и задавать любой интервал. Если вам нужно точечно проверять в интервале времени, ниже пример из учебника Ковалева
//--------------------------------------------------------------------// timeevents.mq4// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------- 1 --externdouble Time_Cls=16.10; // Время закрытия ордеровbool Flag_Time=false; // Флаг, сообщения ещё не было //--------------------------------------------------------------- 2 --int start() // Спец. функция start
{
int Cur_Hour=Hour(); // Серверное время в часахdouble Cur_Min =Minute(); // Серверное время в минутахdouble Cur_time=Cur_Hour + Cur_Min100; // Текущее времяAlert(Cur_time);
if (Cur_time>=Time_Cls) // Если наступило время события
Executor(); //.. то выполняем задуманноеreturn; // Выход из start()
}
//--------------------------------------------------------------- 3 --int Executor() // Пользовательская функция
{
if (Flag_Time==false) // Если ещё не было сообщения..
{ // .. то сообщаем (1 раз)Alert("Время важных новостей. Закройте ордера.");
Flag_Time=true; // Теперь сообщение уже было
}
return; // Выход из польз. функции
}
PS. Но контролировать изменения значений свопа лучше, на мой взгляд, если записывать его в файл.
Здравствуйте, подскажите пожалуйста, при загрузке тиковой истории в MT5, загружается единая история тиков для данного инструмента, или для того сервера/счёта (например demo) на котором в момент загрузки работает терминал?
avs-47 #: Здравствуйте, подскажите пожалуйста, при загрузке тиковой истории в MT5, загружается единая история тиков для данного инструмента, или для того сервера/счёта (например demo) на котором в момент загрузки работает терминал?
Здравствуйте, загружается всегда история того сервера, к которому в данный момент подключен MetaTrader.
Добрый день!
Возникла некоторая загвоздка, помогите решить задачу.
Задача простая: подсчёт, ТОЛЬКО ПОСЛЕДНИХ, УБЫТОЧНЫХ, ЗАКРЫТЫХ позиций из ИСТОРИИ СДЕЛОК.
В чём загвоздка: Переменная наращивается на одну еденицу КАЖДЫЙ ТИК, пока в истории висист убыточный ордер.
Как мне сделать чтобы переменная nRSL увеличивалась на одну еденицу, каждый закрытый убыточный ордер, а не каждый тик?
Вот код:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Alexey Belyakov, 2024.04.27 13:30
Добрый день!
Возникла некоторая загвоздка, помогите решить задачу.
Задача простая: подсчёт, ТОЛЬКО ПОСЛЕДНИХ, УБЫТОЧНЫХ, ЗАКРЫТЫХ позиций из ИСТОРИИ СДЕЛОК.
В чём загвоздка: Переменная наращивается на одну еденицу КАЖДЫЙ ТИК, пока в истории висист убыточный ордер.
Как мне сделать чтобы переменная nRSL увеличивалась на одну еденицу, каждый закрытый убыточный ордер, а не каждый тик?
Вот код:
Мне тоже так вначале показалось, что "не зависит". Однако, если мы уберём цикл "for" и условие "if(выбор посл. ордера)", то есть уберём первые два цикла, а оставим только if (pos<0), то переменная "pos" считать ничего не будет, будет вечно ноль.(соотв. выведя в комментарий переменную "pos").
Не будет считать потому что ордер не выбран. OrderProfit - работает только, когда ордер выбран. (OrderSelect)...
А следовательно, значит, каким-то образом, он залазит за "countinue" .....
Такой вариант.... (уберём закрытие циклаcontinue;Результат - nRSL висит в нуле, ничего не считает.
int pos=OrderProfit(); int static nRSL=0; for(int i=0; i<OrdersHistoryTotal(); i++) //создаю цикл { if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true) { if (pos<0) { nRSL++; } } }Мне тоже так вначале показалось, что "не зависит". Однако, если мы уберём цикл "for" и условие "if(выбор посл. ордера)", то есть уберём первые два цикла, а оставим только if (pos<0), то переменная "pos" считать ничего не будет, будет вечно ноль.(соотв. выведя в комментарий переменную "pos").
Не будет считать потому что ордер не выбран. OrderProfit - работает только, когда ордер выбран. (OrderSelect)...
А следовательно, значит, каким-то образом, он залазит за "countinue" .....
Такой вариант.... (уберём закрытие циклаРезультат - nRSL висит в нуле, ничего не считает.
Примерно так должно быть
Добрый день!
Я не знаю зачем Вам цикл в советнике.
Я бы сделал так
%
Спасибо за ответ. Но, что то не разобрался, можно более развернуто? Если я туплю уж сорри.
Если что пишу MQL4.
Вот последняя строчка у меня и не идет (((
Примерно так должно быть
Приогромное спасибо!!! Именно так! Правильно работает!
Не додумался я до этого варианта. Массу вариантов испробывал.
Спасибо за ответ. Но, что то не разобрался, можно более развернуто? Если я туплю уж сорри.
Если что пишу MQL4.
Вот последняя строчка у меня и не идет (((
У вас есть время каждого дня в секундах
далее переводите значения заданные в переменных
в секунды
теперь можно сравнивать на > или < и задавать любой интервал. Если вам нужно точечно проверять в интервале времени, ниже пример из учебника Ковалева
PS. Но контролировать изменения значений свопа лучше, на мой взгляд, если записывать его в файл.Здравствуйте, подскажите пожалуйста, при загрузке тиковой истории в MT5, загружается единая история тиков для данного инструмента, или для того сервера/счёта (например demo) на котором в момент загрузки работает терминал?