PROFIからSUPER PROFIへの質問-1. - ページ 42

 
swanhearts:

こんにちは、私は私が必要とするすべてのレベルを持つMAインジケータを送りました。問題は、インジケータ(各MA)にマウスを合わせても、そのMAの周期が表示されないことです。どうすれば直るのか?IndicatorShortName("MASHKI =)") を変更すると、常にシンタックスエラーが発生します; 助けてください

SetIndexLabelでインジケータバッファ 名を設定する。

 

1.関数呼び出しが前の呼び出しと同じティックにあることを知るための最も安価な方法は何ですか?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

時間(TimeCurrent)は、理論的にはSymbolInfoTickからms単位の時間で、変わらないことがあります。

ビッドタイム、アスクタイム、msタイムを比較すると、かなり高額になります。

Expert Advisor 自体で制御を整理することは提案せず、普遍的な独立した機能を取得したい。


トレーディング業務に関しても 同じ疑問があります。注文/ポジションのリスト(オープンレベル、SL、TPを含む)に、前回実行時から何か変化があったことを知るにはどうしたらよいでしょうか。

OnTradeに何らかのフラグを設定する必要があります(終了したらリセット)、それが一番安上がりな方法です。

しかし、やはり、普遍的な解決策が欲しいところです。


誰かアイデアはありませんか?

 

Andrey Khatimlianskii: 

https://www.mql5.com/ru/code/16997

Resources.mqhファイルです。

IsNewPeriod関数


基本的な考え方は、内部にstaticを 持つ関数を使用することです。

ID = GetMicroSecondsCountに格納することで、記憶し、ティックを確認することができます。

注文と同じように - マジックチェック

下の擬似コードは確認していません :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2.トレードについても 同様の質問がある。注文/ポジションのリスト(オープンレベル、SL、TPを含む)に、前回の実行時から何か変更があった場合、どのように確認すればよいですか?

Aの場合、OnTradeに何らかのフラグを立てる(そして実行後にリセットする)必要があり、それが一番安上がりな方法です。

しかし、やはり、普遍的な解決策が欲しいところです。


誰かアイデアはありませんか?

ここに条件(SL/TPなど)を追加してください。

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

オーダオーバーフローサイクルの整理

fxsaber さん 2017.10.18 12:29

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);
}
 
Andrey Khatimlianskii:

1.関数呼び出しが前の呼び出しと同じティックにあることを知るための最も安価な方法は何ですか?

時間(TimeCurrent)は、理論的にはSymbolInfoTickからms単位の時間で、変わらないことがあります。

ビッドタイム、アスクタイム、msタイムの比較は高すぎる。

EA自体に制御を整理することは提案しません、普遍的な独立した機能を得たいのです。

ここで問題になるのは、安さではなく、刻みの番号付けの信頼性です。私はEAで次のようなことを行っています。

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

本機能は、MT4用バージョンです。ナンバリング・スルー・スパイ・インジケータ。


MT5用の同機能のバージョンは、不要なものを削除すべきなので、載せていません。でも、この機能がベースになっているんです。

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


0以外を返した場合 - 新しいティック。

 
...:

基本的な考え方は、内部にstaticを 持つ関数を使用することです。

ID = GetMicroSecondsCount に格納することで、刻みを記憶し、照合することができます。

ありがとうございました。

問題は、このユニークなID(ティック番号)が存在しないことだけなのです。

GetMicroSecondsCountは呼び出しのたびに変化するので役に立ちません(そのために設計されています)。一方、GetTickCountは 理論上、隣接する2つのティックで変化しない可能性があります。

 
fxsaber:

ここで問題になるのは、安さではなく、刻み番号の信頼性です。戦闘用EAでは、私はこのようにします。

いいえ、bid/ask/msの比較より確実に遅くなります。

信頼性の問題とは?重要なのは、何かを変えるという事実だけです。

 
fxsaber:

ここに条件(SL/TPなど)を追加してください。

すぐにこのコードを思い出した。

ただ、ポイントは、すべてのオーダーを不必要に列挙しないことです。

このループをEA全体で1つのループにすれば良いことは明らかです。しかし、この場合、関数に変更のサインを渡す必要があります(呼び出さないほうがいいかもしれません)。

 
Andrey Khatimlianskii:

いいえ、bid/ask/msの比較より確実に遅くなります。

信頼性の問題とは?大切なのは、何かが変わるということです。

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

PROFiからSUPER PROFiへの質問-1.

アンドレイ・ハチムリアンスキー, 2020.03.05 23:46

時間(TimeCurrent)は、理論的にはSymbolInfoTickからのms単位の時間、も 変わらないかもしれません。

mscで bid、ask、timeを 比較すると高いです。

特にMT4でtime_mscのステップ変化が1000msの場合に関連します。

 
Andrey Khatimlianskii:

しかし、目的はまさに、すべての注文が不必要に重ならないようにすることです。

このサイクルをEA全体で1つにすることができるのは明らかです。しかし、その場合、関数に変更のサインを渡さなければなりません(呼び出さないほうがいいかもしれません)。

理解できない。データベースで何かが変わった場合、それを知るには、以前のデータベースの状態と比較するしかない。

対応するデータベースの各要素を比較することができます。あるいは、それらからハッシュを計算し、ハッシュを比較することも可能です。