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

 
Andrey Khatimlianskii:

舌でしゃべっちゃダメなんだよ。教えてくださいよ。私、お願いします。

問題があるのは、この証券会社だけではありません。
そして問題は、特定の注文の実行を待つことではなく(それは別の問題です)、注文実行の 瞬間にすべてのリスト(オープン、クローズ、ディール、ポジション)から一時的に消えてしまうという事実なのです。

もちろん、別の松葉杖も使える。しかし、私たちは人間的な解決策を見出したいのです。そうしてfxsaberは、通りすがりの人たちの吠え声を聞きながら、公然と作業をしている。

個人的には、ドキュメントを理解していただければと思います

Expert Advisor が OnTradeTransaction() ハンドラを使用して取引を処理している間、端末は新たに到着した取引 の処理を継続します。したがって、OnTradeTransaction()の実行中に、すでに取引口座の状態が変化する可能性があります。例えば、MQL5のプログラムが新しい注文を追加するイベントを処理している間、その注文は実行され、開いているもののリストから削除され、履歴に移動することがあります。さ らに、これらの事象はすべてプログラムに通知されます。
で、これはOnTradeTransaction() イベントハンドラだけでなく、OrderSend() が送信された後のコードのどの部分にも当てはまります。トランザクションの完了を待ちます。なぜ、mql4ではこんなにシンプルなのか、考えてみてください。それは、その期待が、あなたの目から遠く離れたところに並べられているからです。そして、MQL5では、なんとなくすべてのチェックと期待がひつような気がするんですね。なぜ?
 
Alexey Viktorov:

個人的には、このようなドキュメントの言葉に対する十分な洞察力を持っていることを望みます

また、OnTradeTransaction() イベントハンドラだけでなく、OrderSend()が送信された後のコード部分にも 関係します。トランザクションの完了を待ちます。なぜ、mql4ではこんなにシンプルなのか、考えてみてください。それは、その期待が、あなたの目から遠く離れたところに並べられているからです。そして、MQL5では、なんとなくすべてのチェックと期待がひつような気がするんですね。なぜ?

アレクセイ、話がずれている。すみません、もう一度説明する時間も気もありません。

 

は、このように試してみました。

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

5回、私のコードを実行し、ちょうど10ポジションが開くまで

 
Igor Makanu:

は、このように試してみました。

私のコードを5回実行し、ちょうど10個のポジションが開くまで。

HistorySelectの 入力設定に誤りがあるようです。

 
fxsaber:

HistorySelectの 入力設定にエラーがあるようです。

サーバーに到達し、同期するためのアイデア

は、スクリプトとして書き直しました。

//+------------------------------------------------------------------+
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();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) 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);
}
//+------------------------------------------------------------------+

を数回実行し、10ポジションも開き、現在のスクリプトの開始時刻を追加 しました。

 
Igor Makanu:

サーバーに到達して同期させるという

は、スクリプトとして書き直しました。

数回実行し、10ポジションも開き、現在のスクリプトの開始時刻を追加 しました。

この変化は何を示すのでしょうか。

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

この変化は何を示すのでしょうか。


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh is On.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.Tst.mq5 16 in OnStart: TimeCurrent(),t_start] = 0, 1 <= Time[tst.mq5 16 in OnStart] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.Time.Time[tst.mq5 16 in OnStart] = 6 mcs.Time.Time(TimeSelect(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.Time.Mq5 16 in OnStart: TimeCurrent(),t_start] = 10 mcs.Time.Mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.Time[TimeStart(TimeCurrent(),t_start)] <= TimeStart(TimeCurrent())] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.Time.Time_Stack = 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.Time[tst.mq5 16 in OnStart] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.Time[tst.mq5 16 in OnStart] = 4 mcs.Time[tst.mq5 16 in OnStart] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.Time.Mq5 16 in OnStart: TimeCurrent(),t_start] = 3 mcs.Time.Mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.Time.Mq5 16 in OnStart: TimeCurrent(),t_start)] = 4 mcs.Time.Mq5 16 in OnStart: TimeCurrent(),t_start)] = 1 mcs.

ポジションはまだ10pcsで、2倍にはなっていない
 
Igor Makanu:

ポジションはまだ10個で、倍増はまだない

HistorySelectの実行時間は、Tradeサーバーに何も要求していないことをよく表しています。


いくつかのバージョンがあります。

  1. あなたは幸運です。
  2. このブランチは、Terminalの新しいビルドに静かな変化をもたらしました。旧来のものに反動があれば確認しやすいんだけどね
  3. From >= To の場合、HistorySelect の異常な動作。
  4. トレードサーバー名前は?


ここでも同じようにダブリを解消してみてください。

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

MT4フォーエバー大全(あるいは乗り換えのための正しい戦略の立て方)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

このコードを空のデモ口座で実行し、数秒後に2つのポジションが開くかどうかを確認します。

 

たまたま来て読んでみたのですが、残念です !

誰も信用してはいけない
 
fxsaber:

HistorySelectの実行時間から、Tradeサーバーに何も要求していないことがよくわかります。


いくつかのバージョンがあります。

  1. あなたは幸運です。
  2. このブランチは、Terminalの新しいビルドに静かな変化をもたらしました。旧来のものに反動があれば確認しやすいのですが。
  3. From >= To の場合、HistorySelect の異常な動作。
  4. トレードサーバー名前は?


ここでも同じようにダブリを解消してみてください。

1.残念ながら、これなしでは私たちのビジネスは成り立ちません ))

2.私は数日前にどのようなビルド(ベータ版ではない)が関連している尋ね、沈黙、私はラップトップとPC上でそれはビルドが関連しているかを理解するのは難しいです、更新しないことにしました - 私は数ヶ月のための端末で作業していない、私は従っていません。今度はPCのビルド2903で。

3.パスします、この宴の担当はあなたです、開発者は黙っています、私の推測ですが...。空に親指、私は問題は、ネットワークの待ち時間にあると思うし、複数のソケット? 端末、ない同期、1ソケット価格、別のOrderSend、別のどこにOnTrade()...ので、パケットはどこからどこまで飛んできている

4. 現在、robotforex + 100 mbpsの光(ETTH)を使用していますが、モバイルインターネットとラップトップでのfhopinの調子が悪かったのです。


2分間試したところ、スクリプトが2分間空回りし、常に1ポジション、反転なし、手でスクリプトをはずした

理由: