Добрый день.
Подскажите плиз, если я правильно прочитал Ваш код (я сильно начинающий программист), в функции TrendCreate работает такая логика:
Если ObjectFind находит на графике "ТрендЛайн", то изменяет параметры, возможно на более свежие.
И тут-же поступает новая команда ObjectCreate.
В справке сказано что "...Если объект был уже создан ранее, то производится попытка изменить его координаты..."
Таким образом получается что если ТрендЛайн уже существует, два раза подряд выполняется выполняется одно и тоже по сути действие.
Может между ними хорошо бы смотрелось else???
Не нарушит ли такое изменение логики Вашего советника???
bool TrendCreate(const long chart_ID=0, // ID графика const string name="TrendLine", // имя линии const int sub_window=0, // номер подокна datetime time1=0, // время первой точки double price1=0, // цена первой точки datetime time2=0, // время второй точки double price2=0, // цена второй точки const color clr=clrRed, // цвет линии const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии const int width=1, // толщина линии const bool back=false, // на заднем плане const bool selection=true, // выделить для перемещений const bool ray_right=true, // продолжение линии вправо const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { if(ObjectFind(chart_ID,name)!=-1) //Находим на графике линию name="TrendLine" { //Задаем значения для установки "TrendLine" на график ObjectSetInteger(chart_ID,name,OBJPROP_TIME,0,time1); ObjectSetInteger(chart_ID,name,OBJPROP_TIME,1,time2); ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,0,price1); ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,1,price2); return(true); } else if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2)) { return(false); } ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); return(true); }
Где-то вычитал, что для обучения эффективно разбирать чужой код. Ваши работы мне нравятся, надеюсь что не сильно Вас отвлекаю.
Подскажите плиз, почему в приведенной ниже функции некоторые ObjectSetInteger и ObjectSetString вынесены за фигурные скобки условия if (ObjectFind(chart_ID,name)==-1){...}(выделены жёлтым) ведь они изменяют свойства одного и того-же объекта ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);???
И как изменится логика этой функции если их поместить внутри этих фигурных скобок???
bool ButtonCreate(const long chart_ID=0, // ID графика const string name="Button", // имя кнопки const int sub_window=0, // номер подокна const long x=0, // координата по оси X const long y=0, // координата по оси Y const int width=50, // ширина кнопки const int height=18, // высота кнопки const string text="Button", // текст const string font="Arial", // шрифт const int font_size=10, // размер шрифта const color clr=clrRed, // цвет текста const color clrfon=clrBlack, // цвет фона const color border_clr=clrNONE, // цвет границы const bool state=false, // цвет границы const ENUM_BASE_CORNER CORNER=CORNER_LEFT_LOWER) { if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER); ObjectSetString(chart_ID,name,OBJPROP_FONT,font); ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1); ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); } ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clrfon); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); return(true); }
Добрый день.
Может между ними хорошо бы смотрелось else???
да
Добрый день.
При расчете цены, на которую будут выставляться отложенные ордера, параметр DistanceFromLine влияет дважды.
В качестве примера привожу Buy направление, для Sell всё аналогично.
Первый раз при расчете PriceB,
строчка кода 72.
if (!BS) ObjectDelete(0,"cm trend line B"); else PriceB = NormalizeDouble(ObjectGetValueByShift("cm trend line B",0),_Digits); } else { if (BS) TrendCreate(0,"cm trend line B",0,iTime(NULL,0,50),iHigh(NULL,0,50)+DistanceFromLine*_Point,iT ime(NULL,0,1),iHigh(NULL,0,1)+DistanceFromLine*_Point,clrBlue); }
Второй раз при расчете PriceBuyStop
строчка кода 265.
if (PriceBuyStop==0) { PriceBuyStop=NormalizeDouble(PriceB + DistanceFromLine * _Point,_Digits); if (PriceBuyStop<Ask+STOPLEVEL*_Point) PriceBuyStop=NormalizeDouble(Ask+STOPLEVEL*_Point,_Digits); if (Takeprofit!=0) TP = NormalizeDouble(PriceBuyStop + Takeprofit * _Point,_Digits); else TP=0; if (Stoploss!=0) SL = NormalizeDouble(PriceBuyStop - Stoploss * _Point,_Digits); else SL=0; SendOrder(ORDER_TYPE_BUY_STOP,PriceBuyStop,Lots,SL,TP); }
В версии для МТ4 такой ошибки нет, в расчете PriceB DistanceFromLine отсутствует. Поправьте пожалуйста в исходнике.
Добротный продукт.
Как помощник отличный.
Только у меня возникли некоторые вопросы по входным данным
А именно
- input int BE_Trigger = 100; //Когда переводить в безубыток
- input int BE_plusPunkts = 25; //Насколько пунктов ставить в безубыток
- Т.е. после того как цена прошла в нашем направлении 125 пунктов, стоп-лосс установлен на отметке 100 пунктов?
И еще вопрос: может тралл (с шагом тралла) смотрелся бы лучше
Спасибо!
Добротный продукт.
Как помощник отличный.
Только у меня возникли некоторые вопросы по входным данным
А именно
- input int BE_Trigger = 100; //Когда переводить в безубыток
- input int BE_plusPunkts = 25; //Насколько пунктов ставить в безубыток
- Т.е. после того как цена прошла в нашем направлении 125 пунктов, стоп-лосс установлен на отметке 100 пунктов?
И еще вопрос: может тралл (с шагом тралла) смотрелся бы лучше
Спасибо!
Может быть и так. На этом сайте выложены только начальные заготовки советников. Их следует дорабатывать для реальной торговли с учетом индивидуальных пожеланий.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
cm ea StopOrdersTrendLine:
Советник ставит отложенный ордер на определенном расстоянии от трендовой линии. И тралит его вдоль нее.
Автор: Vladimir Khlystov