ライブラリ: MT4Orders - ページ 81

 

define MT4ORDERS_FASTHISTORY_OFFディレクティブを有効にすると、コンパイルできません。

以前、私はこのディレクティブを有効にしなければならなかったが、それはこの記事で使用されているいくつかの機能(ここで 議論されている)が、このディレクティブなしでは使用できないからである。もしまだ機能が低下しているのであれば、修正することが望ましい。

Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
  • 2019.09.27
  • www.mql5.com
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
 
Stanislav Korotky #:

define MT4ORDERS_FASTHISTORY_OFFディレクティブを有効にすると、コンパイルできません。

これは歴史的な名残で、どうにも取り除くことができない。

MQは多くの頭痛の種を作り出したので、騙された亜種しか使う価値がない。

バグ報告が妙に少ないが、ライブラリのメジャーアップデートがあるはずだ。まだ準備ができていない。

 
OrderSelect(i, SELECT_BY_POS)

この操作では、下位の指数には常に未決済のポジションがあり、上位の指数には未決済の注文が あります。

この事実を利用すれば、必要なMT4注文の検索を多少早めることができます。

 

その可能性はないはずのスピードでテスターに勝つことは可能なのだろうか?

私は「チャンスなし」のエキスパート・アドバイザーを書きました。

#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

input int inAmountMagics = 50; // エミュレートするTCの数

// 各TSに対してポジションと注文をオープンする。簡潔にするためMT4コード。
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

// 正しいポジション/注文から情報を収集する。最高速のMT5コード。
double CountOrders( const int Type, const int Magic )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = PositionsTotal() - 1; i >= 0; i--)
      if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = OrdersTotal(true) - 1; i >= 0; i--)
      if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// 代替実装の正しさを管理するための番号。
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  // すべてのTCで動作をシミュレートする。
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) + 
                     CountOrders(POSITION_TYPE_SELL, i) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i);  
}

コードを見れば、遅いと思うかもしれません。しかし、このコードは多くの「TS」の動作をエミュレートしている。そして、多くのTSは全く同じように動作します - まず第一に、彼らはポジション/注文を見つけます。

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
約定まで81秒。実際のダニの1日のために何か非常に。しかし、そこに何がある。
 
fxsaber #:

完了まで81秒。実際の刻みで1日分というのは多い。しかし、それが何なのか。

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ:仮想

fxsaber、2023.03.01 20:36

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:46.653 (including ticks preprocessing 0:00:00.016).

チェックサムが一致しました。 近くスピードアップできました。

簡単ではありませんが、うまくいきました。

 
fxsaber #:

ノーチャンス "EAを書いた - スピードを最大限に最適化した。

スピードを上げる簡単な方法
 

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ: MT4Orders

fxsaber, 2022.07.20 00:39

// 変更リスト:
// 20.07.2022
// 追加:OrderLotsOpen() を追加 - 決済/削除前にポジション/注文の全量を表示。ByPass-modeでのみ正しく動作します。

同じ例(1ロットをオープンし、0.1、0.2、0.3、0.4ロットで徐々にクローズ)を使用していますが、異なるビジュアライゼーションを使用しています。


画像上部の赤枠のOrderLotsOpen()
 

こんにちは、

OrderTicket()にバグがあるようです。

それはMT5の履歴から正しいチケットではありません。


これは私のコードです:

bool isCopyHistory2(string u_symbol, int master_ticket)
  {

   int ticket_copy;

   bool is_exists = false;

// 取引履歴から情報を取り出す

   for(int i = 0; i < OrdersHistoryTotal(); i++)
     {
      //---- 選択結果をチェックする

      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
        {
         Print("Access to history failed with error (", GetLastError(), ")");
         continue;
        }

      // オーダーを少し変更

      ticket_copy = (int)extract_master_ticket(OrderComment());

      if(ticket_copy == master_ticket)
        {
	//print-for-debug
        Print("c ticket: ", OrderTicket());  // これはMT5では正しいチケットではありません。
         is_exists = true;
         break;
        }

     }

//---

   if(!is_exists)

      Print("New Signal #" + (string)master_ticket);

   return(is_exists);

  }

 
Cuong Le Van #:

OrderTicket()にバグがあるようです。

MT5の履歴から正しいチケットではない

どうやら入手したいようだ。

// 変更点のリスト:
// 13.03.2019
// 追加OrderTicketID()を 追加 - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.

理由はこちらに 詳しい。

 
fxsaber #:

どうやら、あなたはそれを手に入れたいようだ。


その理由はここに 詳しい。

ありがとうございます。

でいいんだ。

OrderTicketID()