新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 977

 
Alexey Viktorov:

建议从头开始阅读,以获得好的建议。从第一个问题的位置和其余的讨论。

 
Kamilzhan:

好吧,对于一个完整的答案,只需回答一次,而不是四次。


所有的,绝对是所有的彩色指标,在MT4中都是这样构建的:如果当前值大于前一栏的值,那么其中一个缓冲区就被填满。如果当前值低于前一个条形图上的值,则将填充另一个缓冲区。而显示的类型,线条、直方图或星号/点,并不重要......

 

有一个完全工作的EA,可以向telegram发送两张图表的截图,第一张截图来自终端中打开的窗口,第二张来自同一工具,但时间框架不同。

要做到这一点,需要打开一个新的窗口,应用一个模板,拍摄一张屏幕截图,然后删除该窗口。但这种带有第二张截图的方案并不总是稳定的。

我想把它改成不打开新窗口,并一直使用相同的,但替换成所需的工具,帮助在代码中调整它。


//+------------------------------------------------------------------+
//|                                                          777.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Telegram.mqh>
string Token="7417:AAH54X9HyFIbecqq1U1-R18tU";
int ChannelID=33722;
CCustomBot bot;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct TSignalInfo
  {
   string            symbol;
   ENUM_TIMEFRAMES   timeframe;
   datetime          time_last;
   //---   
   static datetime GetMinute()
     {
      MqlDateTime dt;
      TimeCurrent(dt);
      dt.sec=0;
      return(StructToTime(dt));
     }
  };
TSignalInfo signal[];
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool SignalIsAllowed(const string _symbol,
                     const ENUM_TIMEFRAMES _timeframe)
  {
//--- find
   int total=ArraySize(signal);
   for(int i=0;i<total;i++)
     {
      if(signal[i].symbol==_symbol && 
         signal[i].timeframe==_timeframe)
        {
         //Print("found");
         if(signal[i].time_last<TSignalInfo::GetMinute())
           {
            signal[i].time_last=TSignalInfo::GetMinute();
            return(true);
           }
         
         return(false);
        }
     }

//--- add
   ArrayResize(signal,total+1);
   signal[total].symbol=_symbol;
   signal[total].timeframe = _timeframe;
   signal[total].time_last = TSignalInfo::GetMinute();
   //Print("add");
   return(true);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bot.Token(Token);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id==CHARTEVENT_CUSTOM+234)
     {
      if(!SignalIsAllowed(ChartSymbol(lparam),ChartPeriod(lparam)))
         return;
      //Print("Custom: ",lparam," ",dparam," ",sparam);   
      ChartScreenShot(lparam,"chart.gif");

      //--- первый скриншот
      string _photo_id;
      int err=bot.SendPhoto(_photo_id,ChannelID,"chart.gif",sparam);
      ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam));

      if(ChartPeriod(lparam)!=PERIOD_H4)
        {
         string _symbol=ChartSymbol(lparam);
         ChartScreenShot(_symbol,PERIOD_H4,"chart.gif","BollingerBands");
         string _photo_id2;
         int err2=bot.SendPhoto(_photo_id2,ChannelID,"chart.gif",sparam);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ChartScreenShot(long chart_id,const string file_name)
  {
//--- создать скриншот
   const int chart_width=1280;
   const int chart_height=623;

   FileDelete(file_name);
//---
   if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT))
     {
      //---
      ChartRedraw(chart_id);
      Sleep(500);
      //--- waitng 30 sec for save screenshot
      int wait=30;
      while(!FileIsExist(file_name) && --wait>0)
        {
         printf("Waiting %d sec ...",wait);
         Sleep(1000);
         ChartRedraw(chart_id);
        }

      //--- check file
      if(!FileIsExist(file_name))
         printf("Failed to create a screenshot '%s'.",file_name);
     }
   else
     {
      Print("ChartScreenShot error ",_LastError);
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ChartScreenShot(const string _symbol,
                     const ENUM_TIMEFRAMES _tf,
                     const string file_name,
                     const string _template)
  {

//---
   long chart_id=ChartOpen(_symbol,_tf);
   ChartRedraw(chart_id);
   Sleep(155);
//---     
   if(StringLen(_template)>0)
      if(!ChartApplyTemplate(chart_id,_template))
         Print("Apply Template error: ",_LastError);

//--- создать скриншот
   const int chart_width=1280;
   const int chart_height=623;

   FileDelete(file_name);
//---
   if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT))
     {
      //---
      ChartRedraw(chart_id);
      Sleep(500);

      //--- waitng 30 sec for save screenshot
      int wait=30;
      while(!FileIsExist(file_name) && --wait>0)
        {
         printf("Waiting %d sec ...",wait);
         Sleep(1000);
         ChartRedraw(chart_id);
        }

      //--- check file
      if(!FileIsExist(file_name))
         printf("Failed to create a screenshot '%s'.",file_name);
     }
   else
     {
      Print("ChartScreenShot error ",_LastError);
      ChartClose(chart_id);
      return(false);
     }

   ChartClose(chart_id);
   return(true);
  }
//+------------------------------------------------------------------+ 
 
Alexey Viktorov:

如果当前值比前一个值高,那么它是绿色的,缓冲区是不同的,在mql4,如果相反,那么...反之亦然。))))

谢谢你,这一切都很有意义。

 

大家好。我交易50种工具。我交易水平。我已经用配置文件设置了我的工作,以避免打开50张图表和加载终端。我想写一个助手,它将使用我在所有符号上手绘的水平,并在屏幕上给我一个信号,如 "看欧元-美元,那里正在形成有趣的东西"。 我想我应该写一个DLL,其中所有级别的所有符号将被复制,机器人应该是多货币的。

谁知道如何执行这项任务?

如何从dll中的配置文件中提取数据?

PS。在工具文件夹中看了看,有扩展名为 "chr "的文件。打开记事本,看到我需要的所有信息。我怎样才能以这种方式使用它?

 
下午好,我是一个初学者,不擅长编程,我需要MT5的抛物线 SAR指标 显示为一条线,而不是点,我该怎么做?请帮助我。
 
valeriikopp:
下午好,我是一个初学者,不擅长编程,我需要MT5的抛物线SAR指标显示为一条线,而不是点,我该怎么做?请帮助我。

+

附加的文件:
 

你好,我想写一个脚本,在一系列高点不断增加的4个柱子之后,在整个图表上画出垂直线。脚本最后只在开始时画了一条线,就这样了。错误是什么?请帮助我纠正它。

void OnStart()
 {
double bbup0,
       bbup1,
       bbup2,
       bbup3;
       int a=0;
for(;a<Bars;a++)
{
bbup0=High[a];
bbup1=High[a+1];
bbup2=High[a+2];
bbup3=High[a+3];

if((bbup0<bbup1)&&(bbup1<bbup2)&&(bbup2<bbup3)) 
ObjectCreate(0,"Line",OBJ_VLINE,0,Time[a],0);
 } 
}
 
pvba:

你好,我想写一个脚本,在一系列高点不断增加的4个柱子之后,在整个图表上画出垂直线。脚本最后只在开始时画了一条线,就这样了。错误是什么?请帮助我纠正它。

每一行的名字都必须是原创的

你有一个名字可以代表所有的人。

你可以把它的创建时间添加到名称中。

 
Iurii Tokman:

每一行的名称必须是原创的

你有一个名字为所有的人

你可以将其创建的时间添加到名称中。

非常感谢您!

原因: