// --- определение границ требуемой торговой историиdatetime end=TimeCurrent(); // текущее серверное времяdatetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад
Получение информации по ордерам из истории
Работа с историческими ордерами почти ничем не отличается от работы с действующими ордерами за одним только исключением. Если количество действующих ордеров в кэше mql5-программе не может быть больше одного, то результат HistoryOrdersTotal() и количество исторических ордеров в кэше зависит от того, какой объем торговой истории был загружен функцией HistorySelect(start, end), HistorySelectByPosition() или HistoryOrderSelect().
Важно: если торговая история не была загружена в кэш mql5-программы одной из функций HistorySelect(), HistorySelectByPosition() или HistoryOrderSelect(), то работать с историческими ордерами и сделками невозможно. Обязательно запрашивайте требуемую историю сделок и ордеров перед получением данных по торговой истории.
Для примера приведен скрипт, который ищет последний ордер за последний день и выводит по нему информацию.
// --- определение границ требуемой торговой историиdatetime end=TimeCurrent(); // текущее серверное времяdatetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад//--- запросим в кэш программы торговую историю за деньHistorySelect(start,end);
//--- получим количество ордеров в историиint history_orders=HistoryOrdersTotal();
//--- получим тикет ордера из истории, имеющего последний индекс в спискеulong order_ticket=HistoryOrderGetTicket(history_orders-1);
if(order_ticket>0) // получили в кэш исторический ордер, работаем с ним
{
//--- статус ордераENUM_ORDER_STATE state=(ENUM_ORDER_STATE)HistoryOrderGetInteger(order_ticket,ORDER_STATE);
long order_magic =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
long pos_ID =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
PrintFormat("Ордер #%d: ORDER_MAGIC=#%d, ORDER_STATE=%d, ORDER_POSITION_ID=%d",
order_ticket,order_magic,EnumToString(state),pos_ID);
}
else// неудачная попытка получения ордера
{
PrintFormat("Всего в истории %d ордеров, не удалось выбрать ордер"+
" с индексом %d. Ошибка %d",history_orders,history_orders-1,GetLastError());
}
Надежный торговый робот не может быть создан без понимания механизмов работы торговой системы MetaTrader 5. Клиентский терминал получает от торгового сервера информацию о позициях, ордерах и сделках. Чтобы правильно обработать эти данные средствами MQL5 необходимо хорошо представлять как происходит взаимодействие mql5-программы и среды исполнения терминала.
しかし!FORTSで作業する場合、位置情報に頼ってはいけません。
私のロボットは取引を記録し、最初のポジションの開始価格を記憶し(最後の清算後ではない)、それを使って利益、SL、...を計算します。
ちなみに、ポジションデータに頼らないもう一つの理由は、FORTSはネット取引で、同じシンボルで複数のロボットが取引でき、さらにマニュアル取引も可能だからです。そして、この複合的な立場から、現実的に何が役に立つのか。
だから、各ロボットは自分の位置を記憶し、「リード」するのです。
示しました。 この最後の平均価格とポジションのボリューム、新しいトレードの価格とそのボリュームを取ります。すべてが正しく計算されます。
ちなみに、ポジションデータをあてにしないもう一つの理由は、FORTSはネット取引であり、複数のロボット+マニュアル取引で同じシンボルで取引できることです。そして、この複合的な立場から、現実的に何が役に立つのか。
だから、各ロボットは自分の位置を記憶し、「リード」するのです。
エスピーシーそこに自然にすべてのこれらの市場の取引と位置はSONARELY?(一方向に)ですか?
ロボットは、トレンドとカウンタートレンドという異なる戦略を持つことができ、異なるタイムフレームで動作することができるので、ポーズはどちらの方向にもなりえます。そして、MTでは「合計」しか見ることができません。
ロボットは、トレンドとカウンタートレンドという異なる戦略を持つことができ、異なるタイムフレームで動作することができるので、ポーズはどちらの方向にもなりえます。そして、MTでは「合計」しか見ることができません。
つまり、基本的には各方向に専用の取引記録をつけておけばいいのです...。:-)
もちろん、これは大変なことですが...。all virtual - all the plus and minuses.共通するのは1つのポジションだけ...。ネッティング。
確かにあざといですねー、1つの楽器で全部やると...。
つまり、基本的にはビジネス・ラインごとに専用の取引記録を作成すればよいのです...。:-)
もちろん大変ですが...。すべてがバーチャルになる - その長所と短所。共通するのは1つのポジションだけ...。ネッティング。
もちろん、コケるんですけどね......1つの楽器で全部やると......。
でも、ここにはあまり選択肢がない。シンボル上の1つの「理想的な」ロボット、または分散 - 複数の本物のロボットのいずれかです。
それに、ここにはあまり選択肢がないんです。シンボル上の1つの「完璧な」ロボットか、分散 - 複数の本物のロボットのどちらか。
一般論として、清算後の集合ポジションでの始値の移動の他に、取引時に注意すべき「隠れた」落とし穴があるとすれば、どのようなものがあるでしょうか。
本来は手数料、スワップがあるのですが......ご覧の通りですね。そして、取引や役職の歴史も数え上げればきりがない...。(それは取引アルゴリズムによると、実際の位置またはその部分であるように - 唯一のプラスであった!)
その他、トレードの際に気をつけるべきことはありますか?
一般的な質問ですが、清算後のポジションの始値の移動以外に、取引時に気をつけるべき「隠れた」落とし穴はありますか?
本来はコミッション、スワップがあるのですが......ご覧の通りです。そして、取引や役職の歴史も数え上げればきりがない...。(それは取引アルゴリズムによると、実際の位置またはその部分であるように - 唯一のプラスであった!)
その他、トレードの際に気をつけるべきことはありますか?
取引で目に見えるその手数料は、あくまでも取引所の手数料である。仲介手数料は、取引では見えません。少なくとも、それを開くブローカーにとってはそうなのだ。
OnTrade(またはOnTradeTransaction)で取引を見て、すぐに計算してStateとログに書き込んでいます。
念のため付け加えますが、1つの注文で部分的に複数の取引が発生する可能性があることを念頭に置いておく必要があります。
取引で目に見える手数料は、あくまで取引所の手数料です。仲介手数料は、取引では見えません。少なくとも、オープナーではそうです。
OnTrade(またはOnTradeTransaction)で案件を探し、すぐに計算してステートとログに書き込む。
念のため付け加えますが、1つの注文で部分的に複数の取引が発生する可能性があることを念頭に置いておく必要があります。
また、組織的な問題もあります。もし、それを解決する最良の方法を知っている人がいたら、ぜひ言葉で書いてください。
一般的に、どのように注文サイクル、新しいポジションを理解する - PROFITが開始されました - アカウントに位置の平均開始価格を取るために(クリアは、その値を変更します)。
はっきり言って、端末から自分でキーで操作するのも、マジックを持ったロボットで操作するのも、どちらも可能なのですが......。
一般的に、私はレポートポイントが必要です - ポジションの平均エントリー価格を計算するために。
ロボットなしでターミナルからサイクルを開始するように、ここからデータを使用して、例えば、前のポジションが利益でクローズした時間を読み取り、そこから実際のサーバーの時間との差を取ることはできますか?
こんな感じの意味です。
過去のポジションがプラスになっているように - では、現在のサイクル会計はすでに始まっています。そして注文 - 集計ポジションの平均エントリー価格を計算するためには、すでにエントリー価格とボリュームの両方をカウントする必要があります...https://www.mql5.com/ru/articles/211
--------------------------------------------------------------
もちろん、理想的には、前のサイクルの結果(利益や損失)に関係なく、クローズすることが望ましい。
開始 - 新しいものは、コード内の計算のためにマークされた - 平均の新しい現在のサイクルの平均価格、例えば、またはフィル - それは重要ではありません...