//+------------------------------------------------------------------------------------------------------------------+//| Проверяет изменение плеча и сообщает если это было//+------------------------------------------------------------------------------------------------------------------+void leverageCheck()
{
if(MarketInfo(Symbol(), MODE_MARGINREQUIRED) == 0) return;
// --- получаем текущее плечо из маржинальных требований, стоимости пункта, тек.котировкиdouble leverageSymb = MarketInfo(Symbol(),MODE_TICKVALUE) * Bid / MarketInfo(Symbol(),MODE_MARGINREQUIRED) / Point;
leverageSymb = int(MathRound(leverageSymb));
// --- если плечо по символу стало меньше на 10% плеча по счету отметим этоif(leverageSymb < percVar(AccountInfoInteger(ACCOUNT_LEVERAGE), -10))
{
string txt = TimeToString(TimeCurrent()) + " Leverage is reduced 1:" + (string)leverageSymb;
Print(txt, " but account leverage = " + (string)AccountInfoInteger(ACCOUNT_LEVERAGE));
// --- вывод информации на график
}
}
//+-------------------------------------------------------------------------------------------------------------------+//| Получает переменную, увеличивает или уменьшает его на переданный процент и возвращает новое значение//| Чтобы уменьшить, нужно передать percent с минусом//+-------------------------------------------------------------------------------------------------------------------+double percVar(double var, double percent)
{
return var*(1 + percent/100);
}
MT4では、口座のレバレッジが変更されたかどうかを(再接続せずに)知る方法がないようです。
MT4では、口座のレバレッジが変更されたかどうかを(再接続せずに)知る方法がないようです。
5年前くらいにやりました。クライアントのレバレッジが特定の時間帯で減少し、変数AccountInfoInteger(ACCOUNT_LEVERAGE)で変化しなかった。そして、彼はそれを知る必要があった。
科学的なことはわかりませんが、めったに変わらない口座レバレッジと、1日に何度も変わる可能性のあるシンボルレバレッジがあると判断しています。
このように確認しました。
leverageSymb シンボルで計算したレバレッジが200ではなく、199や198になることがある(レバレッジが1:200の場合)。そのため、標準的なレバレッジから一定の%を引いて、この値と比較する必要があったのです。上の解答はその時役に立ちました、便利かもしれません。
5年前くらいにやったんですけどね。あるクライアントが特定の時間にレバレッジを下げましたが、AccountInfoInteger(ACCOUNT_LEVERAGE) 変数には何の変化もありませんでした。そして、彼はそれを知る必要があった。
科学的なことはわかりませんが、私は、ほとんど変化しない口座レバレッジと、1日に何度も変化する可能性のあるシンボルレバレッジがあると判断しています。
このように確認しました。
leverageSymb シンボルで計算したレバレッジが200ではなく、199や198になることがある(レバレッジが1:200の場合)。そのため、標準的なレバレッジから一定の%を引いて、この値と比較する必要があったのです。そこで、上記のような解決策が役に立つかもしれません。
はい、シンボルの必要証拠金を追跡することに問題はありません。ACCOUNT_LEVERAGE - 再接続のみ。
チケットリストに必要な注文を記憶させ、取引履歴をフィルタリングすることは、ごく一般的なことです。そして、そのリストにあるSELECT_BY_TICKET。
チケットではなく、ポジションを記憶しているバリエーションは見たことがない。以下は、性能の比較です。
チケットのバリエーションは、ほぼ3倍のパフォーマンスで負けていることがわかります。
チケットのバリエーションは、ほぼ3倍のパフォーマンスを失っていることがわかります。
ポジションがクローズ/オープンされた場合、チケットのロジックは壊れませんが、ポジションのロジックは壊れる可能性があります。
ポジションがクローズ/オープンされた場合、チケットのロジックは壊れませんが、ポジションのロジックは壊れる可能性があります。
MODE_HISTORYモードについてだけです。
このコードでは、関数が呼ば れる前と後に存在したいくつかの順序を見逃すことは理論的に可能でしょうか?それとも2回カウントされるのでしょうか。
つまり、オーダーが削除されたり、列挙中に現れたりした場合、インデックス作成はどうなるのでしょうか?
または2回カウントされます。
デフォルトの時間順、チケット順を前提とすると、新しいオーダーはリストの最後に表示され、論理的には最も古いオーダーが削除されるとすべて移動することになります。
リストの先頭から順番に削除していくと、リストの1つが2回考慮されることが判明しました。 前のパスのチケットを覚えておいて比較すればよいので、回避は簡単そうです(それでも保証はありません)。
リターンパスの取得方法 - 未解明
デフォルトの時間順、チケット順を前提とすると、新しいオーダーはリストの最後に表示され、論理的には最も古いオーダーが削除されるとすべて移動することになります。
リストの先頭から順番に削除していくと、リストの1つが2回考慮されることが判明しました。 前のパスのチケットを覚えておいて比較すればよいので、回避は簡単そうです(それでも保証はありません)。
リターンパスの取得方法 - 解決していない
詳しいお返事ありがとうございましたそこで今、どうすればすべての注文を一度に処理できるかを考えています。