#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
Print("Открытие. PositionsTotal: ", PositionsTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
結果
2021.05.0510:11:43.393 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.488 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.535 Test (EURUSD,M1) CTrade::OrderSend: market sell 0.01 position #2249868517 EURUSD [position closed]
2021.05.0510:11:43.535 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.615 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.697 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.777 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.859 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.941 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:44.023 Test (EURUSD,M1) Открытие. PositionsTotal: 12021.05.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:44.101 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
結果
2021.05.0510:22:50.583 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.663 Test (EURUSD,M1) После открытия. PositionsTotal: 0, OrdersTotal: 12021.05.0510:22:50.679 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(!Ordertotal)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
はい、それは私も同じです。実際には2つのポジションがあるのに、スクリプトは1つのポジションを閉じることに成功し、PositionsTotal()は1を返します。そして、閉じた後、ループ終了条件、すなわちPositionsTotal()は2を返します。
プリントアウトを挿入して、十分に確認することができます。
プリントアウトを挿入することで、十分に確認することができます。
はい、推論が正しいかどうかを確認するためです。
結果
実は、このポジションは単独でぶら下がったままになっています。
P.S.コピーペーストのため、間違ったものをコードに入れたため、投稿を修正。実際、このポジションはぶら下がったまま放置されていた。
ログを見ると、最後のトレードの 記録時刻が、スクリプトの終了の記録時刻に続いていると思われる。
また、OrdersTotalを印刷することも重要である。ログを見ると、最後の取引 記録の時刻が、スクリプトの終了記録の時刻に続いていると思われる。
この2枚のレコードのことでしょうか?
注文の仕方については、ここですべて正しいと思います。実際には2つのポジションがありますが、PositionsTotal()はまだ更新を受けていません。したがって、1が返され、ポジションはクローズとなる。そして、取引操作の実行後、取引操作の実行前に対応する状態に更新される。だから、2が出るんです。
この問題は、以前から議論されていた。ほとんどの人が遭遇したことがあるのではないでしょうか。安定した再現性のあるコードが見つかったのは、これが初めてです。
解決策が見つかりました。
そして、その解決策とは?
安定した再現性のあるコードを探すのに苦労した点は?開くか閉じるかのアクションと、市場や履歴のポジション数による 判断で次のアクションを行います。この2つのエントリーを指しているのでしょうか?
いいえ、取引活動の最後の記録は2番目のログにあります。
また、OrdersTotalを印刷することも重要である。
プリントを追加しました。これで、予想通り2つのポジションが残りました。
結果
その解決策とは?
ポジション数に基づいて 決定して次の。
苦労はなく、その場で書きました。
全く止まることなく、このようにポジションを開くことができます。
全く止まることなく、このようにポジションを開くことができます。
さて、誰が集計を更新するのでしょうか?))