а что вы уже написали ?
тут конечно у людей отточены навыки телепатии и многие могут править код советника по аватарке автора, но можно-же проще ...
стоп лосс и тейк профит написаны абсолютно стандартно
double check_lot(double &lo)
{
double l = MarketInfo(Symbol(),MODE_LOTSTEP);
int ok = 0;
while ( l < 1 ){l*=10;ok++;}
if( lo < MarketInfo(Symbol(),MODE_MINLOT) )lo = MarketInfo(Symbol(),MODE_MINLOT);
if( lo > MarketInfo(Symbol(),MODE_MAXLOT) )lo = MarketInfo(Symbol(),MODE_MAXLOT);
return(NormalizeDouble(lo,ok));
}
int open( int type, double l, double sl = 0, double tp = 0, string comm = "")
{
bool res;
int isOpened = 0, try = 0;
double s = 0,t = 0;
color color_order = clrGold;
while ( IsTradeContextBusy() )Sleep(500);
RefreshRates();
if ( sl != 0 && sl < MarketInfo(Symbol(),MODE_STOPLEVEL) )sl = MarketInfo(Symbol(),MODE_STOPLEVEL);
if ( tp != 0 && tp < MarketInfo(Symbol(),MODE_STOPLEVEL) )tp = MarketInfo(Symbol(),MODE_STOPLEVEL);
if ( type == 0 )
{
if ( tp == 0 )t = 0;
if ( tp != 0 )t = Ask + tp * Point;
if ( sl == 0 )s = 0;
if ( sl != 0 )s = Ask - sl * Point;
}
if ( type == 1 )
{
if ( tp == 0 )t = 0;
if ( tp != 0 )t = Bid - tp * Point;
if ( sl == 0 )s = 0;
if ( sl != 0 )s = Bid + sl * Point;
}
s = NormalizeDouble(s,Digits);
t = NormalizeDouble(t,Digits);
if ( MarketExecution )
{
if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,0,0,comm,ID);
if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,0,0,comm,ID);
}
else
{
if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,s,t,comm,ID);
if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,s,t,comm,ID);
}
while( isOpened < 0 )
{
Sleep(time_period_try * 1000);
while ( IsTradeContextBusy() )Sleep(500);
RefreshRates();
if ( type == 0 )
{
if ( tp == 0 )t = 0;
if ( tp != 0 )t = Ask + tp * Point;
if ( sl == 0 )s = 0;
if ( sl != 0 )s = Ask - sl * Point;
}
if ( type == 1 )
{
if ( tp == 0 )t = 0;
if ( tp != 0 )t = Bid - tp * Point;
if ( sl == 0 )s = 0;
if ( sl != 0 )s = Bid + sl * Point;
}
s = NormalizeDouble(s,Digits);
t = NormalizeDouble(t,Digits);
try++;
if ( MarketExecution )
{
if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,0,0,comm,ID);
if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,0,0,comm,ID);
}
else
{
if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,s,t,comm,ID);
if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,s,t,comm,ID);
}
if(try > number_try || isOpened >= 0) break;
}
if( isOpened < 0 ) Print("Ордер не открыт, ошибка :", GetLastError());
else if ( MarketExecution )
{
if ( !OrderSelect(isOpened,SELECT_BY_TICKET) )return(0);
if ( OrderType() == 0 )color_order = Blue;
if ( OrderType() == 1 )color_order = Red;
try = 0;
if ( NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(s,Digits) || NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(t,Digits) )
{
while ( IsTradeContextBusy() )Sleep(500);
res = OrderModify(OrderTicket(),OrderOpenPrice(),s,t,0,color_order);
while ( !res )
{
while ( IsTradeContextBusy() )Sleep(500);
res = OrderModify(OrderTicket(),OrderOpenPrice(),s,t,0,color_order);
Sleep(time_period_try * 1000);
try ++;
Print("Ордер с типом " + DoubleToStr(OrderType(),0) + " по цене " + DoubleToStr(OrderOpenPrice(),Digits) + " не модифицирован по OPEN, попытка " + DoubleToStr(try,0));
if ( try > number_try || res )break;
}
}
}
return (isOpened);
}
товарищи, помоги разобраться и дописать советника, смысл такой:
есть советник который открывает сделку на продажу от линии v1 и на покупку от линии 5
нужно чтобы советник сам закрыл сделку, если на продажу то на линии v3, если на покупку то на линии v4.
моя задумка такая, что даже если с убытком, но при касании линий сделка закрылась. как это написать?
Тут всё очень просто:
if(price_current == уровень цены, на котором установлена линия v3) Close_Sell(); if(price_current == уровень цены, на котором установлена линия v4) Close_Buy();
С уважением, Владимир.
если не сложно, можно как для дурака сделать, немного не понимаю что и куда написать
Так расписал уже кодом. Хорошо, давайте словами расскажу. Берёте текущую цену валютной пары, на котором стоит советник, и отслеживаете её движение, а дальше сравниваете с уровнями цен, где стоят линии v3 и v4. Если текущая цена равна уровню цены, на которой стоит линия v3, то отрабатывает функция закрытия короткой позиции Close_Sell(). Если текущая цена равна уровню цены, на которой стоит линия v4, то отрабатывает функция закрытия длинной позиции Close_Buyl().
С уважением, Владимир.
попробую разобраться.
Спасибо!
Можно, но у топикстартера было жёсткое условие - чтобы при касании линий сделка закрылась! Более мягкое условие звучало бы так - при пересечении линий снизу вверх или сверху вниз.
С уважением, Владимир.
А может произойти так, что сначала цена выше линии, а на следующем тике уже ниже. И как тут поймать момент касания?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
товарищи, помоги разобраться и дописать советника, смысл такой:
есть советник который открывает сделку на продажу от линии v1 и на покупку от линии 5
нужно чтобы советник сам закрыл сделку, если на продажу то на линии v3, если на покупку то на линии v4.
моя задумка такая, что даже если с убытком, но при касании линий сделка закрылась. как это написать?