MT5和速度在行动 - 页 5

 
fxsaber:

在Combat Advisors中,我在可疑的地方到处包装函数到_B(FuncName(..), AlertTime)

忘了这是很贵的。

        Alert: Time[SyncEA.mqh 309: ::TerminalInfoInteger(TERMINAL_MEMORY_USED)] = 21 ms.
 
fxsaber:

在最好的情况下,我在每一个刻度上花费几十毫秒的时间,就是因为HistorySelect。

剖析战斗顾问。


 
要么是这样,要么是其他的东西。当一个订单成功下达后,其票据会被退回?HistoryOrderSelect(ticket)函数 的返回是否告诉你什么?除了启动机器人时,为什么还要使用昂贵的HS?
 
Vladimir Simakov:
除了启动机器人时,为什么还要使用昂贵的HS?

写在该主题的开头。

 
fxsaber:

你做了一个OrderSend。如果在订单发送结束后,某个头寸没有同时平仓,您可以再次进行订单发送。这就是你需要编程的所有逻辑。不使用异步。

现在发生在我们机器人身上的情况。你已经发送了一个OrderSend,当它被执行时,限制器已经被触发,然后我们的头寸的TP已经被执行,正如我之前提到的。

我真的不明白这一点--如果你能,请更详细地描述一下这些步骤。我得到的唯一结果是,只使用了OnTradeTransaction 事件处理程序,这意味着我们不需要事件处理的优先级管理,而建议的

bool HandleNextEvent(ENUM_EVENT_TYPE);

堕落为

bool HandleNextEvent();
要求 是什么?给我们HandleNextEvent()。
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
现在,方案 中的二级事件处理程序被建议这样实现。
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

这是我真正不明白的地方--如果你能,请一步一步更详细地描述它。

void OnMain()
{
  OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
  
  // Следующий OrderSend должен быть незамедлительно вызван.
  if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
    OrderSend(OP_BUYLIMIT)  
  else
    OrderSend(OP_SELLLIMIT)    
}
 
fxsaber:

为什么在调用OrderSend 后不能返回?

void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return;
        }
//...
}

下次你返回OnMain时,当一个新的事件已经被添加到队列中(或由定时器)时

 

A100:

为什么OrderSend 调用后不能有一个返回?

没有任何限制。

下次当一个新的事件被添加到队列中时(或通过定时器)返回到OnMain

下一个事件是执行一个挂单,而不是执行一个持仓。

 
fxsaber:

下一个事件是执行挂单,而不是接管头寸。

建议反复返回,直到你读到整个当前队列或给定数量的事件。当交易活动结束时--会有一个定时器返回,你将可以一次性进入所有的活动。

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
有一个更优雅的解决方案,没有OnTimer...考虑一下吧