Скачать MetaTrader 5

Как над барами получить цену...

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114297
Forex Trader  
Как допустим вместо точек от параболика получить цену над барами или
как сделать так чтобы вместо линий или значений индикаторов была цена(вместо символов фрактала - цена )?
Допустим МА рисует продолжение линии, линию можно заменить знаками, а как сделать чтобы это была цена? и МА рисовал не линию а ставил цену над баром?
Forex Trader
114297
Forex Trader  
если я правильно понял, то поиск в хелпе метаэдитора по кейвордам
ObjectCreate()
OBJ_TEXT
OBJ_ARROW
OBJ_LABEL
SYMBOL_LEFTPRICE
SYMBOL_RIGHTPRICE
Коды стрелок
Forex Trader
114297
Forex Trader  
Можно простенький пример. Допустим в индикаторе 'фрактал' вместо фракталов или рядом цена(опен или хай не важно). Не особо силен в mql4. :)
Forex Trader
114297
Forex Trader  
ну если грубо, учти, я не обращал внимание на поиск окна где рисовать, удалить объекты при удалении индикатора и прочие тонкости (выделил добавленные фрагменты, для фракталов открытого кода под рукой не оказалось поэтому на параболике)
//+------------------------------------------------------------------+
//|                                                    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);
}
//=====================================================================================================================================================
//---- конец добавки


Forex Trader
114297
Forex Trader  
Спасибо :)
Forex Trader
114297
Forex Trader  
имей в виду, большое количество объектов использует много машинных ресурсов, это может привести к замедлению работы, подвисанию и сбоям.
Forex Trader
114297
Forex Trader  
Проблема с удаление объектов. ObjectDelete("price") походу удаляет только один объект.
Если поставить ObjectsDeleteAll("price") то удаляются все объекты на чарте и даже те которые были нарисованы не индикатором.
Если поставить ObjectsDeleteAll(0,OBJ_ARROW) удаляет все объекты Arrow и даже те которые небыли нарисованы индикатором. Как быть?

Ещё хотел спросить. Если я захочу просто в SetIndexArrow использовать вертикальные, горизонтальные линии или ценовую метку то у меня ни чего не выйдет, и надо будет лепить огород с объектами, а потом огород с их удалением?
Forex Trader
114297
Forex Trader  
Я использую такой приём:
// Переменные
               string OName;
               int OCnt = 0;
// При создании объекта
                OName = "Имя индикатора"+OCnt;
                ObjectCreate(OName,...);
                OCnt++;
// В deinit()
  for (int i=0;i<OCnt;i++) {
    OName = "Имя индикатора"+i;
    ObjectDelete(OName);  
  }
Forex Trader
114297
Forex Trader  
удалять тоже надо в цикле, имена в приведенном мною примере не просто price, а ="price"+Time[cb], т.е. у каждого объекта уникальное
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий