专家顾问 - 杂项问题 - 页 9

 

下面的代码看起来工作得不错,而且已经试过bool 'stoploss_use&takeprofit_use',但有一次 没有正常工作,然后我怀疑这段代码,请让我了解一下。(如果有必要的话--我可以把所有测试EA的代码贴出来。)

void OnChartEvent(const int     id     ,
                  const long&   lparam ,
                  const double& dparam ,
                  const string& sparam
                  )
{
    // Sell
    if ( sparam == sellbutton )
    {
        ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
        // stoploss
        if ( stoploss_use == true )
        { sl = Bid + points_to_change( stoploss );}
        // takeprofit
        if ( takeprofit_use == true )
        { tp = Bid - points_to_change( takeprofit );}
        if ( !OrderSend( Symbol(), OP_SELL, lot, Bid, slippage, sl, tp, NULL, magic, 0, CLR_NONE ) )
            Print( " | OrderSend SELL: ", GetLastError() );
        return;
    }
    // Buy
    if ( sparam == buybutton )
    {
        ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
        // stoploss
        if ( stoploss_use == true )
        { sl = Ask - points_to_change( stoploss ); }
        // takeprofit
        if ( takeprofit_use == true )
        { tp = Ask + points_to_change( takeprofit ); }
        if ( !OrderSend( Symbol(), OP_BUY, lot, Ask, slippage, sl, tp, NULL, magic, 0, CLR_NONE ) )
            Print( " | OrderSend SELL: ", GetLastError() );

        return;
    }
}

所以,如果你说是的, 上述代码运行良好。那么我需要问的是,上述代码的组合是最佳的吗? 所以,我只是想得到最佳的代码组合,也就是代码应该完美地工作。

请帮助我,或给我好的建议。
祝您一切顺利。

 

当它失败时,你会得到一个错误,你可以在文档中查找错误代码

有时订单发送失败是因为滑点或偏离报价,所以它不一定是一个编码问题。

如果你把你的止损放在离市场价格太近的地方,这将是一个编码问题。

我也会为订单编写单独的函数,并在你的onchart事件中简单地调用这些函数。

但结果应该是一样的。

 
Marco vd Heijden:

我也会写单独的函数来排序,并在你的onchart事件中简单地调用这些函数。

不错的评论,我已经开始把它们分开了,谢谢你。
 

下面的代码组合好吗,请问?

// Sell
if ( sparam == sellbutton )
{
    ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
    ordersellfnc();
    return;
}
void ordersellfnc()
{    
    if ( stoploss_use   == true ) { sl = Bid + points_to_change( stoploss   ); }
    if ( takeprofit_use == true ) { tp = Bid - points_to_change( takeprofit ); }
    if ( !OrderSend( Symbol(), OP_SELL, lot, Ask, slippage, sl, tp, NULL, magic, 0, clrRed ) )
          Print( " | OrderSend SELL: ", GetLastError() );
    return;
}

预先感谢。

 
如果函数 失败,Ordersend会返回票号或-1。
 
Marco vd Heijden:
如果函数 失败,Ordersend返回票号或-1。
哦,我不知道为什么我不能理解只是你的最新评论,那是问题吗?如果是的话,我该如何解决?
 

#Checkmark - 打开

我可以使用下面的代码来设定 "默认止损 "值,这对我来说很有用。
但我已经花了几个小时来处理'Checkmark'使用'On/Off',但不幸的是没有好结果。我有'位图标签'对象,当我单独 使用它时,效果很好,但当我试图这样使用它时。如果它是 "开","止损 "可以应用,如果 "关","止损 "就不能应用。

当我开始写这个函数的代码时,我以为我可以在短短几分钟内写完它。但不幸的是,它已经花了几个小时,请帮助我,那是在占用我的生命时间。

(如果你觉得我的担心很愚蠢,请不要责怪我,只是一个理由而已)

if ( stoploss == stoplossresetvalue )
{   ObjectSetInteger( 0, stoplossbmp, OBJPROP_STATE, false ); } else
{   ObjectSetInteger( 0, stoplossbmp, OBJPROP_STATE, true  ); }

    ObjectSetString ( 0, stoplossedit, OBJPROP_TEXT, IntegerToString( stoploss ) );

先谢谢你了。

 

位图标签的工作方式与按钮对象略有不同。

它使用两个位图,一个用于开启状态,另一个用于关闭状态。

#property strict
//--- description
#property description "Script creates \"Bitmap Label\" object."
//--- display window of the input parameters during the script's launch
#property script_show_inputs
//--- input parameters of the script
input string             InpName= "BmpLabel" ;               // Label name
input string             InpFileOn= "\\Images\\dollar.bmp" ; // File name for On mode
input string             InpFileOff= "\\Images\\euro.bmp" ;   // File name for Off mode

input bool               InpState= false ;                   // Label pressed/released
input ENUM_BASE_CORNER   InpCorner= CORNER_LEFT_UPPER ;       // Chart corner for anchoring
input ENUM_ANCHOR_POINT InpAnchor= ANCHOR_CENTER ;           // Anchor type
input color              InpColor= clrRed ;                   // Border color when highlighted
input ENUM_LINE_STYLE    InpStyle= STYLE_SOLID ;             // Line style when highlighted
input int                InpPointWidth= 1 ;                   // Point size to move
input bool               InpBack= false ;                     // Background object
input bool               InpSelection= false ;               // Highlight to move
input bool               InpHidden= true ;                   // Hidden in the object list
input long               InpZOrder= 0 ;                       // Priority for mouse click
//+------------------------------------------------------------------+
//| Create Bitmap Label object                                       |
//+------------------------------------------------------------------+
bool BitmapLabelCreate( const long               chart_ID= 0 ,               // chart's ID
                       const string             name= "BmpLabel" ,           // label name
                       const int                sub_window= 0 ,             // subwindow index
                       const int                x= 0 ,                       // X coordinate
                       const int                y= 0 ,                       // Y coordinate
                       const string             file_on= "" ,               // image in On mode
                       const string             file_off= "" ,               // image in Off mode
                       const int                width= 0 ,                   // visibility scope X coordinate
                       const int                height= 0 ,                 // visibility scope Y coordinate
                       const int                x_offset= 10 ,               // visibility scope shift by X axis
                       const int                y_offset= 10 ,               // visibility scope shift by Y axis
                       const bool               state= false ,               // pressed/released
                       const ENUM_BASE_CORNER   corner= CORNER_LEFT_UPPER , // chart corner for anchoring
                       const ENUM_ANCHOR_POINT anchor= ANCHOR_LEFT_UPPER , // anchor type
                       const color              clr= clrRed ,               // border color when highlighted
                       const ENUM_LINE_STYLE    style= STYLE_SOLID ,         // line style when highlighted
                       const int                point_width= 1 ,             // move point size
                       const bool               back= false ,               // in the background
                       const bool               selection= false ,           // highlight to move
                       const bool               hidden= true ,               // hidden in the object list
                       const long               z_order= 0 )                 // priority for mouse click
  {
//--- reset the error value
   ResetLastError ();
//--- create a bitmap label
   if (! ObjectCreate (chart_ID,name, OBJ_BITMAP_LABEL ,sub_window, 0 , 0 ))
     {
       Print ( __FUNCTION__ ,
             ": failed to create \"Bitmap Label\" object! Error code = " , GetLastError ());
       return ( false );
     }
//--- set the images for On and Off modes
   if (! ObjectSetString (chart_ID,name, OBJPROP_BMPFILE , 0 ,file_on))
     {
       Print ( __FUNCTION__ ,
             ": failed to load the image for On mode! Error code = " , GetLastError ());
       return ( false );
     }
   if (! ObjectSetString (chart_ID,name, OBJPROP_BMPFILE , 1 ,file_off))
     {
       Print ( __FUNCTION__ ,
             ": failed to load the image for Off mode! Error code = " , GetLastError ());
       return ( false );
     }

//--- set label coordinates
   ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x);
   ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y);
//--- set visibility scope for the image; if width or height values
//--- exceed the width and height (respectively) of a source image,
//--- it is not drawn; in the opposite case,
//--- only the part corresponding to these values is drawn
   ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width);
   ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height);
//--- set the part of an image that is to be displayed in the visibility scope
//--- the default part is the upper left area of an image; the values allow
//--- performing a shift from this area displaying another part of the image
   ObjectSetInteger (chart_ID,name, OBJPROP_XOFFSET ,x_offset);
   ObjectSetInteger (chart_ID,name, OBJPROP_YOFFSET ,y_offset);
//--- define the label's status (pressed or released)
   ObjectSetInteger (chart_ID,name, OBJPROP_STATE ,state);

//--- set the chart's corner, relative to which point coordinates are defined
   ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner);
//--- set anchor type
   ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
//--- set the border color when object highlighting mode is enabled
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- set the border line style when object highlighting mode is enabled
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- set a size of the anchor point for moving an object
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,point_width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- enable (true) or disable (false) the mode of moving the label by mouse
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- successful execution
   return ( true );
  }
//+------------------------------------------------------------------+
//| Set a new image for Bitmap label object                          |
//+------------------------------------------------------------------+
bool BitmapLabelSetImage( const long    chart_ID= 0 ,       // chart's ID
                         const string name= "BmpLabel" , // label name
                         const int     on_off= 0 ,         // modifier (On or Off)
                         const string file= "" )         // path to the file
  {
//--- reset the error value
   ResetLastError ();
//--- set the path to the image file
   if (! ObjectSetString (chart_ID,name, OBJPROP_BMPFILE ,on_off,file))
     {
       Print ( __FUNCTION__ ,
             ": failed to load the image! Error code = " , GetLastError ());
       return ( false );
     }
//--- successful execution
   return ( true );
  }
//+------------------------------------------------------------------+
//| Move Bitmap Label object                                         |
//+------------------------------------------------------------------+
bool BitmapLabelMove( const long    chart_ID= 0 ,       // chart's ID
                     const string name= "BmpLabel" , // label name
                     const int     x= 0 ,             // X coordinate
                     const int     y= 0 )             // Y coordinate
  {
//--- reset the error value
   ResetLastError ();
//--- move the object
   if (! ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x))
     {
       Print ( __FUNCTION__ ,
             ": failed to move X coordinate of the object! Error code = " , GetLastError ());
       return ( false );
     }
   if (! ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y))
     {
       Print ( __FUNCTION__ ,
             ": failed to move Y coordinate of the object! Error code = " , GetLastError ());
       return ( false );
     }
//--- successful execution
   return ( true );
  }
//+------------------------------------------------------------------+
//| Change visibility scope (object) size                            |
//+------------------------------------------------------------------+
bool BitmapLabelChangeSize( const long    chart_ID= 0 ,       // chart's ID
                           const string name= "BmpLabel" , // label name
                           const int     width= 0 ,         // label width
                           const int     height= 0 )         // label height
  {
//--- reset the error value
   ResetLastError ();
//--- change the object size
   if (! ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width))
     {
       Print ( __FUNCTION__ ,
             ": failed to change the object width! Error code = " , GetLastError ());
       return ( false );
     }
   if (! ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height))
     {
       Print ( __FUNCTION__ ,
             ": failed to change the object height! Error code = " , GetLastError ());
       return ( false );
     }
//--- successful execution
   return ( true );
  }
//+--------------------------------------------------------------------+
//| Change coordinate of the upper left corner of the visibility scope |
//+--------------------------------------------------------------------+
bool BitmapLabelMoveVisibleArea( const long    chart_ID= 0 ,       // chart's ID
                                 const string name= "BmpLabel" , // label name
                                 const int     x_offset= 0 ,       // visibility scope X coordinate
                                 const int     y_offset= 0 )       // visibility scope Y coordinate
  {
//--- reset the error value
   ResetLastError ();
//--- change the object's visibility scope coordinates
   if (! ObjectSetInteger (chart_ID,name, OBJPROP_XOFFSET ,x_offset))
     {
       Print ( __FUNCTION__ ,
             ": failed to change X coordinate of the visibility scope! Error code = " , GetLastError ());
       return ( false );
     }
   if (! ObjectSetInteger (chart_ID,name, OBJPROP_YOFFSET ,y_offset))
     {
       Print ( __FUNCTION__ ,
             ": failed to change Y coordinate of the visibility scope! Error code = " , GetLastError ());
       return ( false );
     }
//--- successful execution
   return ( true );
  }
//+------------------------------------------------------------------+
//| Delete "Bitmap label" object                                     |
//+------------------------------------------------------------------+
bool BitmapLabelDelete( const long    chart_ID= 0 ,       // chart's ID
                       const string name= "BmpLabel" ) // label name
  {
//--- reset the error value
   ResetLastError ();
//--- delete the label
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": failed to delete \"Bitmap label\" object! Error code = " , GetLastError ());
       return ( false );
     }
//--- successful execution
   return ( true );
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//--- chart window size
   long x_distance;
   long y_distance;
