#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); // Если нет позиции и ордера - открываем позицию.Print(Trade.ResultRetcodeDescription());printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
#define PRINT(A) Print(#A + " = " + (string)(A))
#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); // Если нет позиции и ордера - открываем позицию.
PRINT(Trade.ResultRetcodeDescription());
PRINT(Trade.ResultDeal());
PRINT(Trade.ResultOrder());
PRINT(Trade.ResultComment());
printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
結果
2021.05.0511:36:14.566 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultRetcodeDescription() = done at 0.000002021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultDeal() = 02021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultOrder() = 22498746452021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultComment() = Request executed
2021.05.0511:36:14.646 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 12021.05.0511:36:14.646 Test (EURUSD,M1) Выход. PostionsTotal: 2
いいえ、取引活動の最後の記録は2番目のログにあります。
そして、これは優先順位の点でも正しいのです。
ここでは、プリントなしのオプションに戻しましたが、ここでも実行後にポジションが1つ残っています。トレードが 実行された後、何らかのポーズをとる必要があることがわかりました。男、なんという松葉杖。
さて、誰がアップデートするのでしょうか?))
しかし、オープンポジションがある場合、スクリプトはそれを閉じ、他の何もしません。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
また、ポジションを開こうとすると、スクリプトは即座にそれを閉じます。
はIsSynchronized()を書くようにした。コードがちょっと重いんです。 どのような形で掲載するかはまだ決めて いません。
どのように機能するのですか?見つかったようで見つからなかったような?解決策の要点や原理は何ですか?
しかし、オープンポジションがあると、スクリプトはそれをクローズし、それ以外のことは何もしません。
すべてのサーバーで2ポジションの開放が再現されるわけではありません。あなたの場合は、3面(片面-2ポジション、もう片面-1ポジション)です。
そして、配列的にもそれくらいがちょうどいい。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MT4フォーエバー大全(あるいはマイグレーション戦略の選び方)
イホール・ヘラスコ, 2021.05.05 09:35
しかも、注文の仕方もここに書いてある。
ハイライトされた線は、シーケンスを確認するものです。
PositionsTotal= 1 - クローズするためのオーダーを送信します。
スクリプトの実行が完了した後に終了します。Print-cacheが少し歪んでいる。
どうしてですか?見つかったようで、なかったような?
まだ投稿できていません。24時間以内に掲載します。
ソリューションの本質や原理は何なのか?
取引履歴と現在の取引環境との対応関係を分析するものです。この場合、スローはありません。
また、Result.orderをチェックします。
その結果、IsSync() が false を返す - ターミナルの取引環境が曲がっている、それ以外は通常通り進められる、という使い方ができるようになりました。
プリントを追加しました。これで、予想通り2つのポジションが残りました。
結果
Add Trade.ResultRetcodeDescription()
ResultDeal / ResultOrder / ResultCommentと Orderも。状態
きっと、そこに答えがあるはずだ
状態Add Trade.ResultRetcodeDescription()
また、ResultDeal / ResultOrder / ResultCommentと Order。状態
きっと、そこに答えがあるはずだ
状態完了しました。
結果
Add Trade.ResultRetcodeDescription()
また、ResultDeal / ResultOrder / ResultCommentと Order。状態
きっと、そこに答えがあるはずです。
状態ポジションを開くために成行注文を出す条件は、PositionsTotal == OrdersTotal == 0なので、これは絶対にありえません。