初学者的问题 MQL5 MT5 MetaTrader 5 - 页 81

 
oldiol: 我在代码中写道:if(!m_Trade.PositionClose(_Symbol,100))//----我们按当前符号平仓。其结果是,位置颠倒了!如果能得到关于如何平仓的提示,我将非常感激。
位置颠倒了,因为程序向服务器发送了两个相同的请求。该程序向服务器发送了两个相同的请求,因为其代码没有检查是否存在先前发送的请求(也没有检查服务器上处理该请求的结果)。
 
Yedelkin:
位置颠倒了,因为程序向服务器发送了两个相同的请求。该程序向服务器发送了两个相同的请求,因为其代码没有检查先前发送的请求(也没有检查服务器上处理该请求的结果)。
请把我的代码修正为正确的代码...
 

Yedelkin写道:它的代码没有检查以前发送的请求。你能告诉我这是哪个函数的检查吗?

 
oldiol: 请把我的代码改成正确的...

每个人对正确的代码都有不同的理解。所以你最后必须写出 "正确 "的代码。作为另一个提示--尝试看看这段代码是否以正确的方式工作(sendRequest标志的示意图使用)。

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

每个人对正确的代码都有不同的理解。所以你最后必须写出 "正确 "的代码。作为另一个提示--尝试看看这段代码是否在正确的键中工作(sendRequest标志的示意图使用)。

非常感谢您!试试吧...

 

结果如下:代码正确地关闭了一个多头头寸,但没有打开一个空头头寸...当重新打开一个多头头寸时,EA并没有根据条件来关闭它。EA窗口中一直有信息。

我如何在专家顾问体中使用这段代码,如果它只工作一次)?

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

在这个问题上应该是很简单的。在原理图的代码中,如果开仓位置 不是买入位置,sendRequest标志应该被设置为零(代码的最后一行)。看看为什么在你的代码中,当没有未平仓头寸未平仓 头寸不是买入头寸时,这个标志不会被设置为零。

 

万岁!它工作))))删除了if(sentRequest) sentRequest=false; 并在块前写上if(PositionsTotal()==0) sentRequest=false; 非常感谢Yedelkin的帮助,祝你好运!

 
oldiol 删除了 if(sentRequest) sentRequest=false; 并在块前写上 if(PositionsTotal()==0) sentRequest=false。
所以主代码中没有位置检查?然后我想补充的是,使用PositionGetSymbolPositionSelect 函数来选择某个特定符号的位置。
 

oldiol : 当重新打开一个多头时,EA不再按条件关闭头寸。在EA窗口中一直有信息:我如何在EA主体中使用这段代码,如果它只工作了1次)? 对不起,我的错误...代码中还有一个条件

如果(PositionSelect(_Symbol)==true) //有一个开放的位置
{

位置关闭块

}// ...因此

if(sendRequest) sentRequest=false;//把它放在下一个括号后面,一切都工作得很好。Yedelkin 谢谢你!