//--- set window size
   if (! ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS , 0 ,x_distance))
     {
       Print ( "Failed to get the chart width! Error code = " , GetLastError ());
       return ;
     }
   if (! ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS , 0 ,y_distance))
     {
       Print ( "Failed to get the chart height! Error code = " , GetLastError ());
       return ;
     }
//--- define bitmap label coordinates
   int x=( int )x_distance/ 2 ;
   int y=( int )y_distance/ 2 ;
//--- set label size and visibility scope coordinates
   int width= 32 ;
   int height= 32 ;
   int x_offset= 0 ;
   int y_offset= 0 ;
//--- place bitmap label at the center of the window
   if (!BitmapLabelCreate( 0 ,InpName, 0 ,x,y,InpFileOn,InpFileOff,width,height,x_offset,y_offset,InpState,
      InpCorner,InpAnchor,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
       return ;
     }
//--- redraw the chart and wait one second
   ChartRedraw ();
   Sleep ( 1000 );
//--- change label's visibility scope size in the loop
   for ( int i= 0 ;i< 6 ;i++)
     {
       //--- change visibility scope size
      width--;
      height--;
       if (!BitmapLabelChangeSize( 0 ,InpName,width,height))
         return ;
       //--- check if the script's operation has been forcefully disabled
       if ( IsStopped ())
         return ;
       //--- redraw the chart
       ChartRedraw ();
       // 0.3 seconds of delay
       Sleep ( 300 );
     }
//--- 1 second of delay
   Sleep ( 1000 );
//--- change label's visibility scope coordinates in the loop
   for ( int i= 0 ;i< 2 ;i++)
     {
       //--- change visibility scope coordinates
      x_offset++;
      y_offset++;
       if (!BitmapLabelMoveVisibleArea( 0 ,InpName,x_offset,y_offset))
         return ;
       //--- check if the script's operation has been forcefully disabled
       if ( IsStopped ())
         return ;
       //--- redraw the chart
       ChartRedraw ();
       // 0.3 seconds of delay
       Sleep ( 300 );
     }
//--- 1 second of delay
   Sleep ( 1000 );
//--- delete the label
   BitmapLabelDelete( 0 ,InpName);
   ChartRedraw ();
//--- 1 second of delay
   Sleep ( 1000 );
//---
  }

因此,例如,您可以使用相同 bmp 的彩色版本和灰度版本来显示开启和关闭状态。

请参见:

https://docs.mql4.com/constants/objectconstants/enum_object/obj_bitmap_label

如果您确实使用了两张图片,请发布更多代码您在哪里设置状态?你想让它可以点击吗?目标是什么?
OBJ_BITMAP_LABEL - Object Types - Objects Constants - Standard Constants, Enumerations and Structures - MQL4 Reference
OBJ_BITMAP_LABEL - Object Types - Objects Constants - Standard Constants, Enumerations and Structures - MQL4 Reference
  • docs.mql4.com
OBJ_BITMAP_LABEL - Object Types - Objects Constants - Standard Constants, Enumerations and Structures - MQL4 Reference
 
Max Enrik:
哦,我不知道为什么我不能理解你最近的评论,是这个问题吗?如果是的话,我该如何解决呢?

我只是想指出,OrderSend()函数 返回的是一个整数而不是一个布尔值。

如果函数失败,票号或-1与真或假是非常不同的。

 

Marco vd Heijden: 

如果你确实使用了两张图片,请公布更多你的代码,你在哪里设置状态?你希望它能被点击吗?

首先感谢你的精彩评论,非常感谢。也许我没有描述我所关心的问题,但我将尝试再写一个。

所以,我总是试图在'test.mq4'中为我的想法写代码。我已经在其中使用了两张图片,其中一张是我想要的。我只是想带来以下功能。

  1. 如果状态=真(图片显示为'开')--我只想为这个功能写代码--'止损'可以适用于我的订单。
  2. 如果状态=假(图片显示为'关')--我只想为这个函数写代码--'止损'不能应用于我的订单。
我不能做这个功能,即使我在其他功能中已经使用了'Bitmap Label Object',其他功能也能完美地实现我的要求。所以,请帮助我。

祝你一切顺利。

(我制作了.zip文件,所以你可以找到我的测试.mq4文件和2个.bmp文件格式 - 我希望这能帮助你理解我的担忧)

附加的文件:
原因: