mql5言語の特徴、微妙なニュアンスとテクニック - ページ 96

 

ところで、GetSystemTimePreciseAsFileTimeはとても興味深かったです。このような関数はMQLでは非常に不足しており、少なくともマイクロ/ミリ秒に丸める必要があります。 秒単位の時間はあまりにも粗雑です。 MT自体ではどこでもミリ秒が使われています。 今は同じGetMicrosecondCountを使って 正確な時間を合成して行う必要があります。

long TimeLocal_mcs() 
{ 
  static long time0_mcs= 0;
  if (time0_mcs==0) { datetime t=TimeLocal();  while(TimeLocal()==t);  time0_mcs= (t+1)*1 e6 - GetMicrosecondCount(); }
  datetime time= TimeLocal();
  long time_mcs= time0_mcs + GetMicrosecondCount();
  long delta= time_mcs - time*(long)1 e6; 
  if (delta<0) { time0_mcs-=delta;  time_mcs-=delta; }  
  return time_mcs;
}
 
アレクセイ・ナヴォイコフ

ところで、GetSystemTimePreciseAsFileTimeはとても興味深かったです。MQLでは、このような関数が本当に必要で、少なくともマイクロ/ミリ秒に丸める必要があります。 秒単位の時間はあまりにも粗末です。 MT自体、いたるところでミリ秒が使われています。 今は、同じGetMicrosecondCount関数を使って正確な時間を合成して行う必要があります。

WinApi機能により、mcsで生成した独自のコールバックを作成する。

 
コンスタンチン

WinApi機能により、mcsで生成された独自のコールバックを作成可能

コールバックは何のため?

 
アレクセイ・ナヴォイコフ

コールバックは何のため?

まあ、スレッド全体が欲しいなら関数列で十分だし、イベントと連動させたいなら、コールバック

 
作品に(Marketは知らないが)不可視化機構が あるかどうか確認する。本気で「釣られる」ことも...。
 
古いトピック ですが、問題を理解するための非常にシンプルなコードです。

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

PositionOpenを呼び出した後、注文が実行されたことを確認する方法

fxsaber さん 2018.08.09 20:35

ForexTimeFXTM-Demo01 (またはFXOpen-MT5)にあるこのスクリプトを試してみてください。

#include <Trade/Trade.mqh>

void OnStart()
{
  const int PrevTotal = PositionsTotal();
  
  CTrade Trade;  
  
  while (PositionsTotal() == PrevTotal)
    Trade.Buy(1);    
}

新しいポジションが1つではなく、2つ空くこともあります。


スクリプトは新しいポジションを1つ開こうとしますが、時々2つ開くことがあります。

 
fxsaber
古いトピック ですが、問題を理解するための非常にシンプルなコードです。

スクリプトは新しいポジションを1つ開こうとしますが、2つ開くこともあります。

なんだか、QBにすでに解があったような気がしてきました。

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
bool IsUncertainStateEnv(const string symbol_name,const ulong magic_number)
  {
   if(MQLInfoInteger(MQL_TESTER)) return false;
   int total=OrdersTotal();
   for(int i=total-1; i>WRONG_VALUE; i--)
     {
      if(OrderGetTicket(i)==0) continue;
      if(OrderGetInteger(ORDER_TYPE)>ORDER_TYPE_SELL) continue;
      if(OrderGetInteger(ORDER_MAGIC)!=magic_number) continue;
      if(!OrderGetInteger(ORDER_POSITION_ID) && OrderGetString(ORDER_SYMBOL)==symbol_name)
         return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверка нулевых цен
   if(!RefreshRates() || Point()==0) return;
//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      if(FillingListTickets(num_attempts))
         prev_total=positions_total;
      else return;
     }

 
fxsaber
作品(Marketはどうなんだろう......わからない)に透明化機構が あるかどうかを確認する。本気で「捕まる」かもしれない...。

リンクをたどってみたが、問題の不可視化メカニズムがわからなかった。

 
アレクセイ・ナヴォイコフ

リンクをたどったが、不可視化の仕組みがよくわからなかった。

チャート上ではインジケータは非表示モードになっています。Expert Advisorを削除します。モバイルからざっと見た感じでは、そのように理解しました。

 
アレクセイ・ナヴォイコフ

リンクをたどったが、不可視化の仕組みがよくわからなかった。

取り外すことはできません。

理由: