Ваши вопросы по языку MQL4

Buldakov

Местный житель
Вопрос по переносу сделок на следующий день.
Допустим советник в среду в 18-00 открыл сделку. И поставил для нее профит и лосс. Я хочу в среду в 23-59 закрыть эту сделку, а в четверг в 00-01 открыть такую же сделку по текущей цене с таким же объемом и такими же уровнями прибыли и убытков. Как мне лучше это сделать?
 

eevviill2

Местный знаток
Вопрос по переносу сделок на следующий день.
Допустим советник в среду в 18-00 открыл сделку. И поставил для нее профит и лосс. Я хочу в среду в 23-59 закрыть эту сделку, а в четверг в 00-01 открыть такую же сделку по текущей цене с таким же объемом и такими же уровнями прибыли и убытков. Как мне лучше это сделать?
1) 23-59 не успеешь закрыть все ордера. Лучше скажем 23-50.
2) Если всё же нужно всё в последнии секунды считать, то нужно использовать EventSetTimer(1)+в OnInit() нужно посчитать разницу между временем пк и временем терминала+сравнивать пришло ли нужное время временем пк-разница.
3) В Понедельник проверяешь проверял ли ты понедельник скажем переменной mondCh. Если нет проверяешь преоткрытие ордеров если да то ничего не делать. Если день не Понедельник mondCh=false
4) Перебираешь все ордера и сели ордер имеет время закрытия больше= 23-50 открываешь ордер.
 
Последнее редактирование:

ivansss

Новичок форума
Затем, строкой ниже, ты задаешь новое значение переменной H_High = H_High - HL.
А что там нового задастся, если выражение построено на основе статичных параметров из списка extern.

По массиву тоже вопросы, у нас в функции отрисовки еще несколько расчетов ценовых значений появляется(скрин). Все равно до меня не доходит откуда берется столько уровней если все переменные статичные..

Привет! Для того, чтобы все это настроить, нужно весь код видеть. Ну, или проще найти похожий код типа того, что выкладываю в приложении. Код не мой и я его не модифицировал, но открытый и выложен был уже не помню на каком сайте бесплатно. С него можно при желании снять уровни линий поддержки и сопротивления, если нужно использовать в советнике.

Код полный, ну разве что есть функция удаления линии в Deinit. Меня тем и привлекает этот кусок что он небольшой по размеру а уровни троит вроде бы неплохо.
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    88,8 КБ · Просмотры: 14

Buldakov

Местный житель
1) 23-59 не успеешь закрыть все ордера. Лучше скажем 23-50.
2) Если всё же нужно всё в последнии секунды считать, то нужно использовать EventSetTimer(1)+в OnInit() нужно посчитать разницу между временем пк и временем терминала+сравнивать пришло ли нужное время временем пк-разница.
3) В Понедельник проверяешь проверял ли ты понедельник скажем переменной mondCh. Если нет проверяешь преоткрытие ордеров если да то ничего не делать. Если день не Понедельник mondCh=false
4) Перебираешь все ордера и сели ордер имеет время закрытия больше= 23-50 открываешь ордер.

У меня вопрос немного другой был:
Мне надо, что бы советник в момент смены даты закрывал все сделки и затем снова открывал те сделки, которые были открыты.
Или по другому - мне надо перенести открытые сделки на след. день , но так что бы мне не считалась коммисия за перенос сделок на след день.
Допустим советник в среду в 18-00 открыл одну сделку, а закрыть он должен в четверг в 08-00.В среду в 23-59 советник закрыл эту сделку. А в четверг в 00-01 советник должен открыть сделку с такими же параметрами , как закрыл в 23-59. И в четверг должен эту сделку в 08-00 закрыть.
У меня вопрос: Что должен советник помнить, что бы открыть сделку в 00-01 ?
 
Последнее редактирование:

vladradon

Программист
Уже увеличено кол-во буферов в новых билдах.
можно не париться - добавлять свыше 8 .
Я вообще не любитель индикаторов и стараюсь их не использовать - использую сигнальные функции для входа, встроенные в сова. У тебя как дела - тебя что-то давно не видно?))
 

Rennela

Новичок форума
Перебираешь историю,по магику и/или по времени запоминаешь(советник) данные которые тебе нужны и советник открывает сделку в определенное время-в 00:01-с определенными параметрами. Так там какие параметры? Лот и направление,ну еще TP и SL.
 
