文章 "针对初学者以 MQL5 编写“EA 交易”的分步指南" - 页 22

 
早上好,谁能帮帮我?据我所知,我做了文章中提到的所有事情。但我无法同时进行两个开放操作,超出了我的理解,即作者希望在已经有买盘的情况下不要 买盘,在已经有卖盘的情况下不要 卖盘。例如,我的策略在我有一个未结买单时发送了一个卖出信号,但代码并没有打开卖出,而是关闭了买入操作,没有触及顶点/底点。这样,我就没有买入或卖出。卖出关闭买入,买入关闭卖出。我的策略中只有一个交易对、一个时间框架和一个手数。您能告诉我,如果触发了策略,如何才能同时打开买入和卖出?也就是说,订单只能由 tp/sl 关闭。非常感谢。
 
好文章!
 
Sella170:
有谁知道我是否可以将此 EA 用于迷你指数或迷你美元?
是的,您可以将鼠标拖到图表或菜单 > 插入 >专家顾问> {nomedoseurobo}上使用 EA。

希望您的问题已经得到解答。

 
非常感谢您的精彩文章。在哪里以及如何在您的代码中实现日内时间过滤器 模块?
 

你们好,早上好。

我在"策略测试器"中使用了《指南》末尾的这个文件,结果显示了以下错误:

*该错误已在本文中讨论过,但没有任何书面解决方案对我有用,我需要你们的帮助。


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


该文件位于《指南》末尾。

如何解决这个问题?

 
surfdoode2:


在进行了这两项建议的更正后,我仍然出现了这个错误:

ZeroMemory(mrequest);

if(Buy_opened || Sell_opened)

请问谁能帮助解决 4756 错误?似乎无法下买入订单。

请检查您是否使用了SymbolInfoTick 函数并编写了这部分代码:

//--- 使用 MQL5 MqlTick 结构获取最后报价
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
这里的算法逻辑有误:
 //--- 我们已经有职位空缺了吗?
     bool Buy_opened= false ;   // 变量用于保存买入打开位置的结果
     bool Sell_opened= false ; // 变量用于保存卖方打开位置的结果
    
     if ( PositionSelect ( _Symbol ) == true )   // 我们打开了一个仓位
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //买入
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // 卖出
         }
    }

由于PositionSelect 会为 _Symbol 选择第一个仓位,如果 EA 开立买入仓位,则在买入仓位打开时,Sell_opened 变量将始终为假,从而导致只要出现卖出信号,就会实现多个卖出仓位。

要纠正这种情况,并知道是否有买入和卖出仓位同时打开,可以使用以下逻辑:

 //--- 我们已经有职位空缺了吗?
   bool Buy_opened = false ;   // 变量用于保存买入打开位置的结果
   bool Sell_opened = false ; // 保存卖方打开位置结果的变量

   if ( PositionSelect ( _Symbol ) == true ) // 我们打开了一个仓位
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // 卖出
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //买入
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

大家好,早上好。

我在"策略测试器"中使用了指南末尾的这个文件,结果显示了以下错误:

*该错误已在本文中讨论过,但没有任何书面解决方案对我有用,我需要你们的帮助。



文件在指南末尾。

如何解决这个问题?

检查您请求的销售价格,使用断点调试 mrequest.price、mrequest.sl 和 mrequest.tp 变量。

尝试将

mrequest.type_filling = ORDER_FILLING_FOK;                               // 订单执行类型

改为

mrequest.type_filling = ORDER_FILLING_IOC;                               // 订单执行类型


有些文件有最低止损规则,请在此处阅读更多信息:https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

你好、

非常感谢塞缪尔的文章,你真是个天才!

要让它与我的经纪商一起工作有点困难,因为这篇文章是 "净值 "模式,而我不得不查找资料,将它置于 "对冲 "模式。我遇到的第一个问题是mrequest.type_filling

对于 XM 经纪商来说,能用的是:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // 订单的执行类型

如果您不知道您的 MT5 允许哪种类型 ,我的建议是Print(TypeFilling())Comment( TypeFilling()) 使用 TypeFilling ( ) 函数,它会返回类型;如果它告诉您是 1 (ORDER_FILLING_FOK) 或 2 (ORDER_FILLING_IOC),您就知道要放入哪种类型了(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling),因为ORDER_FILLING_FOK(1) 在我使用该经纪商时不起作用。


问题解决后,PositionSelect 会打开很多仓位。虽然 Samuel 在他的策略中没有说明,但我知道他的目标是按照既定标准(4 个布尔步骤)开立一个买入或卖出头寸(以先到者为准),在这个头寸平仓之前,我们不能开立另一个头寸。

我所做的就是修改这段代码...

//--- 我们没有出错,所以继续。
//--- 我们有空缺职位吗?
    bool Buy_opened=false;  // 变量存储打开位置采购的结果
    bool Sell_opened=false; // 变量存储打开位置出售的结果
    
    if (PositionSelect(_Symbol) ==true)  // 我们有一个空缺职位
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // 这是一次购买
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // 特卖会
         }
    }

对于这个...

//--- 我们没有出错,所以继续。
//--- 我们有空缺职位吗?
   bool Buy_opened = false;               // 变量存储打开买入头寸的结果
   bool Sell_opened = false;              // 变量存储打开卖出头寸的结果
   
   // 让我们查看所有订单,看看是否有未结订单。
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // 是购买
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // 正在销售
         }
   }

// 如果存在未结头寸,我们将等待主动操作关闭(触碰 SL 或TP)。
   if (Buy_opened || Sell_opened) return; 

注意:在这一行之后...

//--- 将上一栏的收盘价复制到当前栏,即 bar1。
   p_close=mrate[1].close;

这样我就能正常工作了。希望对你有用。

致以最诚挚的问候。

 
surfdoode2:


在进行了这两项建议的更正后,我仍然出现了这个错误:

ZeroMemory(mrequest);

if(Buy_opened || Sell_opened)

请问谁能帮助解决 4756 错误?似乎无法下买入订单。


也许您的经纪商的成交类型是ORDER_FILLING_IOC,您可以尝试编辑以下代码:

mrequest.type_filling = ORDER_FILLING_FOK;

到:

mrequest.type_filling = ORDER_FILLING_IOC;

我也遇到过同样的问题,现在已经成功解决了。