偉大で恐ろしいMT4の永遠(または移行の戦略方法) - ページ 24

 
Artyom Trishkin:
ロシア語で?スペイン語で?英語で?どれだ?

端末がサポートするすべての言語で自然に

形式は問わない。コンストラクタがパラメータとして言語を取得するクラスの形式でSBを作成することができる。

または、GetTxtErrDescription_RU()を末尾に持つカスタム関数のグループとすることができます。

あるいは、GetLastError() のような通常の関数でもよい。

よろしければ


私の地位では、普遍的な幸福の面倒を見ることはできません。

 

ポジションが2倍になっている理由を推測してみました)))CodeBaseに2つのライブラリを配置したため)))


 

GetTickCount()はいかがでしょうか。Sleepと違ってコード全体が遅くなることはありませんし、Pingが高い場合は少なくとも500msを追加することができます。

私のマルチシンボルでは、OrderSendの 後、各ペアごとに別々のカウンタが起動し、残りのロジックは引き続き動作します。

void OnStart()
  {
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
//---
   while(1 && !IsStopped())
     {
      static uint LastOnCalculate = GetTickCount();
      if(GetTickCount() - LastOnCalculate > 5)
         //---
        {
         BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         OrderSend(BuyRequest, result);
         LastOnCalculate = GetTickCount();
         continue;
        }
      if(PositionGetTicket(0) > 0 && PositionsTotal() >= 10)
        {
         Sleep(100);
         Print(PositionsTotal());
         return;
        }
     }
  }
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
  {
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
  }
//+------------------------------------------------------------------+
 
Fast235:

GetTickCount()は、Sleepと違ってコード全体が遅くなることもなく、pingが高い場合は最低でも500msは使えると思うのですがいかがでしょうか。

アクティブループで、プロセッサを食ってしまうんです。この種のExpert Advisorが50個もターミナルにあったらどうする?1つのシンボルに8つあり、8つともヘアピンで注文を送ることになります。

 
traveller00:

アクティブなサイクルで、CPUを食ってしまうんです。このようなExpert Advisorが50個もターミナルにある場合はどうでしょうか。1組に8人いて、ヘアピンでは8人全員がオーダーを出す。

半瞬だけ起動し、注文が送信さ れた後にのみ、そのためのコマンドがなく、最初にオープンポジションの存在をチェックします。

私は私のコードを最適化し、それが速くなり、一度に2つのポジションを開くようになりました)最初はスリープが助け、それは物事を遅くしていた、私は7文字を持っています。
 
fxsaber:

私自身はまだMT4-styleを試していないのですが、理論的にはうまくいくはずです。まだ見る機会がないのですが。

効くんです。2つのバージョン(位置待ちあり・なし)を比較したのが面白かったです。


OrderSend 後のポジション待ちで。

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


ポジションを待つことなく、すぐに結果を出すことができます。

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


2つ目のバリエーションの方が速いのは確かでした。実行時間では同等であることが判明した。


位置 ByPass.Is() を待つ場合、コードは1回 false を返し、待たない場合は740回を返しました。全体として、松葉杖が効いているようです。

 
これが唯一の解決策と思われる。

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

偉大で恐ろしい永遠のMT4(または移行戦略の構築方法)

イゴール・マカヌ さん 2021.05.10 10:28

が効くようです。

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 30)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 30) return;
   }
}

しかし、非常に遅く、解像度はまあまあです。

スピードもまずまず。同期不足 37回

 
fxsaber:

スピードは普通です。同期不足 37回

fxで確認したところ、このスクリプトは10個の注文を5回速く開き、前回はデモで10秒開いたときに速く、注文の終了も速くありませんでした。

11143290の注文のログの傷はこちらです。

LL 0 11:19:31.444 Trades '20615687': order #11143290 buy 0.1 / 0.1 EURUSD at market done in 1580.643 ms.

PO 0 11:19:33.621 トレード '20615687': ディール #1865643 buy 0.1 EURUSD at 1.21460 done (based on order #11143290).

CL 0 11:19:33.622 取引 '20615687': 成行買い 0.1 EURUSD

JF 0 11:19:33.679 トレード '20615687': マーケットバイ 0.1 EURUSD を受理しました。

QO 0 11:19:33.679 取引 '20615687': 成行買い 0.1 EURUSD が実行のために置かれました。

KM 0 11:22:41.224 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

DR 0 11:22:41.280 Trades '20615687': accepted market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 トレード '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 placed for execution.

ON 0 11:22:43.824 トレード '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

DO 2 11:22:43.880 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 [Order to close this position already exists] [このポジションの決済注文は既に存在します。

JN 0 11:22:46.280 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

OL 2 11:22:46.336 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 [Order to close this position already exists] [このポジションの決済注文は既に存在します。

 
Igor Makanu:

今、fxで確認しました...n。

そのサーバーを見てみないとね。ここで提案された松葉杖が 重要と思われる方は、一度確認されると良いと思います。

しばらくしてこの話題に戻ってくるのは、非常に不本意なことです。バグがあればすぐに指摘したほうがいい。

 
fxsaber:

このサーバーを見てもらわなければなりませんね。ここで提案された松葉杖が 重要と思われる方は、一度確認されると良いと思います。

しばらくして、この話題に戻るのはもったいない。バグがあればすぐに指摘したほうがいい。

PMでは、サーバーを落としました