Можно простенький пример. Допустим в индикаторе 'фрактал' вместо фракталов или рядом цена(опен или хай не важно). Не особо силен в 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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
как сделать так чтобы вместо линий или значений индикаторов была цена(вместо символов фрактала - цена )?
Допустим МА рисует продолжение линии, линию можно заменить знаками, а как сделать чтобы это была цена? и МА рисовал не линию а ставил цену над баром?