Последнее редактирование:

vladradon

Программист
У меня вопрос немного другой был:
Допустим советник в среду в 18-00 открыл одну сделку.В среду в 23-59 советник закрыл эту сделку. А в четверг в 00-01 советник должен открыть сделку с такими же параметрами , как закрыл в 23-59.
У меня вопрос: Что должен советник помнить, что бы открыть сделку в 00-01 ?
Советник должен по дню недели и заложенному времени сделать проверку на наличие ордеров (здесь вопрос какие ордера будут в работе с меджиками или ручные в том числе), записать весь набор ордеров в, к примеру, глобальные переменные терминала (на случай какого-то сбоя), закрыть ордера, проверить, что наступил другой день недели и нужное время, проверить, достаточно ли маржи перед открытием закрытых ордеров в сумме или каждого последовательно и произвести уже само открытие. Это краткий алгоритм, что я считаю необходимым заложить.
 
Последнее редактирование:

mobidik

-----
А что там нового задастся, если выражение построено на основе статичных параметров из списка extern.
Все равно до меня не доходит откуда берется столько уровней если все переменные статичные..

Да, начальное значение - задано как "статичное", но над ним производится действие и ему в цикле, вернее, переменной, присваивается новое значение, которое определяется по формуле: H_High = H_High - HL, где HL = (H_High - H_Low) /Factor, т.е. при каждой итерации в цикле определяется новое значение для H_High, которое изначально задано в настройках.

По массиву тоже вопросы, у нас в функции отрисовки еще несколько расчетов ценовых значений появляется(скрин).

Так в самой ф-ции есть еще расчет - удали его там, а сам расчет производи за пределами ф-ции, например, в том же цикле, только теперь нужно будет вызвать ф-цию еще дважды.

Сделай так, как я тебе показал ранее на скрине, только значение в цикле с 1024 замени, скажем на 10 и посмотри что напишет тебе терминал в принтах и с помощью калькулятора сможешь проверить все ли верно согласно твоим формулам.
 

vladradon

Программист
...В индикаторе есть возможность использовать до 8-ми индексных массивов...
Многие используют старые билды, потому, что под новые подходят далеко не все проги в закрытом коде и не факт, что с новыми возможностями последних билдов будет возможность запустить тот же индюк!
 

ivansss

Новичок форума
Сделай так, как я тебе показал ранее на скрине, только значение в цикле с 1024 замени, скажем на 10 и посмотри что напишет тебе терминал в принтах и с помощью калькулятора сможешь проверить все ли верно согласно твоим формулам.

Значения через Принт как то не похоже на уровни EURUSD)или я уже окончательно запрутался, или необходимо еще теперь переделать все через этот масив?
 

vladradon

Программист
нужно посчитать разницу между временем пк и временем терминала+сравнивать пришло ли нужное время временем пк-разница.
Зачем проверять разницу, если прога работает на основании времени сервера брокера? И все расчеты и команды будут работать на времени сервера. Любое смещение в итоге собьет работу программы.
 

eevviill2

Местный знаток
...
У меня вопрос: Что должен советник помнить, что бы открыть сделку в 00-01 ?
PHP:
bool days_chaked[7]; //0=sunday


///////////////////////////////////////////
void OnStart()
{
ENUM_DAY_OF_WEEK dayW=-1;


for(ENUM_DAY_OF_WEEK i=SATURDAY;i>=SUNDAY;i--)
{
if(DayOfWeek()==i)
{
if(!days_chaked[i])
{
ArrayInitialize(days_chaked,false);
days_chaked[i]=true;
reopen_f(i);
}
break;
}
}



}

/////////////////////////////////////
void reopen_f(ENUM_DAY_OF_WEEK dayW)
{
datetime close_ord_time=-1;
ENUM_DAY_OF_WEEK day=dayW-1; if(day<=0) day=FRIDAY;
int hour=23;
string symb="";


for(int i=OrdersHistoryTotal()-1; i>=0; i--)
 {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    close_ord_time=OrderCloseTime();
    symb=OrderSymbol();
     if(TimeDayOfWeek(close_ord_time)!=day) continue;
     if(TimeHour(close_ord_time)!=hour) continue;
     if(iTime(symb,PERIOD_D1,0)-close_ord_time>60*60*24*2) continue;
    
    
   OrderSend(symb,OrderType(),OrderLots(),OrderType()==OP_BUY?MarketInfo(symb,MODE_ASK):MarketInfo(symb,MODE_BID),0,OrderStopLoss(),OrderTakeProfit(),OrderComment(),OrderMagicNumber(),OrderExpiration(),clrNONE);

  
 }

}
 
Последнее редактирование:

eevviill2

Местный знаток
Зачем проверять разницу, если прога работает на основании времени сервера брокера? И все расчеты и команды будут работать на времени сервера. Любое смещение в итоге собьет работу программы.
Ты такой забавный:D
Потому что тиков может не быть.
Нету тиков, нету обновления времени сервера.
 

AlexeyVik

Программист mql4 mql5
У меня вопрос немного другой был:
Мне надо, что бы советник в момент смены даты закрывал все сделки и затем снова открывал те сделки, которые были открыты.
Или по другому - мне надо перенести открытые сделки на след. день , но так что бы мне не считалась коммисия за перенос сделок на след день.
Допустим советник в среду в 18-00 открыл одну сделку, а закрыть он должен в четверг в 08-00.В среду в 23-59 советник закрыл эту сделку. А в четверг в 00-01 советник должен открыть сделку с такими же параметрами , как закрыл в 23-59. И в четверг должен эту сделку в 08-00 закрыть.
У меня вопрос: Что должен советник помнить, что бы открыть сделку в 00-01 ?
Это большое заблуждение. Переоткрывая позицию вы наоборот платите ещё раз комиссию. Другое дело если имелось ввиду тройной своп не платить, поскольку на выходные не планируется оставлять позиции... Но тут надо посчитать размер свопа и размер спреда, даже если не учитывать новую цену открытия.
 

vladradon

Программист
Потому что тиков может не быть.
Нету тиков, нету обновления времени сервера.
От того, что нет тиков алгоритм советника не должен меняться! Другой вопрос в том, что есть азиатский период, когда в европейской зоне спреды скачут выше крыши и можно ордера открыть так, что потом при восстановлении спокойствия рынка, останешься в хорошей просадке и отработать тройной своп, который и является основой для алгоритма, и который в ночь со среды на четверг начисляется, только уведет в еще больший минус.
 

vladradon

Программист
PHP код:
bool*days_chaked[7];*//0=sunday


///////////////////////////////////////////
void*OnStart()
{
ENUM_DAY_OF_WEEK*dayW=-1;


for(ENUM_DAY_OF_WEEK*i=SATURDAY;i>=SUNDAY;i--)
{
if(DayOfWeek()==i)
{
if(!days_chaked)
{
ArrayInitialize(days_chaked,false);
days_chaked=true;
reopen_f(i);
}
break;
}
}



}

/////////////////////////////////////
void*reopen_f(ENUM_DAY_OF_WEEK*dayW)
{
datetime*close_ord_time=-1;
ENUM_DAY_OF_WEEK*day=dayW-1;*if(day<=0)*day=FRIDAY;
int*hour=23;
string*symb="";


for(int*i=OrdersHistoryTotal()-1;*i>=0;*i--)
*{
***if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))*continue;
****close_ord_time=OrderCloseTime();
*****if(TimeDayOfWeek(close_ord_time)!=day)*continue;
*****if(TimeHour(close_ord_time)!=hour)*continue;
****
****symb=OrderSymbol();
***OrderSend(symb,OrderType(),OrderLots(),OrderType()==OP_BUY?MarketInfo(symb,MODE_ASK):MarketInfo(symb,MODE_BID),0,OrderStopLoss(),OrderTakeProfit(),OrderComment(),OrderMagicNumber(),OrderExpiration(),clrNONE);

**
*}

}

А ты учел, что на обработку закрытия ордера может уйти какое-то время и такое сравнение по истории времени закрытия ордеров с их реальным временем закрытия не пройдет, чтобы вычислить какие именно ордера нужно переоткрыть!
 
Последнее редактирование:

Buldakov

Местный житель
Всем спасибо за идеи. Счас буду пробовать. Какой код получится выложу.
 
Верх