В столе заказов есть такой заказ для МТ4
http://zakaz.opentraders.ru/54750.html#comment152360
Я как то писал похожий советник для МТ5, положу здесь, вдруг корму то пригодится.
Трендовым линиям надо прописать имя(не комментарий) такое же как в советнике, имена трендовых в советнике можно написать такие как вам нравится, главное чтобы имена в советнике совпадали с именами трендовых на графике.
Цвет линий значения не имеет, так же как и наличие других линий на графике.
Break_out_trend_EA.mq5 (13 Kb)
Комментарии (3)
<code>//+------------------------------------------------------------------+ //| Break_out_trend_EA.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com/ru/users/s22aa" #property version "1.0" #property description "Открывает сделки при пробое трендовой линии" #property description "рисуются четыре трендовые каждой присваиваем имя" #define _ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define _bid SymbolInfoDouble(_Symbol, SYMBOL_BID) #define _time SymbolInfoInteger(_Symbol, SYMBOL_TIME) #include <Trade\Trade.mqh> #include <Trade\symbolInfo.mqh> CTrade atrade; CSymbolInfo asymbol; input string PPB = "PPB"; //имя трендовой позиции Byu input string TPB = "TPB"; //имя трендовой тейкпрофит Byu input string PPS = "PPS"; //имя трендовой позиции Sell input string TPS = "TPS"; //имя трендовой тейкпрофит Sell color color_Byu = clrBlue; //цвет трендовой Byu color color_Sell = clrRed; //цвет трендовой Sell sinput ulong MagicNumber = 12345; ulong Slippage = 30; input double Lots = 1; double price_Sell, price_SL_Sell, price_TP_Sell, price_Buy, price_SL_Buy, price_TP_Buy; //+------------------------------------------------------------------+ int OnInit() { if(!asymbol.Name(Symbol())) return(INIT_FAILED); RefreshRates(); atrade.SetExpertMagicNumber(MagicNumber); if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK)) atrade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC)) atrade.SetTypeFilling(ORDER_FILLING_IOC); else atrade.SetTypeFilling(ORDER_FILLING_RETURN); atrade.SetDeviationInPoints(Slippage); Trend_line("PPB",_ask+20*_Point,_time-6000,_time+600,color_Byu); Trend_line("TPB",_ask+40*_Point,_time-6000,_time+600,color_Byu); Trend_line("PPS",_bid-20*_Point,_time-6000,_time+600,color_Sell); Trend_line("TPS",_bid-40*_Point,_time-6000,_time+600,color_Sell); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) {} //+------------------------------------------------------------------+ void OnTick() { if(!RefreshRates()) return; int x = 0; static int tempBuy = 0, tempSell = 0; static double price = 0; static string Name, Text; static datetime last_time = 0; datetime cur_time = iTime(_Symbol, PERIOD_CURRENT, 0); int Total = ObjectsTotal(0, 0, OBJ_TREND); MqlTick Prise; if(SymbolInfoTick(Symbol(), Prise)) { for(int i = 0; i <= Total; i++) { Name = ObjectName(0, i, 0, OBJ_TREND); //находит имя price = ObjectGetValueByTime(0, Name, cur_time); // цена обьекта во время открытия нового бара if(Name == PPS) price_Sell = price; if(Name == TPS) price_TP_Sell = price; if(Name == PPB) price_Buy = price; if(Name == TPB) price_TP_Buy = price; if(PositionsTotal() == 0 && Prise.bid >= price_Sell) tempSell = 1; if(Prise.bid <= price_Sell && Name == PPS && tempSell != 0 && price_Sell != 0) { OpenSell(price_Buy, price_TP_Sell); tempSell = 0; return; } if(PositionsTotal() == 0 && Prise.ask <= price_Buy) tempBuy = 1; if(Prise.ask >= price_Buy && Name == PPB && tempBuy != 0) { OpenBuy(price_Sell, price_TP_Buy); tempBuy = 0; return; } } } if(PositionsTotal() > 0 && cur_time != last_time) { if(PositionSelect(Symbol())) // выбираем позицию { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { Request(price_Buy, price_TP_Sell); } else { Request(price_Sell, price_TP_Buy); } } last_time = cur_time; } } //+------------------------------------------------------------------+ void Request(double sl, double tp) { ResetLastError(); MqlTradeRequest request; // параметры торгового запроса MqlTradeResult result; // результат торгового запроса ZeroMemory(request); if(PositionSelect(Symbol())) // выбираем позицию { double PositionSL = PositionGetDouble(POSITION_SL); // записываем в переменную уровень стоплосса double PositionTP = PositionGetDouble(POSITION_TP); // записываем в переменную уровень тейкпрофита sl = NormalizeDouble(sl, Digits()); tp = NormalizeDouble(tp, Digits()); if(PositionSL != sl || PositionTP != tp) { request.action = TRADE_ACTION_SLTP; request.position = PositionGetInteger(POSITION_TICKET); request.symbol = Symbol(); request.sl = sl; request.tp = tp; if(!OrderSend(request, result)) Print("error ", GetLastError()); } } } //+------------------------------------------------------------------+ //| Открываем Buy позицию | //+------------------------------------------------------------------+ void OpenBuy(double sl, double tp) { ResetLastError(); sl = NormalizeDouble(sl, Digits()); tp = NormalizeDouble(tp, Digits()); if(atrade.Buy(Lots, asymbol.Name(), asymbol.Ask(), sl, tp)) { if(atrade.ResultDeal() == 0) { Print("error ", GetLastError()); } } else { Print("error ", GetLastError()); } } //+------------------------------------------------------------------+ //| Открываем Sell позицию | //+------------------------------------------------------------------+ void OpenSell(double sl, double tp) { ResetLastError(); sl = NormalizeDouble(sl, Digits()); tp = NormalizeDouble(tp, Digits()); if(atrade.Sell(Lots, asymbol.Name(), asymbol.Bid(), sl, tp)) { if(atrade.ResultDeal() == 0) { Print("error ", GetLastError()); } } else { Print("error ", GetLastError()); } } //+------------------------------------------------------------------+ //| Обновление котировок | //+------------------------------------------------------------------+ bool RefreshRates() { if(!asymbol.RefreshRates()) { Print("не удалось обновить котировки!"); return(false); } if(asymbol.Ask() == 0 || asymbol.Bid() == 0) return(false); return(true); } //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(int fill_type) { //--- Obtain the value of the property that describes allowed filling modes int filling = asymbol.TradeFillFlags(); //--- Return true, if mode fill_type is allowed return((filling & fill_type) == fill_type); } //+------------------------------------------------------------------+ void Trend_line(string name, double price, datetime Time1, datetime Time2, color col) { NormalizeDouble(price,_Digits); if(ObjectFind(0,name)) { ObjectDelete(0,name); } if(!ObjectCreate(0,name,OBJ_TREND,0,Time2,price,Time1,price)) //--- создадим линию по заданной цене { Print(__FUNCTION__, ": не удалось создать прямоугольник! Код ошибки = ",GetLastError()); } ObjectSetInteger(0,name,OBJPROP_COLOR,col); //--- установим цвет линии ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); //--- установим стиль линии ObjectSetInteger(0,name,OBJPROP_WIDTH,1); //--- установим толщину линии ObjectSetInteger(0,name,OBJPROP_BACK,false); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true); //--- включим (true) или отключим (false) режим выделения для перемещений (доступность выделения) ObjectSetInteger(0,name,OBJPROP_SELECTED,false); //--- true, что позволяет выделять и перемещать этот объект ObjectSetInteger(0,name,OBJPROP_HIDDEN,false); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,true); //--- луч вправо return; }</code>Редактирован: 16 июня 2020, 10:177 s22aa Автор Сообщений: 25 - Александр
3 GEEZER Сообщений: 7 - Василий Федорович
Честно сказать, я даже не знаю, что такое линии Энвилоупс.
Да и времени, что то писать тоже нет.
7 s22aa Автор Сообщений: 25 - Александр
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий