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

 
Alexandr Sokolov:

谢谢你!如果用于商业目的呢?

对于市场的意义是什么?

那么你必须在你自己的图像中建立你自己的GUI库 :-(

MQL并不打算用于复杂的GUI。它是用于计数和交易的。

也就是说,它可以做到,但它是令人痛苦的愚蠢。

 

决定研究CCanvas库


想不明白--没有错误(或者说,编译器没有给出任何错误),而且屏幕上也没有任何东西。我想画一个红色的三角形 ...

#include <Canvas\Canvas.mqh>

#property copyright "Alexandr Sokolov"
#property link      "https://www.mql5.com/en/users/asokolov7"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
CCanvas canvas;
//-------------------------------------------------------------------------------------------------
int OnInit()
  {
   bool a = canvas.Create("a",600,400,0);
   canvas.FillTriangle(100,100,80,120,120,120,clrRed);
   canvas.Update(true); Alert(a);
   return(INIT_SUCCEEDED);
  }
//-------------------------------------------------------------------------------------------------
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[])
  {
   
   return(rates_total);
  }


结果是这样的


 
Alexandr Sokolov:

决定探索CCanvas库

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>

CCanvas canvas;
int xtr[3] = {2, 100, 198};
int ytr[3] = {198, 2, 198};
const uint clrtr = ColorToARGB(clrRed);

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   if(!canvas.CreateBitmapLabel(0, 0, "canvasname", 10, 10, 200, 200)) return(INIT_FAILED);
   canvas.Erase();
   canvas.FillTriangle(xtr[0], ytr[0], xtr[1], ytr[1], xtr[2], ytr[2], clrtr);
   canvas.Update();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   canvas.Destroy();
}
//+------------------------------------------------------------------+
//| 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[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
 
Igor Makanu:

谢谢你提供的现成的例子

如果你不介意的话,我可以就我的错误说几句吗?只是我在网站上看了一下帮助,文档中只有对函数本身的描述,而下面的例子中哪个函数在哪个函数之后都没有。

 
Alexandr Sokolov:

谢谢你提供的现成的例子

如果你不介意的话,我可以就我的错误说几句吗?只是我看了一下网站上的帮助,文档中只有对函数本身的描述,下面没有例子说明哪个函数在哪个地方之后。

阅读文章,有很多现成的例子https://www.mql5.com/ru/search#!keyword=Canvas&module=mql5_module_articles

 

下午好!!!。

我想尝试写一个函数,通过利润、手数和票数来记忆亏损的订单。
我以前从未与数组打过交道,我是通过实例和参考来完成的。

我不知道在哪里以及如何指定阵列的大小

请检查并尽可能地纠正。

======

StructOrder结构

{

Double OrProf;

双倍OrLot。

意思是说:"我不知道。

};

StructOrder OrBuy[];

StructOrder OrSell[];

====

空白 Cloce_No_FreeMargin()

{

double profit_SELL = 0;

double profit_BUY = 0;

double no_profits_BUY = 0;

double no_profits_SELL = 0;

double cur_profits_SELL = 0;

double cur_profits_BUY = 0;

//---

int bo = 0。

int so = 0。

InitStruct_Order(OrBuy)。

InitStruct_Order(OrSell)。

//ArrayResize(OrBuy,bo)。

//ArrayResize(OrSell,so)。

for(int trade= OrdersTotal()-1; trade>= 0; trade--)

{

如果(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false)

突破。

如果(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

如果(OrderType()==OP_SELL)

{

profit_SELL+=OrderProfit()+OrderSwap()+OrderCommission()。

}

如果(OrderType()==OP_BUY)

{

profit_BUY+=OrderProfit()+OrderSwap()+OrderCommission()。

}

//===========================================================

如果(OrderType()==OP_SELL)

{

cur_profits_SELL=OrderProfit()+OrderSwap()+OrderCommission()。

如果(cur_profits_SELL<0)

{

no_profits_SELL+=cur_profits_SELL。

OrSell[so].OrProf = OrderProfit()-OrderSwap()-OrderCommission()。

OrSell[so].OrLot = OrderLots()。

OrSell[so].OrTiK = OrderTicket()。

so++;

Print(" SELL type: Profit - ",OrBuy[bo].OrProf," : Lot - ",OrBuy[bo].OrLot," : Ticket - ",OrBuy[bo].OrTiK)。

}

}

//===========================================================

如果(OrderType()==OP_BUY)

{

cur_profits_BUY=OrderProfit()+OrderSwap()+OrderCommission()。

如果(cur_profits_BUY<0)

{

no_profits_BUY+=cur_profits_BUY。

OrBuy[bo].OrProf = OrderProfit()-OrderSwap()-OrderCommission()。

OrBuy[bo].OrLot = OrderLots()。

OrBuy[bo].OrTiK = OrderTicket()。

bo++。

Print(" BUY type: Profit - ",OrBuy[bo].OrProf," : Lot - ",OrBuy[bo].OrLot," : Ticket - ",OrBuy[bo].OrTiK);

}

}

}

}

}

//+------------------------------------------------------------------+

//| 订单的初始结构。

//+------------------------------------------------------------------+

空白 InitStruct_Order(StructOrder &Masiv[])

{

int Size = ArrayRange(Masiv,0);


for(int i=0; i<Size; i++)

{

Masiv[i].OrProf = 0;

Masiv[i].OrLot = 0;

Masiv[i].OrTiK = 0。

}

}

 

你好。

你能告诉我如何为一个市场建立一个由mq4-文件和大量mqh-文件组成的项目

 

朋友们,请帮助我通过iCustom在我的专家顾问中编制一个反转指标,它由一条线组成,但买入和卖出的颜色不同。它没有箭头。对于颜色,它似乎有三个缓冲区,但事实上,当用鼠标按住时,两种颜色只显示一个Value1。我既尝试了比较条形,也尝试了与零的比较,都没有用。如何对这种指标的逆转进行编程,谁知道呢?下面是指标缓冲区的初始设置和它的图片。它看起来像StepMA,但它不是。

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 DodgerBlue
#property indicator_color2 Tomato
#property indicator_color3 Tomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
extern int    Range           = 9;
extern int    FastMA          = 3;
extern int    SlowMA          = 30;
extern int    filter          = 25;
extern int    normalizeDigits = 4;

extern bool   alertsOn        = false;
extern bool   alertsOnCurrent = false;
extern bool   alertsMessage   = true;
extern bool   alertsSound     = true;
extern bool   alertsEmail     = false;
extern string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];

//------------------------------------------------------------------
//
//------------------------------------------------------------------

int init()
  {
   for (int i=0; i<indicator_buffers; i++) SetIndexStyle(i,DRAW_LINE);
   IndicatorBuffers(6);
   SetIndexBuffer(0, fAMA); 
   SetIndexBuffer(1, Downa); 
   SetIndexBuffer(2, Downb); 
   SetIndexBuffer(3, trend); 
   SetIndexBuffer(4, mAMA);
   SetIndexBuffer(5, AMA);
   return(0);
}
int deinit()
{
   return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------


int start()
{
   int counted_bars = IndicatorCounted(); 
      if (counted_bars < 0) return(-1); 
      if (counted_bars > 0) counted_bars--;  
         int limit=MathMin(Bars-counted_bars,Bars-1);
         if (trend[limit] == -1) ClearPoint(limit,Downa,Downb);

 
   
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--)
   {
      double sdAMA = 0;
      double Noise = 0; for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0; if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);
 
     
      
      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];
 
         if(filter < 1) fAMA[i] = mAMA[i];
         else
         {
            for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
               double dAMA  = mAMA[i] - mAMA[i+1];
               if(dAMA >= 0)
                  if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA),4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
                         fAMA[i] = fAMA[i+1];
                  else   fAMA[i] = mAMA[i];
               else
                  if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA),4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
                        fAMA[i] = fAMA[i+1];
                  else  fAMA[i] = mAMA[i];
         }
       
      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
         if (fAMA[i]> fAMA[i+1]) trend[i] =1;
         if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
         if (trend[i]==-1) PlotPoint(i,Downa,Downb,fAMA);
   }
    
   //
  
      
   if (alertsOn)
   {
      if (alertsOnCurrent)
           int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
      if (trend[whichBar] == 1)
            doAlert("buy");
      else  doAlert("sell");       
   }
   return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//


void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          

          message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," AMA STL_Color ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol()," AMA STL_Color "),message);
             if (alertsSound)   PlaySound(soundfile);
      }
}
      
//------------------------------------------------------------------
//
//------------------------------------------------------------------


void ClearPoint(int i,double& first[],double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
        second[i+1] = EMPTY_VALUE;
   else
      if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
          first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i,double& first[],double& second[],double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) 
            { first[i]  = from[i]; first[i+1]  = from[i+1]; second[i] = EMPTY_VALUE; }
      else  { second[i] = from[i]; second[i+1] = from[i+1]; first[i]  = EMPTY_VALUE; }
   else     { first[i]  = from[i]; second[i]   = EMPTY_VALUE; }
} 

 
zig2003:

朋友们,请帮助我通过iCustom在我的专家顾问中编制一个反转指标,它由一条线组成,但买入和卖出的颜色不同。它没有箭头。对于颜色,它似乎有三个缓冲区,但事实上,当用鼠标按住时,两种颜色只显示一个Value1。我既试过比较条形,又试过与零比较,都没有用。如何对这种指标的逆转进行编程,谁知道呢?下面是指标缓冲区的初始设置和它的图片。它看起来像StepMA,但它不是。


插入代码,使用按钮插入MQL5代码 "按钮

 
zig2003:

朋友们,请帮助我通过iCustom在我的专家顾问中编制一个反转指标,它由一条线组成,但买入和卖出的颜色不同。它没有箭头。对于颜色,它似乎有三个缓冲区,但事实上,当用鼠标按住时,两种颜色只显示一个Value1。我既尝试了比较条形,也尝试了与零的比较,都没有用。如何对这种指标的逆转进行编程,谁知道呢?下面是指标缓冲区的初始设置和它的图片。它看起来像StepMA,但它不是。


例子

DRAW_COLOR_LINE Lite 示例

基于DRAW_COLOR_LINE的指标。有两个指示器缓冲区--一个用于数值('ColorLineBuffer'),一个用于颜色('ColorLineColors')。

//+------------------------------------------------------------------+ 
//|                                         DRAW_COLOR_LINE Lite.mq5 | 
//|                        Copyright 2016, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 

#property description "An indicator to demonstrate DRAW_COLOR_LINE" 
#property description "It draws a line on Close price in colored pieces of 20 bars each" 
#property description "The width, style and color of the line parts are changed randomly" 
#property description "every N ticks" 

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ColorLine 
#property indicator_label1  "ColorLine" 
#property indicator_type1   DRAW_COLOR_LINE 
//--- Define 5 colors for coloring each bar (they are stored in the special array) 
#property indicator_color1  clrBlue,clrRed // (Up to 64 colors can be specified) 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  3 
//--- A buffer for plotting 
double         ColorLineBuffer[];
//--- A buffer for storing the line color on each bar 
double         ColorLineColors[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- Binding an array and an indicator buffer 
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//---
   ArraySetAsSeries(ColorLineBuffer,true);
   ArraySetAsSeries(ColorLineColors,true);
//--- 
   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[])
  {
   ArraySetAsSeries(close,true);
   if(prev_calculated==0)
     {
      for(int i=0;i<rates_total;i++)
         ColorLineBuffer[i]=close[i];
     }
//--- Block for calculating indicator values 
   for(int i=0;i<10;i++)
     {
      //--- Write the indicator value into the buffer 
      ColorLineBuffer[i]=close[i];
      //--- For this bar, the line will have the color with the index color_index 
      if(ColorLineBuffer[i]>ColorLineBuffer[i+1])
         ColorLineColors[i]=0;
      else
         ColorLineColors[i]=1;
     }

//--- Return the prev_calculated value for the next call of the function 
   return(rates_total);
  }
//+------------------------------------------------------------------+


而专家顾问,从0号缓冲区('ColorLineBuffer')和1号缓冲区('ColorLineColors')复制数值。

//+------------------------------------------------------------------+
//|                                 DRAW_COLOR_LINE Lite Example.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
int    handle_iCustom;                       // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(Symbol(),Period(),"DRAW_COLOR_LINE Lite");
//--- if the handle is not created
   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double array_value[],array_color[];
   ArraySetAsSeries(array_value,true);
   ArraySetAsSeries(array_color,true);
   int start_pos=0,count=1;
   if(!iGetArray(handle_iCustom,0,start_pos,count,array_value) ||
      !iGetArray(handle_iCustom,1,start_pos,count,array_color))
     {
      return;
     }
//---
   string text="Value: "+DoubleToString(array_value[0],8)+", color: "+DoubleToString(array_color[0],8);
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • www.mql5.com
В своей статье  я сделал достаточно убедительные тесты, доказывающие тот факт, что далеко не каждый вызов пользовательского или даже технического индикатора в коде - это самый оптимальный вариант для обработки им промежуточных расчетов в разрабатываемом индикаторе. Итоговый результат по скорости своего исполнения может оказаться значительно...