Советники: cm ea StopOrdersTrendLine

 

cm ea StopOrdersTrendLine:

Советник ставит отложенный ордер на определенном расстоянии от трендовой линии. И тралит его вдоль нее.

cm ea StopOrdersTrendLine

Автор: Vladimir Khlystov

 

Добрый день.

Подскажите плиз, если я правильно прочитал Ваш код (я сильно начинающий программист), в функции 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);
}
 
Внес оба изменения в код (из обоих своих постов выше), отличий в работе советника не заметил. Укажите плиз, если ошибаюсь.
 
Sergey Voytsekhovsky:

Добрый день.


Может между ними хорошо бы смотрелось 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 пунктов?

И еще вопрос: может тралл (с шагом тралла) смотрелся бы лучше

Спасибо!

 
AurelianoV:

Добротный продукт.

Как помощник отличный.

Только у меня возникли некоторые вопросы по входным данным

А именно

  • input int BE_Trigger = 100; //Когда переводить в безубыток 
  • input int BE_plusPunkts = 25; //Насколько пунктов ставить в безубыток 

  • - Т.е. после того как цена прошла в нашем направлении 125 пунктов, стоп-лосс установлен на отметке 100 пунктов?

И еще вопрос: может тралл (с шагом тралла) смотрелся бы лучше

Спасибо!

Может быть и так. На этом сайте выложены только начальные заготовки советников. Их следует дорабатывать для реальной торговли с учетом индивидуальных пожеланий.

Причина обращения: