Это MQL4!
--------------------
Всем привет!
Уже больше недели меня мучает один вопрос — как правильно выставить стопы. Перебрал уже больше десятка вариантов и никак :(
Постоянно фигурируют две ошибки:
130 - Слишком близкие стопы или неправильно рассчитанные
4051 - Недопустимое значение параметра функции
----------------------
А всего то требуется выставить стоп на уровне Хая или Лоя предыдущего бара.
Мои варианты:
if(TrendDOWN() == True && OrderCloseTimeBool() != True && EMA_Filtr() == True)
{
if(UpWhite() == True ||
UpBlack() == True ||
PatternBuy_0() == True ||
PatternBuy_1() == True ||
PatternBuy_2() == True ||
PatternBuy_3() == True)
{
int Ticket = OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slippage,0,0,"",Magic,0,Blue);
if(Ticket > 0 )
{
double SL_Buy = NormalizeDouble(Ask -((Ask-iLow(NULL,0,1))/Point),Digits);
bool mod = OrderModify(Ticket,OrderOpenPrice(),SL_Buy,0,0);
}
}
}
Еще вариант в качестве функции:
double StopLossOP_BUY()
{
if(OrdersTotal()>0)
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
double StopOP_BUY = NormalizeDouble(OrderOpenPrice(),Digits) - //цена открытия ордера
(NormalizeDouble(OrderOpenPrice()-iLow(NULL,0,1),Digits)+ //разница между ценой открытия ордера и Лоем предыдщей свечи
NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits));//спред
return(NormalizeDouble(StopOP_BUY,Digits));
}
}
}//for
}//if
return(0);
}
Второй вариант, также в качестве функции:
double StopLossOP_BUY2()
{
if(OrdersTotal()>0)
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
RefreshRates();
double StopOP_BUY = NormalizeDouble(OrderOpenPrice(),Digits)- //цена открытия ордера
(NormalizeDouble(OrderOpenPrice()-iLow(NULL,0,1),Digits)+ //разница между ценой открытия ордера и Лоем предыдщей свечи
NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits));//спред
if(StopOP_BUY >= NormalizeDouble(Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits))
{
RefreshRates();
return(NormalizeDouble(Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits));
}
else
{
RefreshRates();
return(NormalizeDouble(StopOP_BUY,Digits));
}
}
}
}//for
}//if
return(0);
}
Люди добрые, помогите чем можно :(
Или приведите свои примеры
правильного выставления стопов на уровне Хая/Лоя предыдущего бара.
Я схожу с ума :)
Благодаря общему разуму и особенно помощи
Twilight_reg73 нашел ошибку в коде!
Спасибо вам друзья!
Ошибка заключалась в том, что всем стопам присваивалось одно и тоже значение!
Контртрендовый на рабочем ТФ, но трендовый на вышестоящим ТФ.
Т.е. заявки открываются на 15 минутном ТФ, а определение тренда на часовике (H1)
просто затык именно выставлении стопов.
Можно конечно без проблем выставить фиксированный стоп, но это в моем случае не совсем подходит.
Говори :))))
Но в общем, я тебе скажу так, стратегически — стоп надо выставлять с учетом предыдущей волатильности. А в тактике написания программ и кодов я не силён.
NormalizeDouble(Ask -((Ask-iLow(NULL,0,1))/Point),Digits);
пример Аск 1,54321 — (1,54321-1,54300 = 0.00021) 0.00021/1 (я всегда умножаю а вы почему то делите)
На что при проверке мне выдает:
2011.12.06 23:36:50 2010.01.06 16:19 Big Dog 1.01 EURUSD,M15: invalid lots amount for OrderSend function
2011.12.06 23:36:50 2010.01.06 16:19 Big Dog 1.01 EURUSD,M15: OrderSend error 4051
void EditOrder(int tic,double sl)
{while(!IsTradeAllowed()) Sleep(100);
if(OrderSelect(tic,SELECT_BY_TICKET))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,CLR_NONE))
Print(«Ошибка редактирования ордера: »,GetLastError());
return;}
Т.е. будто мы используем фиксированное значение для установления стопа при модификации ордера. Т.к. если прописать фиксированное значение (руками, обычное целое число) то проблем нет.
Но такой вариант не прошел…
Полученое целое число я хотел использовать в стандартной модификации ордера, которая работает при вводе фиксированного значения (не рассчетного — как в примере).
Вы правы!
Сейчас принтовку сделаю.
Огромное спасибо Вам!
if (TrendDOWN() == True) {…
Можно же просто:
if (TrendDOWN()) {…
forum.mql4.com/ru/38949
Вам нужен эта функция
forum.mql4.com/ru/38949#434193
double
SL_Buy = NormalizeDouble(Ask -((AskiLow(NULL,0,1))/Point),Digits);
возвращает отрицательное значение…
значение возвращаемое iLov можно и не нормализовать оно корректно.