Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Izzatilla Ikramov
13214
Izzatilla Ikramov  

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

new-rena
3371
new-rena  
Izzatilla Ikramov:

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

Нужно чтобы при удалении индикатора с графика остались сигналы. Такой шаблон при сохранении запомнит разметку.
Izzatilla Ikramov
13214
Izzatilla Ikramov  
new-rena:
Нужно чтобы при удалении индикатора с графика остались сигналы. Такой шаблон при сохранении запомнит разметку.
Какие команды могут удалять сигналы с графика?
Vladimir Karputov
Модератор
58700
Vladimir Karputov  
Izzatilla Ikramov:
Какие команды могут удалять сигналы с графика?
А что такое сигнал (в Вашем конкретном случае)? Если это графический объект - то можно смело сохранять шаблон - вся графика сохраниться в шаблоне.
new-rena
3371
new-rena  
Izzatilla Ikramov:
Какие команды могут удалять сигналы с графика?
в OnDeinit() (МТ4 - в deinit()) команда ObjectsDeleteAll(). Попробуйте закомментировать эту команду и затем удалить индикатор с графика. Разметка должна сохраниться в шаблоне
Izzatilla Ikramov
13214
Izzatilla Ikramov  
Не получается, посмотрите пожалуйста код
//+------------------------------------------------------------------+
//|                                                   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);
}
new-rena
3371
new-rena  
void OnDeinit(const int reason)
{
   //if(!IsTesting()) ObjectsDeleteAll(0,obj_prefix);
   //Comment("");
   //ud=0;
}
так
Izzatilla Ikramov
13214
Izzatilla Ikramov  
new-rena:
void OnDeinit(const int reason)
{
   //if(!IsTesting()) ObjectsDeleteAll(0,obj_prefix);
   //Comment("");
   //ud=0;
}
так
так и сделал - сигналы на графике удаляются вместе с индикатором.
new-rena
3371
new-rena  
Izzatilla Ikramov:
так и сделал - сигналы на графике удаляются вместе с индикатором.

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

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

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

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