MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 977

 
Alexey Viktorov :

본격적인 조언을 위해서만 처음부터 읽기를 시작하는 것이 좋습니다. 거기에서 첫 번째 질문과 더 나아가 모든 토론이 있었습니다.

 
Kamilzhan :

글쎄, 완전한 대답을 위해서는 네 번이 아니라 한 번으로 충분하다.


ALL, 절대적으로 MT4의 모든 색상 표시기 는 현재 값이 이전 막대의 값보다 크면 버퍼 중 하나가 채워지는 방식으로 구축됩니다. 그리고 현재 값이 이전 막대의 값보다 작으면 다른 버퍼가 채워집니다. 그리고 표시 유형은 별로 중요하지 않습니다. 선, 히스토그램 또는 별표\점...

 

차트의 두 스크린샷을 텔레그램으로 보내는 완전히 작동하는 어드바이저가 있습니다. 첫 번째 스크린샷은 터미널의 열린 창에서, 두 번째 스크린샷은 동일한 도구를 사용하지만 다른 시간 프레임으로,

이를 위해 새 창이 열리고 템플릿이 적용 되고 화면이 촬영되고 창이 삭제됩니다. 하지만 두 번째 화면이 있는 이 구성표가 항상 안정적으로 작동하는 것은 아니므로 열리지 않는 항목을 변경하고 싶습니다.

새 창에서 계속 같은 창을 사용하고 원하는 도구만 교체하면 코드에서 이를 수정하는 데 도움이 됩니다.


 //+------------------------------------------------------------------+
//|                                                          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의 프로필에서 데이터를 추출하는 방법은 무엇입니까?

추신. 프로필 폴더를 살펴보니 도구 폴더에 확장자가 "chr"인 파일이 있습니다. 나는 그것을 메모장으로 열어 필요한 모든 정보를 보았습니다. 이렇게 사용하면 어떨까요???

 
안녕하세요. 저는 초보자이고 프로그래밍을 이해하지 못합니다. MT5용 Parabolic SAR 표시기 가 점이 아니라 선으로 표시되어야 합니다. 어떻게 해야 하나요? 도와주세요, 제발 .
 
valeriikopp :
안녕하세요. 저는 초보자이고 프로그래밍을 이해하지 못합니다. MT5용 Parabolic 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 :

이름은 각 줄의 원래 이름이어야 합니다.

당신은 모두에게 하나의 이름을 가지고 있습니다

생성 시간을 이름에 추가할 수 있습니다.

매우 감사합니다!

사유: