Можно простенький пример. Допустим в индикаторе 'фрактал' вместо фракталов или рядом цена(опен или хай не важно). Не особо силен в mql4. :)
ну если грубо, учти, я не обращал внимание на поиск окна где рисовать, удалить объекты при удалении индикатора и прочие тонкости (выделил добавленные фрагменты, для фракталов открытого кода под рукой не оказалось поэтому на параболике)
//+------------------------------------------------------------------+
//| Parabolic.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Lime
//---- input parameters
extern double Step=0.02;
extern double Maximum=0.2;
//---- buffers
double SarBuffer[];
//----
int save_lastreverse;
bool save_dirlong;
double save_start;
double save_last_high;
double save_last_low;
double save_ep;
double save_sar;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,SarBuffer);
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SaveLastReverse(int last,int dir,double start,double low,double high,double ep,double sar)
{
save_lastreverse=last;
save_dirlong=dir;
save_start=start;
save_last_low=low;
save_last_high=high;
save_ep=ep;
save_sar=sar;
}
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system |
//+------------------------------------------------------------------+
int start()
{
static bool first=true;
bool dirlong;
double start,last_high,last_low;
double ep,sar,price_low,price_high,price;
int i,counted_bars=IndicatorCounted();
//---- добавлено
int limit,cb;
//---- конец добавки
if(Bars<3) return(0);
//---- initial settings
i=Bars-2;
if(counted_bars==0 || first)
{
first=false;
dirlong=true;
start=Step;
last_high=-10000000.0;
last_low=10000000.0;
while(i>0)
{
save_lastreverse=i;
price_low=Low[i];
if(last_low>price_low) last_low=price_low;
price_high=High[i];
if(last_high<price_high) last_high=price_high;
if(price_high>High[i+1] && price_low>Low[i+1]) break;
if(price_high<High[i+1] && price_low<Low[i+1]) { dirlong=false; break; }
i--;
}
//---- initial zero
int k=i;
while(k<Bars)
{
SarBuffer[k]=0.0;
k++;
}
//---- check further
if(dirlong) { SarBuffer[i]=Low[i+1]; ep=High[i]; }
else { SarBuffer[i]=High[i+1]; ep=Low[i]; }
i--;
}
else
{
i=save_lastreverse;
start=save_start;
dirlong=save_dirlong;
last_high=save_last_high;
last_low=save_last_low;
ep=save_ep;
sar=save_sar;
}
//----
while(i>=0)
{
price_low=Low[i];
price_high=High[i];
//--- check for reverse
if(dirlong && price_low<SarBuffer[i+1])
{
SaveLastReverse(i,true,start,price_low,last_high,ep,sar);
start=Step; dirlong=false;
ep=price_low; last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(!dirlong && price_high>SarBuffer[i+1])
{
SaveLastReverse(i,false,start,last_low,price_high,ep,sar);
start=Step; dirlong=true;
ep=price_high; last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
//---
price=SarBuffer[i+1];
sar=price+start*(ep-price);
if(dirlong)
{
if(ep<price_high && (start+Step)<=Maximum) start+=Step;
if(price_high<High[i+1] && i==Bars-2) sar=SarBuffer[i+1];
price=Low[i+1];
if(sar>price) sar=price;
price=Low[i+2];
if(sar>price) sar=price;
if(sar>price_low)
{
SaveLastReverse(i,true,start,price_low,last_high,ep,sar);
start=Step; dirlong=false; ep=price_low;
last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(ep<price_high) { last_high=price_high; ep=price_high; }
}
else
{
if(ep>price_low && (start+Step)<=Maximum) start+=Step;
if(price_low<Low[i+1] && i==Bars-2) sar=SarBuffer[i+1];
price=High[i+1];
if(sar<price) sar=price;
price=High[i+2];
if(sar<price) sar=price;
if(sar<price_high)
{
SaveLastReverse(i,false,start,last_low,price_high,ep,sar);
start=Step; dirlong=true; ep=price_high;
last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
if(ep>price_low) { last_low=price_low; ep=price_low; }
}
SarBuffer[i]=sar;
i--;
}
// sar=SarBuffer[0];
// price=iSAR(NULL,0,Step,Maximum,0);
// if(sar!=price) Print("custom=",sar," SAR=",price," counted=",counted_bars);
// if(sar==price) Print("custom=",sar," SAR=",price," counted=",counted_bars);
//-------- добавлено
limit=Bars-counted_bars;
for( cb=limit;cb>=0;cb-- )
{
if( GreaterDoubles(SarBuffer[cb],0,Digits) )
{
//сначало ищем по имени объект
if( ObjectFind("price"+Time[cb])<0 )
{
//если нету создаем
while( !ObjectCreate("price"+Time[cb],OBJ_ARROW,0,Time[cb],SarBuffer[cb]) )
{
}
//устанавливаем свойства объекта
//код стрелки
while( !ObjectSet("price"+Time[cb],OBJPROP_ARROWCODE,SYMBOL_LEFTPRICE) )
{
}
//цвет
while( !ObjectSet("price"+Time[cb],OBJPROP_COLOR,DodgerBlue) )
{
}
//цену
while( !ObjectSet("price"+Time[cb],OBJPROP_PRICE1,SarBuffer[cb]) )
{
}
//время
while( !ObjectSet("price"+Time[cb],OBJPROP_TIME1,Time[cb]) )
{
}
}
else
{
//если объект существует, просто меняем значение координаты цены
while( !ObjectSet("price"+Time[cb],OBJPROP_PRICE1,SarBuffer[cb]) )
{
}
}
}
}
//---- конец добавки
//----
return(0);
}
//+------------------------------------------------------------------+
//-------- добавлено
//+---------------------------------------------------------------------------------------------------------------------------------------------------+
//| функция возвращает истину если первое число больше второго |
//+---------------------------------------------------------------------------------------------------------------------------------------------------+
bool GreaterDoubles(double number1,double number2,int dig)
{
if(NormalizeDouble(number1-number2,dig)>0) return(true);
else return(false);
}
//=====================================================================================================================================================
//---- конец добавки
Спасибо :)
имей в виду, большое количество объектов использует много машинных ресурсов, это может привести к замедлению работы, подвисанию и сбоям.
Проблема с удаление объектов. ObjectDelete("price") походу удаляет только один объект.
Если поставить ObjectsDeleteAll("price") то удаляются все объекты на чарте и даже те которые были нарисованы не индикатором.
Если поставить ObjectsDeleteAll(0,OBJ_ARROW) удаляет все объекты Arrow и даже те которые небыли нарисованы индикатором. Как быть?
Ещё хотел спросить. Если я захочу просто в SetIndexArrow использовать вертикальные, горизонтальные линии или ценовую метку то у меня ни чего не выйдет, и надо будет лепить огород с объектами, а потом огород с их удалением?
Если поставить ObjectsDeleteAll("price") то удаляются все объекты на чарте и даже те которые были нарисованы не индикатором.
Если поставить ObjectsDeleteAll(0,OBJ_ARROW) удаляет все объекты Arrow и даже те которые небыли нарисованы индикатором. Как быть?
Ещё хотел спросить. Если я захочу просто в SetIndexArrow использовать вертикальные, горизонтальные линии или ценовую метку то у меня ни чего не выйдет, и надо будет лепить огород с объектами, а потом огород с их удалением?
Я использую такой приём:
// Переменные
string OName;
int OCnt = 0;
// При создании объекта
OName = "Имя индикатора"+OCnt;
ObjectCreate(OName,...);
OCnt++;
// В deinit()
for (int i=0;i<OCnt;i++) {
OName = "Имя индикатора"+i;
ObjectDelete(OName);
}
удалять тоже надо в цикле, имена в приведенном мною примере не просто price, а ="price"+Time[cb], т.е. у каждого объекта уникальное
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
как сделать так чтобы вместо линий или значений индикаторов была цена(вместо символов фрактала - цена )?
Допустим МА рисует продолжение линии, линию можно заменить знаками, а как сделать чтобы это была цена? и МА рисовал не линию а ставил цену над баром?