初学者的问题 MQL4 MT4 MetaTrader 4 - 页 173

 

在这个社区,我每天都会遇到更多的表达和负面情绪,而没有人做出反应。

总之,这个问题就到此为止了。

 
Nikolai Semko :

如果你想创建你自己的键盘和键盘控制(CHART_MOUSE_SCROLL, CHART_KEYBOARD_CONTROL ...),你需要禁用它。
但这是不可能的。
但这样一个接口的速度将明显高于基础接口,因为它不可能使用异步函数。

再次非常感谢你,尼古拉。我试着把你的CanvasBar.mq5转换成mt4,添加了一些关于宽度/颜色/的输入选项。(所以它可以用于例如 "模拟ninjatrader烛台风格")

附加的文件:
CanvasBar.png  7 kb
CanvasBar.mq4  12 kb
 

你好!我有一个 标准的iEnvelopes指标!请问是什么?
我不能让它按我需要的方式工作!我不知道。
即,需要当蜡烛触及或越过当前蜡烛上的线,然后打开BUY,蜡烛触及或越过当前蜡烛下的线,然后打开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!
我不能让它按我想要的方式工作!我不知道。
即,需要当蜡烛触及或越过当前蜡烛上的线,然后打开BUY,蜡烛触及或越过当前蜡烛下的线,然后打开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中的MAKD构建来做,但它没有打开交易。日志中没有任何内容。也就是说,标准的EA基础并没有被触动,只是开仓的逻辑被改变了。因此,这个三联体是MT MAKD-顾问的基础(正常的)

只是不要为努比亚代码发誓,我不是一个程序员


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

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。所有三个图表(是一个,又开了两个)在设定的地方做指定的尺寸。

无论我如何尝试--都没有运气。

这个脚本改变了我投掷的图表的大小和位置。

//+------------------------------------------------------------------+
//|                                                      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]);
     }