Пожалуйста, подскажите, как сделать следующее.

 

На графике запускаем индикатор, он наносит свои сигналы на график. Как сделать так, что бы при сохранении шаблона и отправки его другу без индикатора, друг мог увидеть все сигналы на графике нужного инструмента.

 
Izzatilla Ikramov:

На графике запускаем индикатор, он наносит свои сигналы на график. Как сделать так, что бы при сохранении шаблона и отправки его другу без индикатора, друг мог увидеть все сигналы на графике нужного инструмента.

Нужно чтобы при удалении индикатора с графика остались сигналы. Такой шаблон при сохранении запомнит разметку.
 
new-rena:
Нужно чтобы при удалении индикатора с графика остались сигналы. Такой шаблон при сохранении запомнит разметку.
Какие команды могут удалять сигналы с графика?
 
Izzatilla Ikramov:
Какие команды могут удалять сигналы с графика?
А что такое сигнал (в Вашем конкретном случае)? Если это графический объект - то можно смело сохранять шаблон - вся графика сохраниться в шаблоне.
 
Izzatilla Ikramov:
Какие команды могут удалять сигналы с графика?
в OnDeinit() (МТ4 - в deinit()) команда ObjectsDeleteAll(). Попробуйте закомментировать эту команду и затем удалить индикатор с графика. Разметка должна сохраниться в шаблоне
 
Не получается, посмотрите пожалуйста код
//+------------------------------------------------------------------+
//|                                                   izaSignals.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window

enum eSignalType { Panel, Chart };

input eSignalType signalType     = Chart;                                        //Signal type
input string      PanelSettings  = "=========================================="; //Panel Settings
input int         SignalDayQty   = 3;                                            //Signal days qty
input bool        ShowValue      = false;                                         //Show values
input string      ChartSettings  = "=========================================="; //Chart Settings
input string      symbol         = "";                                           //Signal symbol
input bool        showValue      = false;                                         //Show values
input bool        useEMAFilter   = false;                                         //Use EMA filter

string url        = "http://192.168.1.1/generate.php?";   //
string obj_prefix = "iza_";
long cID=0;
datetime ud=0;

struct sRow
{
   string   symbol;
   datetime date;
   string   signal;
   double   value;
};

int OnInit()
{
   if(TimeCurrent()>D'30.09.2017') { Alert(""); return(INIT_FAILED); }
   return(INIT_SUCCEEDED);
    ChartSetInteger(0,CHART_FOREGROUND,false);
  
   ud=0;
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   if(!IsTesting()) ObjectsDeleteAll(0,obj_prefix);
   Comment("");
   ud=0;
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   if(_Period<PERIOD_D1 && rates_total==prev_calculated) return(rates_total);
   if(ud==iTime(_Symbol,PERIOD_H4,0)) return(rates_total);

   bool res;
   sRow row[];
   string _symbol,text;

   if(signalType==Panel)
   {
      MqlDateTime sd,ed;
      TimeToStruct(TimeCurrent()-SignalDayQty*PERIOD_D1*60,sd);
      string start_date=IntegerToString(sd.day)+"."+IntegerToString(sd.mon)+"."+IntegerToString(sd.year);
      TimeToStruct(TimeCurrent(),ed);
      string end_date=IntegerToString(ed.day)+"."+IntegerToString(ed.mon)+"."+IntegerToString(ed.year);
      
      string request_url = url+"start_date="+start_date+"&"+ "end_date="+end_date; //Print(request_url);
      
      res = GrabWeb(request_url,text);
      //Print("L: ",StringLen(text));
      //Print("text:",StringTrimLeft(text));

      if(res)
      {
         Comment("");
         convertResult(text,row);
         drawTable(row);
         ud=iTime(_Symbol,PERIOD_H4,0);
         setLabel(obj_prefix,"lblUpdateTime",10,15,clrGray,"Last time update: "+TimeToString(TimeCurrent()),8,CORNER_LEFT_LOWER);
      }  
   }
   else
   {
      MqlDateTime sd,ed;
      TimeToStruct(ud-PERIOD_D1*3*60,sd);
      string start_date=IntegerToString(sd.day)+"."+IntegerToString(sd.mon)+"."+IntegerToString(sd.year);
      TimeToStruct(TimeCurrent()+PERIOD_D1*60,ed);
      string end_date=IntegerToString(ed.day)+"."+IntegerToString(ed.mon)+"."+IntegerToString(ed.year);
      
      if(symbol=="") _symbol=_Symbol; else _symbol=symbol;
      string request_url = url+"start_date="+start_date+"&"+ "end_date="+end_date+"&symbol="+_symbol; //Print(request_url);
                          
      res = GrabWeb(request_url,text);
      //Print("L: ",StringLen(text));
      //Print("text:",StringTrimLeft(text));
              
      if(res)
      {
         Comment("");
         convertResult(text,row);
         drawSignals(row);
         ud=iTime(_Symbol,PERIOD_H4,0);
         setLabel(obj_prefix,"lblUpdateTime",10,15,clrGray,"Last time update: "+TimeToString(TimeCurrent()),8,CORNER_LEFT_LOWER);
      }
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
bool convertResult(string in, sRow& rowout[])
{
   string out[], row[], t="";
   int l;
  
   StringReplace(in,"\n","");
   StringReplace(in,"<table>","");
   StringReplace(in,"</table>","");
   StringReplace(in,"<tbody>","");
   StringReplace(in,"</tbody>","");
   StringReplace(in,"<td>","");
   StringReplace(in,"</td>","|");
   StringReplace(in,"<tr>","");
   StringReplace(in,"</tr>",";");
      
   StringSplit(in,StringGetCharacter(";",0),out);
  
   for(int i=0;i<ArraySize(out);i++)
   {
      StringTrimLeft(out[i]);
      StringTrimRight(out[i]);
      //Print(out[i]);  

      StringSplit(out[i],StringGetCharacter("|",0),row);
      
      if(ArraySize(row)>=4)
      {
         l = ArraySize(rowout);
         ArrayResize(rowout,l+1);
         StringReplace(row[0],"/","");
         rowout[l].symbol=row[0]; //Print(row[0]," ",rowout[l].symbol);
         rowout[l].date=StringToTime(row[1]); //Print(row[1]," ",rowout[l].date);
         rowout[l].signal=row[2];
         StringReplace(row[3],",",".");
         rowout[l].value=StringToDouble(row[3]);
      }
   }
      
   return(true);
}

void drawSignals(sRow& rowin[])
{
   ObjectSetString(0,obj_prefix+"lblNextDaySignal",OBJPROP_TEXT,CharToString(32));
  
   string t;
   int ind;
   double ema13,ema26;
  
   for(int i=0;i<ArraySize(rowin);i++)
   {
      if((symbol=="" && rowin[i].symbol==_Symbol) || (symbol!="" && rowin[i].symbol==symbol))
      {
         if(rowin[i].signal=="long")
         {
            t="long signal ";
            ind=iBarShift(_Symbol,_Period,rowin[i].date);
            if(showValue) t+="("+DoubleToString(rowin[i].value,2)+")";

            ema13 = iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_OPEN,ind);
            ema26 = iMA(_Symbol,_Period,26,0,MODE_EMA,PRICE_OPEN,ind);
            
            if((useEMAFilter && ema13>ema26) || !useEMAFilter)
            {
               if(rowin[i].date<=Time[0])
               {
                  setText(obj_prefix,"sgn_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],Low[ind],clrGreen,t+"       ",8,90,ANCHOR_RIGHT);
                  setArrowUp(obj_prefix+"arr_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],Low[ind],clrGreen,1);
               }
               else
               {
                  setLabel(obj_prefix,"lblNextDaySignal",10,30,clrGreen,"Last Signal for: "+TimeToString(rowin[i].date,TIME_DATE)+" "+t,8,CORNER_LEFT_LOWER);
               }  
            }
            else
            {
               if(rowin[i].date<=Time[0])
               {
                  setText(obj_prefix,"sgn_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],Low[ind],clrGray,t+"       ",8,90,ANCHOR_RIGHT);
               }
               else
               {
                  setLabel(obj_prefix,"lblNextDaySignal",10,30,clrGreen,"Last Signal for: "+TimeToString(rowin[i].date,TIME_DATE)+" "+t,8,CORNER_LEFT_LOWER);
               }  
            }  
         }
         if(rowin[i].signal=="short")
         {
            t="short signal ";
            ind=iBarShift(_Symbol,_Period,rowin[i].date);
            if(showValue) t+=" ("+DoubleToString(rowin[i].value,2)+")";

            ema13 = iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_OPEN,ind);
            ema26 = iMA(_Symbol,_Period,26,0,MODE_EMA,PRICE_OPEN,ind);
            
            if((useEMAFilter && ema13<ema26) || !useEMAFilter)
            {
               if(rowin[i].date<=Time[0])
               {
                  setText(obj_prefix,"sgn_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],High[ind],clrRed,"       "+t,8,90,ANCHOR_LEFT);
                  setArrowDn(obj_prefix+"arr_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],High[ind],clrRed,1);
               }
               else
               {
                  setLabel(obj_prefix,"lblNextDaySignal",10,30,clrRed,"Last Signal for: "+TimeToString(rowin[i].date,TIME_DATE)+" "+t,8,CORNER_LEFT_LOWER);
               }                  
            }
            else
            {
               if(rowin[i].date<=Time[0])
               {
                  setText(obj_prefix,"sgn_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],High[ind],clrGray,"       "+t,8,90,ANCHOR_LEFT);
               }
               else
               {
                  setLabel(obj_prefix,"lblNextDaySignal",10,30,clrRed,"Last Signal for: "+TimeToString(rowin[i].date,TIME_DATE)+" "+t,8,CORNER_LEFT_LOWER);
               }                                
            }  
         }
         if(rowin[i].signal=="no")
         {
            t="no signal";
            ind=iBarShift(_Symbol,_Period,rowin[i].date);
            if(showValue) t+=" ("+DoubleToString(rowin[i].value,2)+")";
            
            if(rowin[i].date<=Time[0])
            {
               setText(obj_prefix,"sgn_"+TimeToString(rowin[i].date,TIME_DATE),Time[ind],High[ind],clrGray,"       "+t,8,90,ANCHOR_LEFT);
            }
            else
            {
               setLabel(obj_prefix,"lblNextDaySignal",10,30,clrGray,"Last Signal for: "+TimeToString(rowin[i].date,TIME_DATE)+" "+t,8,CORNER_LEFT_LOWER);
            }                                            
         }
      }
   }
}

void drawTable(sRow& rowin[])
{
   ObjectsDeleteAll(0,obj_prefix);
  
   datetime d[];  getDateArray(rowin,d);
   string s[];    getSymbolArray(rowin,s);
   color sgnColor;
  
   int dx=10,dy,stepx=100,stepy=15;
  
   ObjectCreate(0,obj_prefix+"Table",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,obj_prefix+"Table",OBJPROP_XDISTANCE,5);
   ObjectSetInteger(0,obj_prefix+"Table",OBJPROP_YDISTANCE,20);
   ObjectSetInteger(0,obj_prefix+"Table",OBJPROP_XSIZE,stepx*ArraySize(d)+stepx/2*ArraySize(d));
   ObjectSetInteger(0,obj_prefix+"Table",OBJPROP_YSIZE,stepy*(ArraySize(s)+2));
   ObjectSetInteger(0,obj_prefix+"Table",OBJPROP_BGCOLOR,clrDarkBlue);
  
   for(int i=0;i<ArraySize(d);i++)
   {
      dy=30;
      setLabel(obj_prefix,"lbl"+TimeToString(d[i],TIME_DATE),dx+stepx,dy,clrWhite,TimeToString(d[i],TIME_DATE),10,CORNER_LEFT_UPPER);
      dy+=stepy;
      
      for(int j=0;j<ArraySize(s);j++)
      {
         if(i==0) setLabel(obj_prefix,"lbl"+s[j],dx,dy,clrWhite,s[j],10,CORNER_LEFT_UPPER);
         for(int k=0;k<ArraySize(rowin);k++)
         {
            if(rowin[k].date==d[i] && rowin[k].symbol==s[j])
            {
               if(rowin[k].signal=="short") sgnColor=clrRed;
               else if(rowin[k].signal=="long") sgnColor=clrGreen;
               else sgnColor=clrGray;
              
               setLabel(obj_prefix,"sgn"+s[j]+TimeToString(d[i],TIME_DATE),dx+stepx,dy,sgnColor,rowin[k].signal,10,CORNER_LEFT_UPPER);
               if(ShowValue)
                  setLabel(obj_prefix,"val"+s[j]+TimeToString(d[i],TIME_DATE),dx+stepx+stepx-50,dy,sgnColor,DoubleToString(rowin[k].value,2),10,CORNER_LEFT_UPPER);
            }
         }  
         dy+=stepy;
      }
      dx+=stepx;
   }
}

void getSymbolArray(sRow& in[],string& out[])
{
   for(int i=0;i<ArraySize(in);i++)
   {
      int as=ArraySize(out);
      if(as==0)
         { ArrayResize(out,as+1); out[as]=in[i].symbol; }
      else
         { if(!arrayStringExist(out,in[i].symbol)) { ArrayResize(out,as+1); out[as]=in[i].symbol; } }
   }  
}

void getDateArray(sRow& in[],datetime& out[])
{
   for(int i=0;i<ArraySize(in);i++)
   {
      int as=ArraySize(out);
      if(as==0)
         { ArrayResize(out,as+1); out[as]=in[i].date; }
      else
         { if(!arrayDateExist(out,in[i].date)) { ArrayResize(out,as+1); out[as]=in[i].date; } }
   }  
}

bool arrayDateExist(datetime& in[],datetime search)
{
   bool adte = false;  
   for(int i=0;i<ArraySize(in);i++)
      if(in[i]==search) { adte=true; break; }
   return(adte);
}

bool arrayStringExist(string& in[],string search)
{
   bool ase = false;
   for(int i=0;i<ArraySize(in);i++)
      if(in[i]==search) { ase=true; break; }
   return(ase);
}

void setText(string prefix, string name, datetime dt, double p, color c, string text, int fs, double corner, ENUM_ANCHOR_POINT anchor, string fn="Arial")
{
   ObjectCreate(cID,prefix+name,OBJ_TEXT,0,0,0);
   ObjectSetInteger(cID,prefix+name,OBJPROP_TIME,dt);
   ObjectSetDouble(cID,prefix+name,OBJPROP_PRICE,p);
   ObjectSetDouble(cID,prefix+name,OBJPROP_ANGLE,corner);
   ObjectSetInteger(cID,prefix+name,OBJPROP_COLOR,c);
   ObjectSetInteger(cID,prefix+name,OBJPROP_FONTSIZE,fs);
   ObjectSetInteger(cID,prefix+name,OBJPROP_HIDDEN,true);
   ObjectSetInteger(cID,prefix+name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(cID,prefix+name,OBJPROP_ANCHOR,anchor);
   ObjectSetString(cID,prefix+name,OBJPROP_FONT,fn);
   ObjectSetString(cID,prefix+name,OBJPROP_TEXT,text);
}

void setLabel(string prefix, string name, int xd, int yd, color c, string text, int fs, int corner, string fn="Arial")
{
   ObjectCreate(cID,prefix+name,OBJ_LABEL,0,0,0);
   ObjectSetInteger(cID,prefix+name,OBJPROP_CORNER,corner);
   ObjectSetInteger(cID,prefix+name,OBJPROP_XDISTANCE,xd);
   ObjectSetInteger(cID,prefix+name,OBJPROP_YDISTANCE,yd);
   ObjectSetInteger(cID,prefix+name,OBJPROP_COLOR,c);
   ObjectSetInteger(cID,prefix+name,OBJPROP_FONTSIZE,fs);
   ObjectSetInteger(cID,prefix+name,OBJPROP_HIDDEN,true);
   ObjectSetInteger(cID,prefix+name,OBJPROP_SELECTABLE,false);
   ObjectSetString(cID,prefix+name,OBJPROP_FONT,fn);
   ObjectSetString(cID,prefix+name,OBJPROP_TEXT,text);
}

void setArrowUp(string name, datetime t, double p, int c, int w)
{
   ObjectCreate(cID,name,OBJ_ARROW_UP,0,0,0);
   ObjectSetInteger(cID,name,OBJPROP_TIME,t);
   ObjectSetDouble(cID,name,OBJPROP_PRICE,p);  
   ObjectSetInteger(cID,name,OBJPROP_COLOR,c);
   ObjectSetInteger(cID,name,OBJPROP_WIDTH,w);
   ObjectSetInteger(cID,name,OBJPROP_ANCHOR,ANCHOR_RIGHT);
   ObjectSetInteger(cID,name,OBJPROP_HIDDEN,true);
   ObjectSetInteger(cID,name,OBJPROP_SELECTABLE,false);  
}

void setArrowDn(string name, datetime t, double p, int c, int w)
{
   ObjectCreate(cID,name,OBJ_ARROW_DOWN,0,0,0);
   ObjectSetInteger(cID,name,OBJPROP_TIME,t);
   ObjectSetDouble(cID,name,OBJPROP_PRICE,p);  
   ObjectSetInteger(cID,name,OBJPROP_COLOR,c);
   ObjectSetInteger(cID,name,OBJPROP_WIDTH,w);
   ObjectSetInteger(cID,name,OBJPROP_ANCHOR,ANCHOR_LEFT);
   ObjectSetInteger(cID,name,OBJPROP_HIDDEN,true);
   ObjectSetInteger(cID,name,OBJPROP_SELECTABLE,false);      
}

bool bWinInetDebug = true;
int hSession_IEType;
int hSession_Direct;
int Internet_Open_Type_Preconfig = 0;
int Internet_Open_Type_Direct = 1;
int Internet_Open_Type_Proxy = 3;
int Buffer_LEN = 512;

#import "wininet.dll"
int InternetAttemptConnect (int x);
int InternetOpenW(string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0);
int InternetOpenUrlW(int hInternetSession, string sUrl, string sHeaders = "", int lHeadersLength = 0, int lFlags = 0, int lContext = 0);
int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]);
int InternetCloseHandle(int hInet);
#import

bool GrabWeb(string request, string& webpage)
{
   if(!IsDllsAllowed()) { Comment("DLL's are forbidden!"); return(false); }
   int rv = InternetAttemptConnect(0);
  
   if(rv != 0) { Comment("Internet Attempt error!"); return(false); }
  
   int hInternetSession = InternetOpenW("Microsoft Internet Explorer", 0, "", "", 0);
  
   if(hInternetSession <= 0) { Comment("Internet Open error!"); return(0); }
  
   int hURL = InternetOpenUrlW(hInternetSession, request, "", 0, 0, 0);
  
   if(hURL <= 0) { Comment("Internet Open Url error!"); InternetCloseHandle(hInternetSession); return(false); }      
  
   int cBuffer[256];
   int dwBytesRead[1];
   string TXT = "";
  
   while(!IsStopped())
   {
      bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);
      if(dwBytesRead[0] == 0) break;
      string text = "";  
      
      for(int i = 0; i < 256; i++)
      {
         text += CharToStr((uchar)(cBuffer[i] & 0x000000FF));
                if(StringLen(text) == dwBytesRead[0]) break;
           text += CharToStr((uchar)((cBuffer[i] >> 8) & 0x000000FF));
           if(StringLen(text) == dwBytesRead[0]) break;
         text += CharToStr((uchar)((cBuffer[i] >> 16) & 0x000000FF));
         if(StringLen(text) == dwBytesRead[0]) break;
         text += CharToStr((uchar)((cBuffer[i] >> 24) & 0x000000FF));
      }
      TXT += text;
   }
  
   webpage = TXT;
  
   InternetCloseHandle(hInternetSession);
   return(true);
}
 
void OnDeinit(const int reason)
{
   //if(!IsTesting()) ObjectsDeleteAll(0,obj_prefix);
   //Comment("");
   //ud=0;
}
так
 
new-rena:
void OnDeinit(const int reason)
{
   //if(!IsTesting()) ObjectsDeleteAll(0,obj_prefix);
   //Comment("");
   //ud=0;
}
так
так и сделал - сигналы на графике удаляются вместе с индикатором.
 
Izzatilla Ikramov:
так и сделал - сигналы на графике удаляются вместе с индикатором.

Это тоже попробуйте закомментить

void drawTable(sRow& rowin[])
{
   //ObjectsDeleteAll(0,obj_prefix);
  
   datetime d[];  getDateArray(rowin,d);
   string s[];    getSymbolArray(rowin,s);
 
new-rena:

Это тоже попробуйте закомментить

void drawTable(sRow& rowin[])
{
   //ObjectsDeleteAll(0,obj_prefix);
  
   datetime d[];  getDateArray(rowin,d);
   string s[];    getSymbolArray(rowin,s);
Получилось, большое спасибо. Оказывается последнее изменение лишнее.  
 
Izzatilla Ikramov:
Получилось, большое спасибо. Оказывается последнее изменение лишнее.  
Забыли нажать на кнопку "Компилировать"?
Причина обращения: