组织订单周期 - 页 12

 
Artyom Trishkin:

- 你需要一个煎锅来做什么?

- 例如,煎鸡蛋。

- 这不是炒蛋的问题,而是煎锅的问题......


哦--有趣--两名前锋发生冲突......继续下去,越来越无聊了......

 
Artyom Trishkin:

- 你需要一个煎锅来做什么?

- 比如说煎鸡蛋。

- 所以我们不是在谈论炒蛋,而是在谈论煎锅......

你看到了吗?已经认为你和我被锁定在一个濒临死亡的体验中。

我有点懒得继续这个讨论了。我不明白为什么每隔一毫秒 你都要去看一下订单。除非你想用它们来煎蛋......。

 
Alexey Viktorov:

你看到了吗?已经认为你和我被锁定在一个濒临死亡的体验中。

我对这个讨论有点懒了。我不明白为什么我们必须每隔一毫秒就 去看一下订单。除非你想用它们来煎鸡蛋......。

是的......在脚后跟处找到了它......:)
我不是说每一次。但往往能及时发现环境的变化。
 
我不喜欢这样玩............ 枯萎......失望的是......。
 

关于交易、自动交易系统和测试交易策略的论坛

组织一个订单循环

fxsaber, 2017.10.06 02:00

bool IsChange( const bool InitFlag = false )
{
  static int PrevTotal = 0;
  static int PrevHistoryTotal = 0;
  
  const int Total = OrdersTotal();
  const int HistoryTotal = OrdersHistoryTotal();    
  
  if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal;    
  }
  
  return(!InitFlag && ((Total != PrevTotal) || (HistoryTotal != PrevHistoryTotal)));
}

不参考历史的版本。

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}

这个版本对VPS上的MT5特别有意义,因为MT5在历史上的工作非常缓慢,而且计算成本很高。

 
fxsaber:

没有历史参考的版本。

这个版本特别适用于VPS上的MT5,因为MT5非常慢,计算量很大。


在这种情况下,最好使用常规的OnTrade()。

寰球贸易

这个函数在交易事件 发生时被调用,在改变已下订单未结头寸列表订单历史交易历史 时发生。当任何交易行为(挂单开仓、开仓/平仓、止损设置、挂单触发等),订单和交易的历史和/或头寸和当前订单的列表都会相应改变。

 
Sergey Chalyshev:

在这种情况下,最好使用常规的OnTrade()。

不幸的是,你不能这样做。这就是该支部的工作内容。

 
很少有人会反驳这种说法

关于交易、自动交易系统和交易策略测试的论坛

虫子、虫子、问题

fxsaber, 2018.01.23 09:39

在OrderSend失败和OrderSend成功后,必须再次完全读取当前的交易环境。这一规则应始终适用。

这是一个普遍的经验法则。但很少有人想到它在MT5中的实施。这就是为什么我写了一个最简单的TS模板(在kodobase中,几乎所有的TS都是这样的)。

// Шаблон большинства ТС

#include <Trade/Trade.mqh>

// Сигнал на покупку
bool BuySignal( const string Symb ) { return(true); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return(false); }

// Находит позицию соответствующего типа
bool PositionsScan( const string Symb, const ENUM_POSITION_TYPE Type )
{
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if ((PositionGetSymbol(i) == Symb) && (PositionGetInteger(POSITION_TYPE) == Type))
      return(true);    
    
  return(false);  
}

// Торговое действие на сигнал
bool Action( const string Symb, const ENUM_POSITION_TYPE Type, const double Lots = 1 )
{
  static CTrade Trade;    
  bool Res = true;    
  
  // Закрыли противоположные сигналу позиции
  while ((PositionsScan(Symb, (ENUM_POSITION_TYPE)(1 - Type))) && (Res = Trade.PositionClose(PositionGetInteger(POSITION_TICKET))));

  // Открыли позицию по сигналу
  return(Res && !PositionsScan(Symb, Type) && (Type ? Trade.Sell(Lots, Symb) : Trade.Buy(Lots, Symb)));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
  if (BuySignal(Symb))
    Action(Symb, POSITION_TYPE_BUY);
  else if (SellSignal(Symb))
    Action(Symb, POSITION_TYPE_SELL);
}

void OnTick()
{
  Strategy(_Symbol);
}

由于某些原因,有些人为了同样的TS写了更多的代码。但事实上,这段代码做得同样好。大多数TC只需要写BuySignal和SellSignal。不需要其他任何东西。

该模板的例子是专门用SB写的。因此,向MT5专家提问,该代码是否正确?

 
fxsaber:
几乎没有人会反驳这种说法

这是一个普遍的规则。但没有多少人想到它在MT5中的实施。这就是为什么我写了一个最简单的TS模板(在kodobase中,几乎所有的TS都是这样的)。

由于某些原因,有些人为了同样的TS写了更多的代码。但事实上,这段代码做得同样好。大多数TC只需要写BuySignal和SellSignal。不需要其他任何东西。

这个例子的模板是专门用SB写的。因此,向MT5专家提问,该代码是否正确?

关于这个说法。

在OrderSend失败 和OrderSend成功后,必须再次完全读取当前的交易环境。这一规则必须始终适用。

为什么我们要在失败后拉动一切?我们为什么要检查订单 和仓位历史?目前的订单和仓位也是如此?更新当下的价格和必要的数据是不够的?

 
Artyom Trishkin:

为什么在一个不好的情况下要撤掉所有的东西?为什么要为订单 和职位的历史 而烦恼?目前的订单和仓位也是如此?更新价格和我们目前需要的数据还不够吗?

如果你从字面上理解,那么你可以从市场观察中阅读每个符号过去的tick历史。但我认为你实际上明白这句话的意思。

这段代码算是实现了这一说法。这就是为什么我有一个问题要问每个了解MT5的人:代码是否正确?