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

 
Andrey Khatimlianskii:

OrderClose は取引を終了することが保証されていますか?

保証するものではありませんが、コードにチェックが入っています。各 OnTick 呼び出しは、前の呼び出しから独立しています。

 
fxsaber:

保証するものではありませんが、この場合のためにコードにチェックが入っています。各 OnTick 呼び出しは、前の呼び出しから独立しています。

OK、次のティックで閉じればOKです。

 
Artyom Trishkin さん、@Andrey Khatimlianskii さん、ご参加ありがとうございました。MT5のコードについて、誰もコメントしていないのが残念です。どうやら、何も問題ないと思っているようだ。
 
fxsaber:
Artyom Trishkin さん、@Andrey Khatimlianskii さん、ご参加ありがとうございました。MT5のコードについて 誰もコメントしていないのが残念です。どうやら、何も問題ないと思っているようだ。

もちろん、この例は、MT5ですべてがうまくいっているわけではないことを答えるために出されたものです。問題を示す例

// Пример неправильного считывания торгового окружения на каждом тике
// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
  int Res = 0;
  
  // Этот MQL5-код с ошибкой
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if (PositionGetSymbol(i) == Symb)
      Res++;

/*
  // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/      
  return(Res);
}

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (!GetAmountPositions(_Symbol))
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

このスクリプトをポジションのないシンボルで実行した場合、最終的にどうなると思いますか?

正解は、1つまたは2つのポジション が空くということです。

 
fxsaber:

もちろん、この例は、MT5ですべてがうまくいっているわけではないことを答えるために出されたものです。問題を示す例

このスクリプトをポジションのないシンボルで実行した場合、最終的にどうなると思いますか?

正解は、1つまたは2つのポジション が空くということです。

その結果、KodobaseのMT5 Expert Advisorの大半は、正しく記述されていないのです!

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

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

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

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

偶然このスレッドに来たのですが、実は攻略テンプレートについて議論するスレッドを立ち上げたかったのです。あなたのテンプレートは私が正しいと思うものに十分近い(私にとって読みやすい)のですが、それでも私は、ある関数の呼び出しがOnTickに挿入されると、全体のマイニングミルを隠してしまうのが嫌なのです。

一時は「MetaEditor: Relying on the power of templates」まで書きました。 その後、言語が変わり、テンプレート・エディターは ありません。この問題について議論し(別スレッドでもよい)、また、記事にしてもらえると面白いのですが。私は、コードを書くときは、クラスやマクロのメソッドに入り込むことなく、一目でストラテジーを読めるようにすることを心がけるべきだと考えています。

 
fxsaber:

その結果、KodobazのMT5 Expert Advisorの大半は、正しく記述されていないのです。

いつものように - 断言します。あなたのコードを読んでいないのですが、そんなはずはありません。

 
Rashid Umarov:

以前から攻略テンプレートについて議論するスレッドを立ち上げたいと思っていました。あなたのテンプレートは私が正しいと思うものに近い(私にとって読みやすい)のですが、OnTickにある関数の呼び出しが挿入され、マイニングミル全体が隠されてしまうのはやはり嫌なものです。

OnTick == Strategy にすると、テンプレートがとんでもない大きさに縮小/縮んでしまいます。

一時はMetaEditor: Building on the power of templatesという 記事も書きました。 それ以来、言葉が変わり、テンプレート・エディターは ありません。この問題について議論し(別スレッドでもよい)、また、記事にしてもらえると面白いのですが。私は、コードを書くときは、クラスやマクロのメソッドに入り込むことなく、一目でストラテジーを読めるようにすることを心がけるべきだと考えています。

両プラットフォームのテンプレートはこのように表示されました。MT5にとっては根本的に間違っているのですが、あまりにもシンプルなので、なかなか議論になりません。でも、CExpertがあるじゃないですか。自分では見ていないのですが......怖いですね。

 
Rashid Umarov:

いつものように - カテゴリ別あなたのコードを読んで いないのですが、そんなはずはありません。

読んでくださった、あなたの意見はとても興味深いです。

 
fxsaber:

もちろん、この例は、MT5ですべてがうまくいっているわけではないことを答えるために出されたものです。問題を示す例

このスクリプトをポジションのないシンボルで実行した場合、最終的にどうなると思いますか?

正解は、1つまたは2つのポジション が空くということです。

また、GetAmountPositionsを標準のOnTradeTransactionに 置き換えた場合?

おおよそこのような感じです。

#include <Trade/Trade.mqh>
  int Res = 0;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
   {
    /******************** Если открылась позиция********************/
    if(PositionSelectByTicket(trans.position))
     Res++;
    /******************** Если закрылась позиция********************/
    if(!PositionSelectByTicket(trans.position))
     Res--;
   }
}/*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (Res == 0)
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}
理由: