Скачать MetaTrader 5

Почему советник не отображает все линии на графике?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Алексей
17
Алексей  

Может быть кто нибудь сталкивался с такой проблемой...

Есть идея написать советника, который будет "переворачивать" ордера в обратное направление при достижении максимума или минимума.

Для визуализации решил максимумы и минимуму цен (локальные и глобальные) обозначить горизонтальными линиями...

Вот код :

double OpenMass[15];
double CloseMass[15];
double local_max, local_min;
double global_max, global_min;
int init()
  {// Инициализация лилий

  ObjectCreate("LMax",OBJ_HLINE,0,0,0,0,0,0,0);
  ObjectSet("LMAx",OBJPROP_COLOR,MediumBlue);
  ObjectSet("LMAx",OBJPROP_STYLE,STYLE_SOLID);

  ObjectCreate("LMin",OBJ_HLINE,0,0,0,0,0,0,0);
  ObjectSet("LMin",OBJPROP_COLOR,MediumBlue);
  ObjectSet("LMin",OBJPROP_STYLE,STYLE_SOLID);

  ObjectCreate("GMax",OBJ_HLINE,0,0,0,0,0,0,0);
  ObjectSet("GMax",OBJPROP_COLOR,Red);
  ObjectSet("GMax",OBJPROP_STYLE,STYLE_SOLID);

  ObjectCreate("GMin",OBJ_HLINE,0,0,0,0,0,0,0);
  ObjectSet("GMin",OBJPROP_COLOR,Red);
  ObjectSet("GMin",OBJPROP_STYLE,STYLE_SOLID);

   return(0);
  }
int start()
  {//Массивы заполняются при каждом тике
  OpenMass[14]=OpenMass[13]; CloseMass[14]=CloseMass[13];
  OpenMass[13]=OpenMass[12]; CloseMass[13]=CloseMass[12];
  OpenMass[12]=OpenMass[11]; CloseMass[12]=CloseMass[11];
  OpenMass[11]=OpenMass[10]; CloseMass[11]=CloseMass[10];
  OpenMass[10]=OpenMass[9];  CloseMass[10]=CloseMass[9];
  OpenMass[9]=OpenMass[8];   CloseMass[9]=CloseMass[8];
  OpenMass[8]=OpenMass[7];   CloseMass[8]=CloseMass[7];
  OpenMass[7]=OpenMass[6];   CloseMass[7]=CloseMass[6];
  OpenMass[6]=OpenMass[5];   CloseMass[6]=CloseMass[5];
  OpenMass[5]=OpenMass[4];   CloseMass[5]=CloseMass[4];
  OpenMass[4]=OpenMass[3];   CloseMass[4]=CloseMass[3];
  OpenMass[3]=OpenMass[2];   CloseMass[3]=CloseMass[2];
  OpenMass[2]=OpenMass[1];   CloseMass[2]=CloseMass[1];
  OpenMass[1]=OpenMass[0];   CloseMass[1]=CloseMass[0];     
  OpenMass[0]=High[0]; CloseMass[0]=Low[0];

  local_max= MathMax(OpenMass[0], OpenMass[14]);//Локальный максимум
  ObjectSet("LMax",OBJPROP_PRICE1,local_max);
  local_min= MathMin(CloseMass[0], CloseMass[14]);//Локальный минимум
  ObjectSet("LMin",OBJPROP_PRICE1,local_min);
  global_max=MathMax(local_max,global_max);//Глобальный максимум
  ObjectSet("GMmax",OBJPROP_PRICE1,global_max);
  global_min=MathMin(local_min,global_min);//Глобальный минимум
  ObjectSet("GMin",OBJPROP_PRICE1,global_min);

   return(0);
  }

на графике прорисовываются только 2 линии.

Подскажите как можно решить эту проблему... Заранее благодарен...

Алексей Тарабанов
7330
Алексей Тарабанов  
Поменять порядок выполнения операций вычисления элементов массивов на обратный. 
Алексей
17
Алексей  
tara:
Поменять порядок выполнения операций вычисления элементов массивов на обратный. 

Не думаю что это выход... Ведь проблема в отображении линий на графике... На данном этапе есть необходимость отображения 4-х линий (границы локального и глобального коридоров), а отображаются только 2(локальные).

В данном случае изменять порядок бессмысленно т.к. массив является буфером типа FIFO где с "одной стороны" он заполняется данными, а с другой "освобождается".

Есть и другие способы временного хранения данных, но я выбрал массив из соображения, в последующем провести анализ хранящихся данных.

Для вычисления "локального коридора" массива используются первая и последняя ячейка. А "глобальный коридор" вычисляется сравнением текущего значения и соответствующего значения "локального коридора". на каждом тике происходит смещение данных в массиве и заполнение первой ячейки.

Евгений
47
Евгений  
Спасибо за ответы линии не нужны,нужны только цифры.Переставил icustom местами никакого изменения((.пробовал и переменные поменять,тоже толку 0((. От ценового канала значения идут,а вот Xrust поазывает больше двух миллионов))
Евгений
47
Евгений  

Хотя сам  Xrust пашет и без отрисовки разметочных линий,пытаюсь сделать советник для автоматической торговли и эти разметки мне ни к чему.

#property indicator_chart_window
extern int TimeFrame=0;//Если=0, то текуший


extern string FrApNam="Ap";//Имя линии соотв.Фракталу вверх
extern string FrDnNam="Dn";//Имя линии соотв.Фракталу вниз

//-----------------------------------------------------------------------------+
double FrPrise;
double FrApPrise=0,FrDnPrise=0;

//+----------------------------------------------------------------------------+
void init(){

if(TimeFrame==0){TimeFrame=Period();}
IndicatorShortName("Factal_Level_Xrust"+TimeFrame);
FrApNam=StringConcatenate(FrApNam,TimeFrame);
FrDnNam=StringConcatenate(FrDnNam,TimeFrame);
return;}
void deinit(){
ObjectDelete(FrDnNam);
ObjectDelete(FrApNam);
Comment(" ");
return;}
//+----------------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int limit;
double tmp;
int i, j,k;
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//-----------------------------------------------------------------------------+

LineAp();
LineDn();
string FAP=DoubleToStr((FrApPrise),Digits);
string FDP=DoubleToStr((FrDnPrise),Digits);
int diap=MathRound((FrApPrise-FrDnPrise)/Point);
{Comment("TimeFrame="+TimeFrame+
"\nApPrise111 ="+FAP+
"\nDnPrise ="+FDP+
"\nFractal Channel ="
+diap+"Point");}

return(0);
}
//-----------------------------------------------------------------------------+
// Ищет горизонтальную линию по имени перерисовывает если изменилась цена |
//-----------------------------------------------------------------------------+
void LineDn(){
FrPrise=NormalizeDouble(FindNearFractal(0,TimeFrame,MODE_LOWER),MarketInfo(Symbol(),MODE_DIGITS));
FrPrise=NormalizeDouble(FrPrise,MarketInfo(Symbol(),MODE_DIGITS));
//Comment(FrPrise);
if(ObjectFind(FrDnNam)==0){
if(ObjectGet(FrDnNam,OBJPROP_PRICE1)==FrPrise){return;}}
FrDnPrise=FrPrise;
ObjectDelete(FrDnNam);

WindowRedraw();
return;}
//-----------------------------------------------------------------------------+
// Ищет горизонтальную линию по имени перерисовывает если изменилась цена |
//-----------------------------------------------------------------------------+
void LineAp(){
FrPrise=NormalizeDouble(FindNearFractal(0,TimeFrame,MODE_UPPER),MarketInfo(Symbol(),MODE_DIGITS));
FrPrise=NormalizeDouble(FrPrise,MarketInfo(Symbol(),MODE_DIGITS));
if(ObjectFind(FrApNam)==0){
if(ObjectGet(FrApNam,OBJPROP_PRICE1)==FrPrise){return;}}
FrApPrise=FrPrise;
ObjectDelete(FrApNam);

WindowRedraw();
return;}
//-----------------------------------------------------------------------------+
// Киму Респект и уважуха !!! |
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 07.10.2006 |
//| Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий ТФ) |
//| mode - тип фрактала (MODE_LOWER|MODE_UPPER) |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
if (sy=="" || sy=="0") sy=Symbol();
double f=0;
int d=MarketInfo(sy, MODE_DIGITS), s;
if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

for (s=2; s<100; s++) {
f=iFractals(sy, tf, mode, s);
if (f!=0) return(NormalizeDouble(f, d));
}
Print("FindNearFractal(): Фрактал не найден");
return(0);
}
 

Евгений
47
Евгений  
Вкрадце нужно сделать небольшой "советник" выводящий на экран две цифры(с "ценовой канал" и с модифицированного хруста),спасибо что помогаете.Индикаторы сами по себе пашут,не могу по ним такого эксперта создать.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий