Помогите пожалуйста вставить в советник без убыток и трейлинг стоп, хотя бы без убыток что при прохождении например 100 пунктов в направлении стоп лосс прыгал в без убыток ( http://mql.opentraders.ru/949.html )
Поставить получилось, советник работает, но те выставляет стоп лосс в без убыток не при каких значениях( может есть проще функции. Вся информация была взята с сайта http://mql.opentraders.ru/949.html
А какое значение у BULevel? Подозреваю, что там значение 100. Тогда все верно - цена (по крайней мере, для валют-мажоров) не может пройти в своей категории такую огромную величину. Категория цены - стотысячные доли единицы.
P. S. Вставьте код правильно (кнопка "</>" или Alt+S)
А какое значение у BULevel? Подозреваю, что там значение 100. Тогда все верно - цена (по крайней мере, для валют-мажоров) не может пройти в своей категории такую огромную величину. Категория цены - стотысячные доли единицы.
P. S. Вставьте код правильно (кнопка "</>" или Alt+S)
//+------------------------------------------------------------------+ void BU() { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS)) { if(OrderType()==OP_BUY) { if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green); } } if(OrderType() == OP_SELL) { if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red); } } } } } //------------------------------------------------------------------+
extern double BULevel = 0.001; То есть при прохождении даже 1000 пунктов на 5 знаке, стоп лосс в без убыток не переходит
Тогда все работает. Проверил таким кодом:
input double BULevel = 0.001; int OnInit() { int nTicket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, Ask - 300 * Point, 0.0); nTicket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 0, Bid + 300 * Point, 0.0); return INIT_SUCCEEDED; } void OnTick() { BU(); } void BU() { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS)) { if(OrderType()==OP_BUY) { if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green); } } if(OrderType() == OP_SELL) { if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red); } } } } }
Результат:
2 10:36:09.314 2018.06.01 00:00:00 Test inputs: i_nMagicNumber=12876; BULevel=0.001; 2 10:36:09.347 2018.06.01 00:00:00 Test EURUSD,M5: open #1 buy 0.10 EURUSD at 1.16929 sl: 1.16629 ok 2 10:36:09.347 2018.06.01 00:00:00 Test EURUSD,M5: open #2 sell 0.10 EURUSD at 1.16909 sl: 1.17209 ok 2 10:36:12.769 2018.06.01 01:43:02 Test EURUSD,M5: modify #1 buy 0.10 EURUSD at 1.16929 sl: 1.16929 tp: 0.00000 ok 0 10:36:12.792 2018.06.01 02:57:21 Tester: stop loss #1 at 1.16929 (1.16929 / 1.16949) 2 10:36:12.878 2018.06.01 06:24:12 Test EURUSD,M5: modify #2 sell 0.10 EURUSD at 1.16909 sl: 1.16909 tp: 0.00000 ok 0 10:36:12.963 2018.06.01 10:19:07 Tester: stop loss #2 at 1.16909 (1.16889 / 1.16909)
Тогда все работает. Проверил таким кодом:
Результат:
Ну вот так выглядит код полностью который комплимируется, но какое бы я значение BULevel1 не ставил стоп лосс в без убыток не переходит
////////////\\\\\\\\\\\ ////// BB_MACD \\\\\\ ///// Fillellin \\\\\ ////////////\\\\\\\\\\\ #property copyright "Copyright © 2017, Alexander Voronkov / Fillellin" #property strict #property link "https://www.mql5.com/ru/users/fillellin" #include <stdlib.mqh> extern string ————————————————————————1———————————————————————— = "————————| Настройки времени торговли"; input string StartTrade = "00:00"; // Начало торговли: input string StopTrade = "23:59"; // Конец торговли: extern string ————————————————————————2———————————————————————— = "————————| Общие параметры советника"; extern double Lots = 0.01; // Размер лота: extern int StopLoss = 0; // Размер стопа в пунктах: extern int TakeProfit = 0; // Размер тейка в пунктах: extern int Slippage = 2; // Проскальзывание цены - уровень допустимого реквота: extern int MagicNumber = 0; // Идентификатор позиции - Магик номер: extern string ————————————————————————3———————————————————————— = "————————| Настройки индикатора (BBands_Stop)"; input int Length = 20; // Bollinger Bands Period: input int Deviation = 2; // Deviation was 2: extern string ————————————————————————4———————————————————————— = "————————| Настройки индикатора (MACD)"; input int InpFastEMA = 12; // Fast EMA Period: input int InpSlowEMA = 26; // Slow EMA Period: input int InpSignalSMA = 9; // Signal SMA Period: extern double BULevel = 0.001; //————————————————————————————————————| bool TradeSg=false; bool upFlags=false; bool dnFlags=false; int ord,ticketbuy,ticketsell; double SL,TP; datetime lasttimebuy, lasttimesell; //———————————————————————————————————————————————| //+------------------------------------------------------------------+ void BU() { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS)) { if(OrderType()==OP_BUY) { if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green); } } if(OrderType() == OP_SELL) { if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red); } } } } } //------------------------------------------------------------------+ int OnInit() { if(_Digits == 3|| _Digits == 5){ Slippage*=10; TakeProfit*=10; StopLoss*=10;} lasttimebuy = 0; lasttimesell = 0; return(INIT_SUCCEEDED); } //——————| the beginning of the algorithm |———————| bool TradeStop = true; void OnTick(){ //---------------------------------------------------------------------------------------------------------------+ // привязка к конкретному торговому счету if(AccountNumber() != 7236301){ Comment("Invalid account... forex-time@mail.ru"); if(TradeStop) Alert("Invalid account... forex-time@mail.ru"); TradeStop=false; return;} //---------------------------------------------------------------------------------------------------------------+ double stoplossBUY, takeprofitBUY, stoplossSELL, takeprofitSELL; int Days = DayOfWeek(); datetime TimeCurr = TimeCurrent(); datetime Start = StrToTime(StartTrade); datetime Stop = StrToTime(StopTrade); //—————————————————————————————————————————————————| if(StopLoss == 0){stoplossBUY=0; stoplossSELL=0;} else { stoplossBUY = NormalizeDouble(Bid - StopLoss*Point,Digits); stoplossSELL = NormalizeDouble(Ask + StopLoss*Point,Digits); } if(TakeProfit == 0){takeprofitBUY=0; takeprofitSELL=0;} else { takeprofitBUY = NormalizeDouble(Ask + TakeProfit*Point,Digits); takeprofitSELL = NormalizeDouble(Bid - TakeProfit*Point,Digits); } //—————————————————————————————————————————————————————————————————————————————————————————————| double currenMacd = iMACD(NULL,0, InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,1); double previoMacd = iMACD(NULL,0, InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,2); double currUpBand = iCustom(NULL,0, "BBands_Stop_v1", Length,Deviation, 2,1); double currDnBand = iCustom(NULL,0, "BBands_Stop_v1", Length,Deviation, 3,1); if(((previoMacd <= 0 && currenMacd > 0)||(previoMacd >= 0&& currenMacd < 0))&& TradeSg==false) TradeSg=true; if(100 < 0 && TradeSg==true) TradeSg=false; //———————————————————————————————————————————————————————————————————| if(TradeSg &&((Days == 1 && TimeCurr >= Start && TimeCurr < Stop)|| (Days == 2 && TimeCurr >= Start && TimeCurr < Stop)|| (Days == 3 && TimeCurr >= Start && TimeCurr < Stop)|| (Days == 4 && TimeCurr >= Start && TimeCurr < Stop)|| (Days == 5 && TimeCurr >= Start && TimeCurr < Stop))){ //————————————————————————————————————————————————————————————————————————————————————————| if(currenMacd > 0 && currUpBand != 0 && upFlags==false){upFlags=true; dnFlags=false;} if(currenMacd < 0 && currDnBand != 0 && dnFlags==false){dnFlags=true; upFlags=false;} //————————————————————————————————————————————————————————————————————————————————————————| int ordbuy = CountBuy(); int ordsell = CountSell(); datetime time = iTime(Symbol(),PERIOD_CURRENT,0); //————————————————————————————————————————————————————| if(upFlags) { if(ordsell > 0) ord = CloseOrder(ticketsell,0); if(lasttimebuy != time && ordbuy == 0) { ord = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, stoplossBUY, takeprofitBUY, NULL, MagicNumber, 0, clrNONE); if(ord < 0) Print("Ошибка при открытии позиции BUY (", ErrorDescription(GetLastError()), ")"); else lasttimebuy = time; } } //———————————————————————————————————————————————————| if(dnFlags) { if(ordbuy > 0) ord = CloseOrder(ticketbuy,0); if(lasttimesell != time && ordsell == 0) { ord = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, stoplossSELL, takeprofitSELL, NULL, MagicNumber, 0, clrNONE); if(ord < 0) Print("Ошибка при открытии позиции Sell (", ErrorDescription(GetLastError()), ")"); else lasttimesell = time; } } } } //——————————————————————————————————————————————————————| int CountBuy() { int count = 0; for(int trade = OrdersTotal()-1; trade >= 0; trade --) { ord = OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()== Symbol()&& OrderMagicNumber()== MagicNumber) { if(OrderType()== OP_BUY) { count++; ticketbuy = OrderTicket(); } } } return(count); } //——————————————————————————————————————————————————————| int CountSell() { int count = 0; for(int trade = OrdersTotal()-1; trade >= 0; trade --) { ord = OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()== Symbol()&& OrderMagicNumber()== MagicNumber) { if(OrderType()== OP_SELL) { count++; ticketsell = OrderTicket(); } } } return(count); } //————————————————————————————————————| int CloseOrder(int ticket, double lots) { int err = 0, f = 0; double price = 0; bool chk = OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); if(lots == 0) lots = OrderLots(); if(lots < MarketInfo(OrderSymbol(),MODE_MINLOT)) lots = MarketInfo(OrderSymbol(),MODE_MINLOT); while(f < 10) { RefreshRates(); if(OrderType()== 0) price = Bid; if(OrderType()== 1) price = Ask; if(OrderType()> 1) { chk = OrderDelete(ticket); return(0); } chk = OrderClose(ticket,lots,NormalizeDouble(price,Digits),1,clrGoldenrod); err = GetLastError(); if(err == 0) break; Print(OrderSymbol(), " при закрытии ордера."); f ++; Sleep(1000); } return(0); } //———————————————————————————| end of the algorithm |———————————————————————————|
- www.metatrader5.com
Процедура BU ни где не вызывается естественно она не будет работать!
Вот я по этому и попросил помощи)
Вот я по этому и попросил помощи)
Ну так по логике на каждом тике и надо проверять!
Поставте вызов процедуры в OnTick проверьте как она работает.
Ну так по логике на каждом тике и надо проверять!
Поставте вызов процедуры в OnTick проверьте как она работает.
Всё ровно не понимаю, не получается, мне хотя бы просто чтобы при прохождения 100 пунктов стоп лосс переходил в без убыток, 10 пунктов, то есть не как трал а просто как 100 пунктов цена прошла без убыток был на +10 от цены открытия и все(
//+------------------------------------------------------------------+ //| set_outloss() установка SL на уровень безубытка //+------------------------------------------------------------------+ void set_outloss() { string _Function = "set_outloss():"; //----------------- double _SL; int _Сommision_Pip, _Dist_OutLoss, _Profit_for_OutLoss; //----------------- if(!SET_OUTLOSS) return; for(int _i=OrdersTotal()-1; _i>=0; _i--) { OrderSelect(_i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol() && check_magic(OrderMagicNumber(),_Function)){ //---- проверка корректности уровней outloss с учётом комиссии ------- _Dist_OutLoss = check_dist_outloss(OrderTicket()); _Profit_for_OutLoss = check_profit_for_outloss(_Dist_OutLoss); //-------------------------------------------------------------------- if(OrderType() == OP_BUY){ //---- проверка внешних сигналов управляющих OutLoss ----------------- if(GlobalVariableGet(GV_Ignore_Tral_SL_BUY) == YES)continue; //-------------------------------------------------------------------- if(OrderStopLoss() < OrderOpenPrice()){ // в том числе если OrderStopLoss == 0 if(Ask - OrderOpenPrice() >= _Profit_for_OutLoss*Point) { _SL = NormalizeDouble(OrderOpenPrice() + _Dist_OutLoss*Point,Digits); if(OrderModify(OrderTicket(),OrderOpenPrice(),_SL,OrderTakeProfit(),0,CLR_NONE)){ int _Dist = (Ask - OrderOpenPrice())/Point; output_mov_string("SL OP_BUY "+OrderTicket()+" в безубытке. Дист.установки= " + _Dist, Clr_Report); output_sound(Name_Sound_OutLoss); } } } } if(OrderType() == OP_SELL){ //---- проверка внешних сигналов управляющих OutLoss ----------------- if(GlobalVariableGet(GV_Ignore_Set_Outloss_SELL) == YES)continue; //-------------------------------------------------------------------- if(OrderStopLoss() > OrderOpenPrice() || OrderStopLoss() == 0) { if(OrderOpenPrice() - Bid >= _Profit_for_OutLoss*Point){ _SL = NormalizeDouble(OrderOpenPrice() - _Dist_OutLoss*Point,Digits); if(OrderModify(OrderTicket(),OrderOpenPrice(),_SL,OrderTakeProfit(),0,CLR_NONE)){ _Dist = (OrderOpenPrice() - Bid)/Point; output_mov_string("SL OP_SELL "+OrderTicket()+" в безубытке. Дист.установки= " + _Dist, Clr_Report); output_sound(Name_Sound_OutLoss); } } } } } } //----------------- return; } //+------------------------------------------------------------------+ //+-------
Нашёл код, но не могу прикрепить к своему, не хватает именно грамотности в коде mql4
Всё ровно не понимаю, не получается, мне хотя бы просто чтобы при прохождения 100 пунктов стоп лосс переходил в без убыток, 10 пунктов, то есть не как трал а просто как 100 пунктов цена прошла без убыток был на +10 от цены открытия и все(
Вы вызов прцедуры в OnTick вставили? Что после этого происходит с ордрами?
Нашёл код, но не могу прикрепить к своему, не хватает именно грамотности в коде mql4
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Поставить получилось, советник работает, но те выставляет стоп лосс в без убыток не при каких значениях( может есть проще функции. Вся информация была взята с сайта http://mql.opentraders.ru/949.html