초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 173

 

나는 매일 이 사회에서 훨씬 더 많은 표현과 부정적인 것을 보고 있고 아무도 반응하지 않습니다.

자, 질문이 끝났습니다.

 
Nikolai Semko :

자신만의 키보드 및 키보드 컨트롤(CHART_MOUSE_SCROLL, CHART_KEYBOARD_CONTROL ...)을 생성하려면 비활성화해야 합니다.
하지만 불가능합니다.
그러나 BE의 그러한 인터페이스의 속도는 IT가 비동기 기능을 사용할 수 없기 때문에 기본 인터페이스보다 훨씬 높습니다. 매우 금지된 ChartGetInteger

다시 한 번 감사합니다, 니콜라이. CanvasBar.mq5를 mt4로 변환하고 너비/색상/...에 관한 몇 가지 입력 옵션을 추가했습니다(예: "닌자 트레이더 양초 스타일 모방"에 사용할 수 있음).

파일:
CanvasBar.png  7 kb
CanvasBar.mq4  12 kb
 

안녕하세요! 표준 iEnvelopes 표시기 가 있습니다!
내가 원하는 방식으로 작동하게 할 수 없습니다!
즉, 양초가 현재 UP 양초의 선에 닿거나 지나갈 때 BUY가 열리고 양초가 현재 DOWN 양초의 선에 닿거나 교차한 다음 SELL이 열리는 것이 필요합니다 ..... 그리고 이것은 한 번 발생합니다. (신호가 작동하고 다른 모든 것이 신호가 작동하며 모든 것이 영구적입니다)!

Inv_0_1 = iEnvelopes ( _Symbol , time2_method, envel, envel_method, envelshag, envel_Price, envelproc, MODE_UPPER , 0 ); 
    Inv_0_11 = iEnvelopes ( _Symbol , time2_method, envel, envel_method, envelshag, envel_Price, envelproc, MODE_UPPER , 1 ); 
     
    Inv_0_2 = iEnvelopes ( _Symbol , time2_method, envel, envel_method, envelshag, envel_Price, envelproc, MODE_LOWER , 0 ); 
    Inv_0_21 = iEnvelopes ( _Symbol , time2_method, envel, envel_method, envelshag, envel_Price, envelproc, MODE_LOWER , 1 ); 

     if ( High [ 0 ] > Inv_0_2 && High [ 0 ] < Inv_0_21) 
      { 
      TP = NormalizeDouble ( Bid - tpt * _Point , _Digits ); 
         ticketZK = OpenOrder( _Symbol , OP_SELL , lot, Bid , slippage, 0 , TP, comment, Magic, 0 , clrRed ); 
         if (ticketZK > 0 ) 
         Print ( "Ордер на SELL успешно открыт! " ); 
         return ; 
      }  
     
       
     if ( Low [ 0 ] < Inv_0_1 && Low [ 0 ] > Inv_0_11) 
      { 
      TP = NormalizeDouble ( Ask + tpt * _Point , _Digits ); 
         ticketZK = OpenOrder( _Symbol , OP_BUY , lot, Ask , slippage, 0 , TP, comment, Magic, 0 , clrBlue ); 
         if (ticketZK > 0 ) 
         Print ( "Ордер на BUY успешно открыт! " ); 
         return ; 
      }

도와주세요!

 
ponochka :

안녕하세요! 표준iEnvelopes 표시기 가 있습니다!
내가 원하는 방식으로 작동하게 할 수 없습니다!
즉, 양초가 현재 UP 양초의 선에 닿거나 지나갈 때 BUY가 열리고 양초가 현재 DOWN 양초의 선에 닿거나 교차한 다음 SELL이 열리는 것이 필요합니다 ..... 그리고 이것은 한 번 발생합니다. (신호가 작동하고 다른 모든 것이 신호가 작동하며 모든 것이 영구적입니다)!

도와주세요!

코드에 프로세스에 대한 이해를 추가해야 합니다 :-)

촛불이 닫힐 때까지 High[0]은 커질 수만 있고 Low[0]은 감소할 수 있으며 디컴파일된 봉투는 원하는 대로 작동합니다 :-)

봉투를 공개 가격에서 가져오지 않으면 닫히지 않은 막대를 볼 수 없습니다.

 
Maxim Kuznetsov :

코드에 프로세스에 대한 이해를 추가해야 합니다 :-)

촛불이 닫힐 때까지 High[0]은 커질 수만 있고 Low[0]은 감소할 수 있으며 디컴파일된 봉투는 원하는 대로 작동합니다 :-)

봉투를 공개 가격에서 가져오지 않으면 닫히지 않은 막대를 볼 수 없습니다.

즉, 열기 및 닫기로 작업하는 것이 더 낫습니까? 수표는 무엇입니까?
 

배열에서 MA를 계산하는 방법을 알아내도록 도와주세요.

나는 오픈 클로즈로 MA를 구축하지만 그래프로 판단하면 오른쪽에서 왼쪽으로 계산되는 것처럼 보입니다.

iMAOnArray 및 SimpleMAOnBuffer를 도구로 사용했는데 더 나은 옵션이 있습니까?


 //+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots    2
//--- plot OC
#property indicator_label1    "OC"
#property indicator_type1    DRAW_COLOR_HISTOGRAM
#property indicator_color1    clrSteelBlue , clrRed , clrGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

#property indicator_label2    "MA1"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBrown
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1


//--- indicator buffers
double    OC[], OC_color[], MA1_buf[];
input int MA1= 2 ;

int OnInit ()
  {
  
   IndicatorSetString ( INDICATOR_SHORTNAME , "t1" );
   
   SetIndexBuffer ( 0 ,OC, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,OC_color, INDICATOR_COLOR_INDEX );
   
   SetIndexBuffer ( 2 , MA1_buf, INDICATOR_DATA ); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total- 1 ;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       // необходимые действия по расчёту индикатора
     
     OC[i]= fmax (open[i],close[i])- fmin (open[i],close[i]);
     if (OC[i]> 0.001 )
      {   OC_color[i]= 1 ;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated, 0 ,MA1,OC,MA1_buf);

//--- return value of prev_calculated for next call
   return (rates_total);
  }
 

여보세요!!! 이 코드를 사용하여 링크를 주석으로 번역하지만 체계적으로 하루에 한 번 오류가 발생합니다. 웹 오류 5203(ERR_WEBREQUEST_REQUEST_FAILED. HTTP 요청의 결과로 오류가 발생했습니다)

스레드가 이것을 고칠 수 있습니까?

 string Web( string url)
{
string headers, ret;
char post[], result[];
int res, timeout= 5000 ;
res= WebRequest ( "GET" ,url, NULL ,timeout,post,result,head ers);
if (d3 != 1 && res < 0 )
{
MessageBox ( "4060 Добавите ссылку в доверенную зону (Сервис-Настройки-Советники-Разрешить URL)" , "Внимание" , MB_OK );
Print ( "Web-Error: " , GetLastError (), " (4060 Добавите ссылку в доверенную зону (Сервис-Настройки-Советники-Разрешить URL" );
ExpertRemove ();
d3 = 1 ;
return ( "" );
}
ret = CharArrayToString (result, 0 , - 1 );
return (ret);
}
 

신호에 대한 가중치 계수를 만드는 방법을 알려주시겠습니까?

예를 들어, 플랫에 대한 세 가지 신호가 있습니다. 크로스오버, 비교 1(이전 막대가 있는 플라잉 바) 및 비교 2(이전 TF의 이전 막대 및 이전)입니다.

MT에 통합된 MACD 어드바이저의 예를 사용하여 이것을 엉터리로 만들려고 하는데 어드바이저가 거래를 열지 않습니다. 잡지가 비어 있습니다. 즉, 표준 Expert Advisor의 기초는 건드리지 않고 거래를 여는 논리만 변경되었습니다. 따라서 줄임표는 MT-shny MACD-EA(일반)의 기본입니다.

멍청한 코드를 맹신하지 마세요. 저는 프로그래머가 아닙니다.


...
Вводимые параметры

input double TradeLevel_BUY = 1;

input double TradeLevel_SELL = -1;


input double w_S_MA_1 = 1;

input double w_S_MA_2 = 1;

input double w_S_MA_3 = 1;

input double w_S_MA_4 = 1;

input double w_S_MA_5 = 1;

input double w_S_MA_6 = 1;


...

----------------

...

void OnTick(void)

  {

   

   double MA_Fast_1,

          MA_Fast_2,

          MA_Slow_1,

          MA_Slow_2,

          MA_Fast_LargeTF_1,

          MA_Fast_LargeTF_2,

          MA_Slow_LargeTF_1,

          MA_Slow_LargeTF_2;

double S_MA_1,

       S_MA_2,

       S_MA_3,

...

   MA_Fast_1=iMA(NULL,0,MA_Fast_1_Period,MA_Fast_1_Shift,MODE_EMA,PRICE_CLOSE,1);
   MA_Fast_2=iMA(NULL,0,MA_Fast_2_Period,MA_Fast_2_Shift,MODE_EMA,PRICE_CLOSE,2);
   MA_Fast_LargeTF_1=iMA(NULL,MA_LargeTF,MA_Fast_LargeTF_1_Period,MA_Fast_LargeTF_1_Shift,MODE_EMA,PRICE_CLOSE,1);
   MA_Fast_LargeTF_2=iMA(NULL,MA_LargeTF,MA_Fast_LargeTF_2_Period,MA_Fast_LargeTF_2_Shift,MODE_EMA,PRICE_CLOSE,2);
   MA_Slow_1=iMA(NULL,0,MA_Slow_1_Period,MA_Slow_1_Shift,MODE_EMA,PRICE_CLOSE,1);
   MA_Slow_2=iMA(NULL,0,MA_Slow_2_Period,MA_Slow_2_Shift,MODE_EMA,PRICE_CLOSE,2);
   MA_Slow_LargeTF_1=iMA(NULL,0,MA_Slow_LargeTF_1_Period,MA_Slow_LargeTF_1_Shift,MODE_EMA,PRICE_CLOSE,1);

   MA_Slow_LargeTF_2=iMA(NULL,0,MA_Slow_LargeTF_2_Period,MA_Slow_LargeTF_2_Shift,MODE_EMA,PRICE_CLOSE,2);

...

 double Sum;

if (MA_Fast_1>MA_Slow_1)

      {

        S_MA_1=1*w_S_MA_1;

      }

   else

      {

        S_MA_1=0;

      }

   return;

   

   if (MA_Fast_1>MA_Fast_2)

      {

        S_MA_2=1*w_S_MA_2;

      }

   else

      {

        S_MA_2=0;

      }

   return;

   

   if (Open[1]<MA_Fast_LargeTF_1 && Close[1]>MA_Fast_LargeTF_1 || Open[1]>MA_Fast_LargeTF_1 && Close[1]>MA_Fast_LargeTF_1)

      {

        S_MA_3=1*w_S_MA_3;

      }

   else

      {

        S_MA_3=0;

      }

   return;

...

 if (MA_Fast_1<MA_Slow_1)

      {

        S_MA_4=-1*w_S_MA_4;

      }

   else

      {

        S_MA_4=0;

      }

   return;

   

   if (MA_Fast_1<MA_Fast_2)

      {

        S_MA_5=-1*w_S_MA_5;

      }

   else

      {

        S_MA_5=0;

      }

   return;

   

   if (Open[1]>MA_Fast_LargeTF_1 && Close[1]<MA_Fast_LargeTF_1 || Open[1]<MA_Fast_LargeTF_1 && Close[1]<MA_Fast_LargeTF_1)

      {

        S_MA_6=-1*w_S_MA_6;

      }

   else

      {

        S_MA_6=0;

      }

   return;


   Sum=S_MA_1+S_MA_2+S_MA_3+S_MA_4+S_MA_5+S_MA_6;

...

 if(Sum>TradeLevel_BUY)

        {

         ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-SL*Point,Bid+TP*Point,"Optim",16384,0,Blue);

...


 if(Sum<=TradeLevel_SELL)

        {

         ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+SL*Point,Ask-TP*Point,"Optim",16384,0,Red);

         if(ticket>0)

 

안녕하세요! 그러한 기능을 올바르게 구현하는 방법(내가 하고 싶은 일을 이해할 것이라고 생각합니다)?

         if (IsTesting())
             for ( int i2= 0 ; i2<fixweekBars; i2++)
               else
             for ( int i2=fixweekBars; i2> 0 ; i2--)
 

안녕하세요. winApi user32.dll에 도움이 필요합니다.

프로필에 하나의 차트가 있습니다. Chatr를 두 개 더 열려면 스크립트가 필요합니다. 3개 모두 차트(1개, 2개 더 열림)를 지정 크기로 지정 위치에 만듭니다.

아무리 노력해도 다 똑같습니다.

이 스크립트는 내가 던지는 차트의 크기와 위치를 변경합니다.

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

#import "user32.dll"

int  SetWindowPos(int hWnd,int hWndInsertAfter,int X,int Y,int cx,int cy,int uFlags);
int  GetParent(int hWnd);
int  GetTopWindow(int hWnd);
int  GetWindow(int hWnd,int wCmd);
int  GetWindowDC(int h);
int  ShowWindow(int hWnd,int nCmdShow);
#import 

#define GW_HWNDNEXT        0x0002
#define SWP_NOSIZE         0x0001
#define SWP_NOMOVE         0x0002
#define SWP_NOZORDER       0x0004
#define SW_RESTORE 9
#define SWP_FRAMECHANGED   0x0020

int     gr2x1_P1  []    = {PERIOD_H4,PERIOD_D1,PERIOD_W1};        // Period of grafic 1 of 2x1
int     CXShift2x1[]    = {0,0,1040};             // Horizontal shift of grafic 1 of 2x1
int     CYShift2x1[]    = {0,268,0};           // Vertical shift of grafic 1 of 2x1
int     CXSize2x1 []    = {1040,1040,880};           // Width of grafic 1 of 2x1
int     CYSize2x1 []    = {500,500,1000};           // Height of grafic 1 of 2x1

input int xy = 0;//xy 0-2
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
   void OnStart()
  {

   int i,handle;
   int parent;

   handle=(int)ChartGetInteger(0,CHART_WINDOW_HANDLE);Print("ChartGetInteger(0,CHART_WINDOW_HANDLE)   ",handle); //возвращает дескриптор 2688738                                                                                                                   
   parent=GetParent(handle);Print("parent_0   ",parent);                                         //возвращает дескриптор 197188
   ShowWindow(parent,SW_RESTORE);

  
      i=xy;
      SetWindowPos(parent,0,CXShift2x1[i],CYShift2x1[i],CXSize2x1[i],CYSize2x1[i],0);
      //Sleep(5000);
  }
//+------------------------------------------------------------------+
Открыть Новые дополнительные Chart-ы 
Но как дальше изменить размер дополнительных Chart-ов, ни как не получается. 

int i;
   for (i= 0 ; i< 3 ; i++)
     {
     long h= ChartOpen ( "EURUSD" ,gr2x1_P1[i]);
     }