Поменять порядок выполнения операций вычисления элементов массивов на обратный.
Не думаю что это выход... Ведь проблема в отображении линий на графике... На данном этапе есть необходимость отображения 4-х линий (границы локального и глобального коридоров), а отображаются только 2(локальные).
В данном случае изменять порядок бессмысленно т.к. массив является буфером типа FIFO где с "одной стороны" он заполняется данными, а с другой "освобождается".
Есть и другие способы временного хранения данных, но я выбрал массив из соображения, в последующем провести анализ хранящихся данных.
Для вычисления "локального коридора" массива используются первая и последняя ячейка. А "глобальный коридор" вычисляется сравнением текущего значения и соответствующего значения "локального коридора". на каждом тике происходит смещение данных в массиве и заполнение первой ячейки.
Хотя сам 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);
}

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Может быть кто нибудь сталкивался с такой проблемой...
Есть идея написать советника, который будет "переворачивать" ордера в обратное направление при достижении максимума или минимума.
Для визуализации решил максимумы и минимуму цен (локальные и глобальные) обозначить горизонтальными линиями...
Вот код :
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 линии.
Подскажите как можно решить эту проблему... Заранее благодарен...