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

 

决定对之前的问题进行补充。

1)

假设我有一个信号--当价差急剧扩大时(在新闻上)。

关闭所有当前交易

但在新闻期间,订单不会只是关闭或打开。

因此,如果我们采取一个命令,例如,OrderClose,把它放入一个循环+Sleep(3000),并执行它,直到它关闭。

2)

如果我们在按钮中绑定一个内部变量,并将按下/关闭的值分配给订单打开的可能性,它是否会实时工作?

 
trader781:

决定对之前的问题进行补充。

1)

假设我有一个信号--当价差急剧扩大时(在新闻上)。

关闭所有当前交易

但在新闻期间,订单不会只是关闭或打开。

因此,如果我们采取一个命令,例如,OrderClose,把它放入一个循环+Sleep(3000),并执行它,直到它关闭。

2)

如果我们在按钮中绑定一个内部变量,并将按下/关闭的值分配给订单打开的可能性,它是否会实时工作?

1)不是Sleep(3000),而是错误处理的帮助。
 

问候,我正在写一个指标,在图表上画订单历史,代码

//+------------------------------------------------------------------+
//|                                                      history.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 indicator_chart_window

extern int        MagicNumber                = 1110;
extern datetime   HistoryOrdersFromDateTime  = 0;
extern color      SellColor                  = clrRed;
extern color      BuyColor                   = clrBlue;
extern color      ProfitColor                = clrWhite;
extern bool       DeleteHistoryOrders        = false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
      {
         if(HistoryOrdersFromDateTime<OrderCloseTime())
         {
            if((TimeCurrent()-OrderCloseTime())>60)
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
   datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
   string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
   color col=SellColor;
   if(OrderType()==0) {col=BuyColor; type="Buy";}

   if(DeleteHistoryOrders==false)
   {
      //Начальная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
      
      //Линия  
      ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
      ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
  
      //Конечная точка
      ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
      ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
      
      //Размер фона  
      for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
         StringAdd(Background,"g");
      
      //Фон профита
      ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
      ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
  
      //Профит
      ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
      ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
      ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
   } else ObjectsDeleteAll(0, "#"+Ticket+" ");  
}

void OnDeinit(const int reason)
{  
   //Удалаение истории ордеров
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      DeleteHistoryOrders=true;
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         HistoryOrders();
   }
}

该指标正确地绘制了单笔交易(线>背景>利润),但在显示平仓订单组时有一个小 "错误"(截图附后),线是叠加在背景和利润上(线(1)>背景>利润>线(2)>线(3)>线(4) .. . .).

它应该是这样的:(行(1)>行(2)>行(3)>行(4) . .>fon>profit)。各种篡改都没有成功,请帮助完善。

附加的文件:
 
ilnur17021992:

问候,我正在编写一个在图表上显示订单历史的指标


该指标能正确呈现单笔交易(线>背景>利润),但在显示平仓订单集时,有一个小的 "咻"(我附上一张截图),线(线(1)>背景>利润>线(2)>线(3)>线(4)......)叠加在背景和利润上。).

它应该是这样的:(行(1)>行(2)>行(3)>行(4) . .>fon>profit)。各种篡改都没有成功,请帮助完善。

尝试在后台 将线条和图标分配给OBJPROP_BACK 属性。
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov:
尝试将属性OBJPROP_BACK 分配给背景中的 线条和图标。
这不是一个选项。 线条被画在背景中(在烛台后面),而绘图应该在烛台上方:烛台>线条>利润背景>利润
附加的文件:
 
ilnur17021992:
不是一个选项,所以线条是在背景中(在烛台后面),而绘图应该在烛台上面:烛台>线条>利润>利润背景
然后只在图表上画出顺序。或者,当绘制背景和利润时,我们应该按时间检查这些对象的存在,在OBJ_TEXT对象 中读取利润值,并将其添加到当前订单的利润中。然后,我们应该删除背景和利润,并重新绘制它们。
顺便说一下,这将摆脱一个额外的利润计算周期。

你可以这样做
      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               Ticket=(string)OrderTicket();
            }  
         }      
      }
你在一开始就把利润和所有其他订单参数一起定义。

ps请。用这个按钮放置一张图片
 
Alexey Viktorov:
然后只在图表上画出顺序。或者,在绘制背景和利润时,我们应该按时间检查这些对象的可用性,读取OBJ_TEXT对象 中的利润值,并将其添加到当前订单的利润中。然后,我们应该删除背景和利润,并重新绘制它们。
顺便说一下,这将消除计算利润的额外周期的需要。
你在一开始就与所有其他订单参数一起定义利润。

我如何设置这个绘图顺序,比如说,先画所有的点和连接它们的线,然后再继续画背景和利润?

 
ilnur17021992:

我如何设置这种绘制顺序,比如说,先绘制所有的点和连接它们的线,然后再继续绘制背景和利润?

好吧,如果按照我的第一个假设,那么就是这样。然后我马上有了一个即兴的想法,没有删除第一句话,但我更喜欢第二句话。

你最好考虑这个变体。

ObjectFind()然后 ,如果找到对象ObjectGetString()将其从文本转换为数字,将最后一个订单的利润加到获得的值上,删除过时的OBJ_TEXT并画一个新的
如果这是第一个或唯一一个在此条线上关闭的订单,我们只需画出
OBJ_TEXT,这就是全部。
为了方便起见,我们应该指定酒吧开业的时间,而不是门票。还是需要该票据来进行进一步的工作?

 
Alexey Viktorov:
好吧,如果根据我的第一个猜测,它是这样的。然后我马上有了一个即兴的想法,没有删除第一句,但我更喜欢第二句。

你最好考虑这个变体。

ObjectFind()然后 ,如果找到对象ObjectGetString()将其从文本转换为数字,将最后一个订单的利润加到获得的值上,删除过时的OBJ_TEXT并绘制一个新的
如果这是第一个或唯一一个在此条线上关闭的订单,我们只需画出
OBJ_TEXT,这就是全部。
为了方便起见,我们应该指定酒吧开业的时间,而不是门票。还是需要该票据来进行进一步的工作?

是的,这张票是需要的,以便以后分析故事。谢谢你关于重绘的提示。通过在代码中加入这个检查和重绘,解决这个问题比较容易。

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

我不知道这是否正确,但原则上它的画法应该是这样的(线>方>利)。

 
ilnur17021992:

是的,票据是需要的,以便以后分析历史。通过在代码中加入这样的检查和重绘,解决了这个问题,变得简单了一些。

      //Расчет профита
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
         {
            close_time=OrderCloseTime();
            //60 секунд разницы между закрытием первого и последнего ордера в сетке
            if(c<=close_time+60 && c>=close_time-60)
            {
               Profit+=OrderProfit()+OrderCommission()+OrderSwap();
               ProfitTicket=(string)OrderTicket();
               CountOrders++;
            }  
         }      
      }
      
      //Перерисовка фона и профита
      if(CountOrders>1)
      {  
         ObjectDelete("#"+Ticket+" Background");
         ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
         Ticket=ProfitTicket;      
      }

基本上它画得很正确(线条>背景>利润)。

嗯,这很好,我为你感到高兴。
原因: