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

 
Ihor Herasko:

はい、それは私も同じです。実際には2つのポジションがあるのに、スクリプトは1つのポジションを閉じることに成功し、PositionsTotal()は1を返します。そして、閉じた後、ループ終了条件、すなわちPositionsTotal()は2を返します。

プリントアウトを挿入して、十分に確認することができます。

 
fxsaber:

プリントアウトを挿入することで、十分に確認することができます。

はい、推論が正しいかどうかを確認するためです。

#include <Trade\Trade.mqh>

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

結果

2021.05.05 10:11:43.393 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.488 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.535 Test (EURUSD,M1)        CTrade::OrderSend: market sell 0.01 position #2249868517  EURUSD [position closed]
2021.05.05 10:11:43.535 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.615 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.697 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.777 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.859 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.941 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:44.023 Test (EURUSD,M1)        Открытие. PositionsTotal: 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

実は、このポジションは単独でぶら下がったままになっています。

P.S.コピーペーストのため、間違ったものをコードに入れたため、投稿を修正。
 
Ihor Herasko:

実際、このポジションはぶら下がったまま放置されていた。

ログを見ると、最後のトレードの 記録時刻が、スクリプトの終了の記録時刻に続いていると思われる。

また、OrdersTotalを印刷することも重要である。
 
fxsaber:

ログを見ると、最後の取引 記録の時刻が、スクリプトの終了記録の時刻に続いていると思われる。

この2枚のレコードのことでしょうか?

2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

注文の仕方については、ここですべて正しいと思います。実際には2つのポジションがありますが、PositionsTotal()はまだ更新を受けていません。したがって、1が返され、ポジションはクローズとなる。そして、取引操作の実行後、取引操作の実行前に対応する状態に更新される。だから、2が出るんです。

 
fxsaber:

この問題は、以前から議論されていた。ほとんどの人が遭遇したことがあるのではないでしょうか。安定した再現性のあるコードが見つかったのは、これが初めてです。

解決策が見つかりました。

そして、その解決策とは?

安定した再現性のあるコードを探すのに苦労した点は?開くか閉じるかのアクションと、市場や履歴のポジション数による 判断で次のアクションを行います。
 
Ihor Herasko:

この2つのエントリーを指しているのでしょうか?

いいえ、取引活動の最後の記録は2番目のログにあります。

 
fxsaber:

また、OrdersTotalを印刷することも重要である。

プリントを追加しました。これで、予想通り2つのポジションが残りました。

#include <Trade\Trade.mqh>

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

結果

2021.05.05 10:22:50.583 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.663 Test (EURUSD,M1)        После открытия. PositionsTotal: 0, OrdersTotal: 1
2021.05.05 10:22:50.679 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Dmitry Fedoseev:

その解決策とは?

ポジション数に基づいて 決定して次の。

苦労はなく、その場で書きました。

 

全く止まることなく、このようにポジションを開くことができます。

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(!Ordertotal)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

撮影者

 
SanAlex:

全く止まることなく、このようにポジションを開くことができます。

さて、誰が集計を更新するのでしょうか?))