[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 595

 
Wanderer1000:
Установил MetaTrader 4, открыл демо-счёт. Попробовал открыть-закрывать ордера. Как теперь сделать так, чтобы терминал сам запускал ордер на продажу при повышении цены и на покупку при понижении, используя для этого инфу наподобие "необходима разница в 2 свечки для закрытия старого ордера и открытия нового"?
Написать советник, наверное)
 
nadya:

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


Да
 

МОЖЕТ КТО ОБЪЯСНИТЬ ПОЧЕМУ ВСЕ СДЕЛКИ ТОЛЬКО НА BUY??? НА SELL ни одной сделки, индикатор flag перед if() на SELL почему то всегда равен 1, ПОЧЕМУ???? в настройках стоят long&short.

ДА И ЕЩЕ ПОЧЕМУ У МЕНЯ ВО ВСЕХ СОВЕТНИКАХ СОВЕТНИК ПРОПУСКАЕТ ПОЗИЦИИ ПО КОТОРЫМ МОЖНО БЫЛО ВОЙТИ? ТО ВХОДИТ ТО НЕ ВХОДИТ!

вот код(объявление переменных урезано):
double upfr,dnfr=0.0;//уровни последних фракталов
int flag=0;

int start() //открытие по пробитию фрактала и закрытие через s свечей
{
if(iFractals(Symbol(),PERIOD_H1,MODE_UPPER,4)!=0)
{
upfr=iFractals(Symbol(),PERIOD_H1,MODE_UPPER,4);
}
if(iFractals(Symbol(),PERIOD_H1,MODE_UPPER,4)==0)
{
upfr=0;
}
if(iFractals(Symbol(),PERIOD_H1,MODE_LOWER,4)!=0)
{
dnfr=iFractals(Symbol(),PERIOD_H1,MODE_LOWER,4);
}
if(iFractals(Symbol(),PERIOD_H1,MODE_LOWER,4)==0)
{
dnfr=0;
}
//ОТКРЫТИЕ ОРДЕРОВ ПО ПРОБИТИЮ
H=iHigh(Symbol(),PERIOD_H1,1);
L=iLow(Symbol(),PERIOD_H1,1);
tOpen=iTime(Symbol(),PERIOD_H1,1);
if(H>upfr && flag==0) //если фрактал вверх и уровень фрактала вверх превышен
{
tClose=tOpen+s*stime*60;
OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,NULL,NULL);
flag=1;
}
if(L<dnfr)
Print(L," -L dnfr- ",dnfr," flag- ",flag);
if(L<dnfr && flag==0)//если фрактал вниз и уровень фрактала принижен
{
tClose=tOpen+s*stime*60;
OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,NULL,NULL);
flag=1;
}
//ЗАКРЫТИЕ ОРДЕРОВ ПО ПРОШЕСТВИИ ПРОМЕЖУТКА ВРЕМЕНИ
if(Time[1]>=tClose && flag==1)// если назначенное время прошло
{
Print("ФУНКЦИЯ ЗАКРЫТИЯ");
OrClose();
flag=0;
upfr=0;
dnfr=0;
}
return(0);
}

Файлы:
 

Столкнулся вот с чем...

При удаление советника он должен удалять отложенные ордера

Есть два варианта

1. Просто удаляет все..

int deinit()
{
int i;
//----
for(i=OrdersTotal()-1; i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if (OrderType() == OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
}
}


//----
return(0);
}

2. Выборочно...

int deinit()
{

OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket1);
OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket2);

return(0);
}

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

 
DOCTORS:

Столкнулся вот с чем...

При удаление советника он должен удалять отложенные ордера

Есть два варианта

1. Просто удаляет все..

int deinit()
{
int i;
//----
for(i=OrdersTotal()-1; i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if (OrderType() == OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
}
}


//----
return(0);
}

2. Выборочно...

int deinit()
{

OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket1);
OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket2);

return(0);
}

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

ИМХО "не успевает":

Время исполнения специальной функции deinit() ограничено периодом 2,5 секунды. В случае, если код, заложенный в специальную функцию deinit(), выполняется дольше указанного времени, то клиентский терминал принудительно завершит работу специальной функции deinit() и программы в целом.

 
ilunga:

ИМХО "не успевает":

Время исполнения специальной функции deinit() ограничено периодом 2,5 секунды. В случае, если код, заложенный в специальную функцию deinit(), выполняется дольше указанного времени, то клиентский терминал принудительно завершит работу специальной функции deinit() и программы в целом.

:(

Т.е. надежды нет? Грубо говоря, в начале пускаем скрипт на закрытие отложенников..а потом уже закрываем сову... Классная авто торговля...

И еще один вопрос- помошник установил отложенники https://forum.mql4.com/ru/42300/page588

То при смене таймфрейма- почему-то удаляются ордера...

 
DOCTORS:

:(

Т.е. надежды нет? Грубо говоря, в начале пускаем скрипт на закрытие отложенников..а потом уже закрываем сову... Классная авто торговля...

И еще один вопрос- помошник установил отложенники https://forum.mql4.com/ru/42300/page588

То при смене таймфрейма- почему-то удаляются ордера...

либо скрипт, либо еще каким-то образом давать команду советнику на завершение работы (например, через глобальную переменную)

смена таймфрема = перезагрузке советника

 
ilunga:

либо скрипт, либо еще каким-то образом давать команду советнику на завершение работы (например, через глобальную переменную)

смена таймфрема = перезагрузке советника

С переменной работает- спасибо огромное!
Хмм.. обойти никак нельзя смену таймфрейма?
 
Форумчане, помогите,пожалуйста, с модификацией ордеров
 
Такой вопрос: в режиме визуального тестирования линии индикаторов прорисовываются только по окончании тестирования, это у всех так или я что-то не так делаю?
Причина обращения: