記事"トレードロボットのプロトタイプ"についてのディスカッション - ページ 2

 

このデザインは避けることをお勧めする

//------------------------------------------------------------------ CheckNewBar
bool CExpertAdvisor::CheckNewBar()          // 新しいバーが現れるかどうかをチェックする機能
  {
   MqlRates rt[2];
   if(CopyRates(m_smb,m_tf,0,2,rt)!=2)      // バーをコピーする
     { Print("CopyRates of ",m_smb," failed, no history"); return(false); }
   if(rt[1].tick_volume>1) return(false);   // 音量をチェックする 
   return(true);
  }

前のティックの処理に時間がかかり、新しいバーの最初のティックの到着を見逃す可能性があるからです。

それぞれ、オープニングを見逃す可能性があります。

しかし、そのためには、たとえばゼロ・バーの前の時刻を保存しておき、ゼロ・バーの現在の時刻と比較する必要があります。

もし同じなら、新しいバーはありません。

異なる場合は、少なくとも新しい(次の)バーが開かれ、その後、保存されているゼロ・バーの時間をゼロ・バーの現在の時間で初期化します。

この構文はより信頼性が高い。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 

今後の記事で取り上げる:

  • *ネットワークやクライアントプログラムの停止(長時間のネットワーク切断、ネットワークラグによるスリッページ(および再クオート)、クライアントプログラムまたはオペレーティングシステムの終了、再起動、クラッシュ(クライアント側のソフトウェアの長期不在)など)に関連する問題を回避するために、これらは*必須*です;いわゆる "バーチャル "注文は、OCO以外の代用品も含め、それを使用することはできません。(堅牢性が要求される場合、損切り注文と利食い注文はサーバーサイドになければならず、一方がヒットした場合、もう一方も同時にサーバーによって削除されなければなりません。)
  • *言い換えれば、クライアント/OSがクラッシュした場合(そして自動的に再起動した場合)、その間に未決済の個々の取引と注文がどうなったかをEAが正確に把握できるようにしたい:満了、クローズ、まだ有効、関連するS/L注文とT/P注文がどの取引/注文に属しているかなどです。(取引開始とディスクへの状態書き込みの間に競合条件があり、クライアントプログラムがまさに不適切なタイミングでクラッシュする可能性があるため、状態をディスクに書き込むことは*できません*。)

私が知る限りでは、MT5は*1*(1つ)のサーバーサイドのs/lおよびt/p注文*商品ごと*(取引ごとではない)のみサポートしており、OCO注文はサポートしていません(OCO注文は取引ごとのs/lおよびt/p注文をシミュレートするために使用できますが、そこにも競合条件があります)。上記が解決されない限り、私はMT5(単純化された単一注文単一時間枠単一方向MAクロスタイプのEA)を介した取引に100ドル以上コミットしないでしょう。そして、100ドルについても確信が持てない。

 
olyakish:

このデザインは避けることをお勧めする

前のティックの処理に時間がかかり、新しいバーの最初のティックの到着を見逃す可能性があるからです。

それぞれ、オープニングを見逃す可能性があります。

しかし、そのためには、たとえばゼロ・バーの前の時刻を保存しておき、ゼロ・バーの現在の時刻と比較する必要があります。

もし同じなら、新しいバーはありません。

異なる場合は、少なくとも新しい(次の)バーが開かれ、その後、保存されているゼロ・バーの時間をゼロ・バーの現在の時間で初期化します。

この設計はより信頼性が高い。

私はこのようにしました:

bool CUniexp::checkNewBar(void)
{
   static datetime prevTime[1];
   datetime currentTime[0];
   CopyTime(_Symbol,_Period,0,1,currentTime);
   if (currentTime[0]==prevTime[0])
   {return (false);}
   else
   {
      prevTime[0] = currentTime[0];
      return (true);
   }
}
 
isNewBar
isNewBar
  • 投票: 7
  • 2010.05.07
  • Prival
  • www.mql5.com
Функция анализа появления нового бара на заданном таймфрейме.
 

Compiles but debugger fails.

Loading of C:¥Program Files¥MetaTrader 5¥MQL5¥Experts¥Examples¥eMyEA.ex5 failed

 
Rosh:

新しい記事「貿易ロボットのプロトタイプ」が掲載されました:

著者Алексей Сергеев


素晴らしい記事をありがとうございます!私は初心者ですが、コードについて質問があります。


関数void CExpertAdvisor::TrailingPosition(long dir,int TS)の中に1行あります:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // ストップロスの計算


NormalSLを呼び出すとき、第2引数と第3引数の両方にaprを使うべきでしょうか?と思ったのですが

sl=NormalSL(dir,op,apr,TS,StopLvl);

なぜなら、第2引数は「逆」方向(すなわち変数apr)ではなく、「指定された」方向(すなわち変数op)のビッド/アスク価格であるべきだからです。


ありがとう!

 
echostate:


関数 void CExpertAdvisor::TrailingPosition(long dir,int TS) の中に1行あります:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // ストップロスを計算する。


NormalSLを呼び出すとき、第2引数と第3引数の両方にaprを使うべきでしょうか?と思ったのですが

sl=NormalSL(dir,op,apr,TS,StopLvl);


第2引数と第3引数はaprでなければならない。

なぜなら、tralの計算はポジションが決済される価格から導かれるからです。 買いの場合はビッド、売りの場合はアスクです

なぜなら、第2引数は、「逆」方向(すなわち、変数apr)ではなく、「指定された」方向(すなわち、変数op)のビッド/アスク価格でなければならないからです。

は「逆」方向から計算されるべきである この場合、apr.
 
sergeev:


第2引数と第3引数はprでなければならない。

なぜなら、tralの計算はポジションが決済される価格から導かれるからです。 買いはビッド、売りはアスク。

は「逆」方向から計算されなければならない この場合、apr.


素早いご回答ありがとうございます!私の勘違いかと思いました。


関数の中で

double CExpertAdvisor::CountLotByRisk(int dist,double risk,double lot) // リスクの大きさでロットを計算する
  {
   if(dist==0 || risk==0) return(lot);
   m_smbinf.Refresh();
   return(NormalLot(AccountInfoDouble(ACCOUNT_BALANCE)*risk/(dist*10*m_smbinf.TickValue())));
  }

なぜ戻り値の "dist "と "m_smbinf.TickValue() "の間に "10 "があるのでしょうか?おそらく "dist "はストップロス(pips単位)で、"m_smbinf.TickValue() "は通貨ペアの 1ロットあたり1pipあたりの米ドル値だと思います。ですから、その間にもう一つ「10」を掛ける理由がよくわかりません。

ありがとうございます!

 
本当にありがとう。
 

とても役に立つ記事だ。本当にありがとう!