来自一个 "傻瓜 "的问题 - 页 216

 
2 Yedelkin,我告诉你,EA只是睡着了,停止工作。唤醒它的唯一方法是重新启动终端,它就会工作。

2 sergeev,在MQL5中,当时钟停止时,意味着它睡着了。

 
Yedelkin: ......思绪又回到了无限循环,作为显式延迟事件处理 的最简单例子。

这里有一个问题: 用什么功能来发送交易请求

G001 : 2 耶德尔金,我告诉你,专家顾问只是睡着了,停止工作。而它只有通过重新加载终端才能唤醒,而且还能工作。

一切都必须有一个理由和解释,包括目前似乎 "停止工作 "的现象。

 
G001:
2 耶德尔金,我告诉你,EA只是睡着了,停止工作。唤醒它的唯一方法是重新启动终端,它就会工作。

2 sergeev,在MQL5中,当时钟停止时,意味着它睡着了。

在哪个MQL事件中(你的EA中的哪个函数),你 "在它睡着的时候抓住它"?
 
Yedelkin:

这是个问题: 用什么功能来发送交易请求

一切都必须有一个理由和解释,包括迄今为止似乎已经 "停止工作 "的现象。

//+------------------------------------------------------------------+
//| Open Orders                                                      |
//+------------------------------------------------------------------+
// Perform analysis and open orders on new candle/bar 
  if((TradeNewBar != true)||(IsNewBar() == true))
  {
//----- Open BUY_STOP
    if(TrendDetection() == BULL && TotalBullStopOrders() < 1 && TotalBullPositions() < 1)
    {
      request.action = TRADE_ACTION_PENDING;
      request.magic = Magic;
      request.symbol = Symbol();
      request.volume = Volume();
      request.price=NormalizeDouble(Ask+OrderDrive*_Point,_Digits);
      request.sl = NormalizeDouble(request.price - StopLoss*_Point,_Digits);
      request.tp = NormalizeDouble(request.price + TakeProfit*_Point,_Digits);
      request.type=ORDER_TYPE_BUY_STOP;
      request.type_filling=ORDER_FILLING_RETURN;
      request.comment=Coments;
      int ResBull = -1;
      while(ResBull < 1)
      {
        if(OrderCheck(request,check))
        {
          ResBull = OrderSend(request,result);
        }
        if((MQL5InfoInteger(MQL5_TESTING)||MQL5InfoInteger(MQL5_OPTIMIZATION)))break;
      }
      Print("BuyStop Order Set ");
      if(UseSound == true){PlaySound(OrderSound);}
      Print(ResultRetcodeDescription(result.retcode));
    }
//----- Open SELL_STOP
    if(TrendDetection() == BEAR && TotalBearStopOrders() < 1 && TotalBearPositions() < 1)
    {
      request.action = TRADE_ACTION_PENDING;
      request.magic = Magic;
      request.symbol = Symbol();
      request.volume = Volume();
      request.price=NormalizeDouble(Bid-OrderDrive*_Point,_Digits);
      request.sl = NormalizeDouble(request.price + StopLoss*_Point,_Digits);
      request.tp = NormalizeDouble(request.price - TakeProfit*_Point,_Digits);
      request.type=ORDER_TYPE_SELL_STOP;
      request.type_filling=ORDER_FILLING_RETURN;
      request.comment=Coments;
      int ResBear = -1;
      while(ResBear < 1)
      {
        if(OrderCheck(request,check))
        {
          ResBear = OrderSend(request,result);
        }
        if((MQL5InfoInteger(MQL5_TESTING)||MQL5InfoInteger(MQL5_OPTIMIZATION)))break;
      }
      Print("SellStop Order Set ");
      if(UseSound == true){PlaySound(OrderSound);}
      Print(ResultRetcodeDescription(result.retcode));                             
    }
  }
 
sergeev:
在哪个MQL事件中(你的EA中的哪个函数),你 "在它进入睡眠状态时抓住它"?

对不起,我真的不知道你在问什么...:(

时钟就在void OnTick()之后。

void OnTick()
{
  Comment("Local Time: "+TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS));
 
sergeev:
在哪个MQL事件中(你的EA中的哪个函数),你 "在它睡着的时候抓住它"?
是的,它直观地检测到专家顾问已经 "睡着了"。它将图表上的评论 时间与自己的时间进行比较。它不使用任何事件。
 

有谁能帮助提供一个EA的条件?

我想做一个EA,在关闭一个头寸 后,它将立即打开相同的头寸,并有相反的位置。

例如,只开了2个头寸,一个卖出,一个买入。其中一个被关闭,例如在TP或SL买入,我想让EA重新建立一个买入头寸,并建立一个新的卖出头寸。

有2个卖出位置和1个买入位置

希望有人能想出一些公式,用一个相反的位置打开一个封闭的位置。

或任何其他方式......我已经尝试了我所知道的一切((((,但都不起作用 :, (

附加的文件:
SellBuY.mq4  3 kb
 
Yedelkin:
是的,它直观地检测到专家已经 "睡着"。它将图表上注释 中的时间与它的计算机时间进行比较。它不使用任何事件。
对。这就是我的要求,如何以编程方式找出EA停止工作的时间。
 

G001 ResBear = OrderSend(request,result);

明白了。你使用OrderSend() 函数。该版本是,NewTick()函数处理OnTick()事件 的延迟可能是由于缺乏服务器的响应造成的,因为OrderSend()函数必须等待这个响应。如果有兴趣,可以尝试使用它的异步拷贝,而不是OrderSend() 函数,后者不需要等待服务器的回复。这是否会导致专家顾问停止工作?
 
Yedelkin:
明白了。你正在使用OrderSend() 函数。这个版本是,延迟可能是由于服务器没有响应,因为OrderSend()函数必须等待这个响应。如果你有兴趣,可以尝试使用它的异步拷贝,而不是OrderSend() 函数,它不需要等待服务器的回复在这种情况下,它也会悬挂吗?

谢谢你。我也想过使用异步版本,但我不知道经纪人是否会不考虑这些交易。但我会努力。