受注サイクルの整理 - ページ 12

 
Artyom Trishkin:

- フライパンは何のために必要なのか?

- 例えば、目玉焼きを焼くとき。

- スクランブルエッグではなく、フライパンの話です...。


2人のストライカーがぶつかり合うなんて......。その調子で、つまらなくなってきた...。

 
Artyom Trishkin:

- フライパンは何のために必要なのか?

- 例えば、目玉焼きとかね。

- だから、スクランブルエッグの話ではなく、フライパンの話なんですが...。

見たか?すでに、あなたと私は、臨死体験の中に閉じ込められていると思います。

この議論を続けるのが少し億劫になってきました。なぜ、1ミリ秒ごとに 注文を通さなければならないのか理解できない。卵を焼くなら別ですが...。

 
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);
}

MT5はHistoryの動作が非常に遅く、計算コストが高いため、このバージョンは特にVPS上のMT5と関係があります。

 
fxsaber:

ヒストリーリファレンスがないバージョン。

MT5は非常に低速で計算量が多いため、このバージョンは特にVPS上のMT5に関連します。


そのような場合は、通常のOnTrade()を使用した方が良いでしょう。

オントレード

この関数は、発注済み注文や建玉のリスト注文履歴取引履歴を 変更する際に発生する取引イベント 発生時に呼び出されます。何らかの取引(保留注文の開始、ポジションの開始/終了、ストップの設定、保留注文の発動など)が行われると、それに応じて注文と取引の履歴、ポジションと現在の注文のリストが変更されます。

 
Sergey Chalyshev:

その場合は、通常のOnTrade()を使用したほうがよいでしょう。

残念ながら無理です。これこそが、支店の存在意義なのです。

 
この言葉に反論する人はほとんどいないでしょう。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2018.01.23 09:39

OrderSendが失敗し、OrderSendが成功した後、現在の取引環境を再度完全に読み込む必要があります。このルールは常に適用されるべきものです。

これは世界共通の経験則です。しかし、MT5での実装を考える人は少ない。というわけで、最も単純なTSのテンプレートを書いてみました(kodobaseではほとんど全部がそうです)。

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

#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でも、なぜかより多くのコードを書く人がいます。しかし、実はこのコードも同じようにうまくいく。ほとんどのTCはBuySignalとSellSignalを書くだけでいいのです。他に必要なものはありません。

テンプレート例は、特にSBで書かれています。MT5の専門家に質問ですが、コードは正しいのでしょうか?

この発言について

OrderSendが失敗 し、OrderSendが成功した後、現在の取引環境を再度完全に読み込む必要があります。このルールは常に適用されなければならない。

なぜ、失敗した後に一切を引っ張る必要があるのでしょうか?なぜ、注文履歴や ポジション履歴を確認する必要があるのでしょうか?現在のオーダーやポジションも?今現在の価格や必要なデータを更新するだけでは不十分なのでは?

 
Artyom Trishkin:

なぜ、悪いことが起きた後にすべてを引っ張るのか?なぜわざわざ注文や 役職の履歴を 残すのか?現在の受注・ポジションも?価格やその時々に必要なデータの更新で十分ではないでしょうか?

文字通りに解釈すれば、Market Watchから各シンボルの過去のティック履歴を読み取ることができるのです。でも、実はこの発言の意味を理解しているのではないでしょうか。

このコードは、そのステートメントを実装しているようなものです。そんなわけで、MT5を理解している皆さんに質問なのですが、このコードは正しいのでしょうか?