struct MqlTradeTransaction
{
ulong deal; // Тикет сделкиulong order; // Тикет ордераstring symbol; // Имя торгового инструментаENUM_TRADE_TRANSACTION_TYPE type; // Тип торговой транзакцииENUM_TRADE_ACTION action, // Тип события, по какой причине выставлен ордер
ENUM_ORDER_TYPE order_type; // Тип ордераENUM_ORDER_STATE order_state; // Состояние ордераENUM_DEAL_TYPE deal_type; // Тип сделкиENUM_ORDER_TYPE_TIME type_time; // Тип ордера по времени действияdatetime time_expiration; // Срок истечения ордераdouble price; // Цена double price_trigger; // Цена срабатывания стоп-лимитного ордераdouble price_sl; // Уровень Stop Lossdouble price_tp; // Уровень Take Profitdouble volume; // Объем в лотах
};
// все данные расчетов агентов складываются в массив структурstruct MqlCloud
{
enum STATUS {wait,ready,error,free};
STATUS status; // статус выполнения задачи - выполнена, выполняется, ошибка выполненияdouble input_data[]; // массив входных данныхdouble out_data[]; // массив выходных данных
};
long id=AccountInfoInteger(ACCOUNT_LOGIN);
double in_data[100];
MqlCloud result[10000];
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---
CloudInit(id,"myprog.ex5"); // id - это кто будет платить за Cloud, myprog.ex5 - программа которая будет выполнять расчеты
CloudData("file.dat"); // file.dat - файл с неизменными данными для расчетаfor(uint i=0; i<10000; i++)
{
//// формируем массив входных данных для расчетаfor(int n=0; n<ArraySize(in_data); n++) in_data[n]=MathRand()/SHORT_MAX;
//
CloudCalculat(i,in_data); // здесь i - номер задачи, input_data - массив переменных входных данных
}
// выводим максимальный результатdouble max_result=0.0;
for(uint i=0; i<10000; i++)
{
if(result[i].status!=ready)
{
i--;
Sleep(1000);
continue;
}
max_result=MathMax(max_result,result[i].out_data[0]);
}
Print("Max result = ",ArrayMaximum(result[0].out_data));
}
//+------------------------------------------------------------------+void OnCloudPass(uint num_mission)
{
// анализируем результат выполнения задачи по ее номеру, если нужноdouble s=result[num_mission].out_data[0];
}
//+------------------------------------------------------------------+void CloudInit(long ID, string programm_name) {}
void CloudData(string file_dat) {}
void CloudCalculat(uint num_mission, double & idata[]) {}
ここで、レナート。
MT5は、ストップロスがいつ発動され、テイクプロフィットがいつ発動されるかを明確に理解しています。// これは注文コメントからもわかるし、プラットフォームの処理自体からも明らかである。
そのために、(常に)要望があるのです。- SLやTPを有効にする際に、OnTradeTransactionに 適切なフラグを表示させたいのです。
しかし、適切な結合アーキテクチャがないためにこれが(理論的にも)不可能な場合は、プラットフォームのアーキテクチャが、このアクションに送られる注文にSLかTPかを確認するためのフラグを付けることを許さない、とだけ言っておいた方がいいでしょうね。
あなたにとって「不可能はない」という言葉はないのでしょうが。あなたはメタクオーツ :)
つまり、取引構造を見ることhttps://www.mql5.com/ru/docs/constants/structures/mqltradetransaction
TRADE_ACTION フィールドを追加します。
発注の理由SLトリガー
TPトリガー
ストップ・アウトによるポジションからの退出
などなど、あれば教えてください。
レナトさん、ここがポイントです。
MT5では、ストップロスがいつ、テイクプロフィットがいつ発動されたかを明確に把握 することができます。// このことは、注文コメントを見ればわかりますし、プラットフォーム自体からも明らかです。
それが、彼はわかっていない、わかってはいけないのです。
すべてが実行キューを通過し、注文は単純な買い/売りに分割され、流動性プロバイダーや取引所へのゲートウェイを経由する。現実にどのように実行されるか(部分的なものも含めて)わからない。また、いきなり「旗を止めることを保証する」と宣言すると、明日にはパパクラスが「俺には効果がなかった!」と義憤に駆られて非難してくるでしょう。
それが、現実にはそうではないし、そうであってはならないのです。
すべてが実行のキューで実行され、注文は単純なBUY/SELLに分割され、流動性プロバイダーや取引所へのゲートウェイを経由する。
はい、割れています。
しかし、この分割動作にはかなり特殊な動作が必要で、それはStop Loss/StackProfitを有効にすることです。そして、これらのアクションは、クライアント端末ではなく、MTのサーバーで処理 される。
ストップの有効化がMTで行われなくても、結果的にMT5で実際の注文やイベントが作成されます。
MT5サーバーの奥底に入り込めないことは承知していますが、今一度確認してください。注文の根拠となるアクションを通知することは可能ですか?
サーバー(またはゲートウェイ)がstoploop/stackprofit/stopoutなどを起動したら、とにかく注文を出すという対応になります。 // 注文がなければ何も起こりません!
そしてここに、この注文と適切なフラグを置く -この注文や イベントを配置する理由。
TradeTransactionのためだけに、新しい構造を導入すべきだったのでは?
そんなに新しいものではありません :) 非常に完成度の高いものです。
不足しているフィールドは2つだけです。
- position identifier
- 発注理由
そう、割れるんです。
しかし、この分割のためのアクションは非常に特殊で、stoploop/stackprofitを有効にすることです。そして、この動作はクライアント端末ではなく、MTサーバーで処理 されます。
答えは簡単で、100%フラグが立つという保証はないのです。
なぜなら、トリガーとなるソースやイニシエーターは多数存在し、取引サーバーはそれだけではないからです。
答えは簡単で、100%フラグが立つという保証はないのです。
なぜなら、ソースやトリガーは非常に多くあり、決してこれだけがトレードサーバーではないからです。
ストップロスの発動は、本当に複数のトレードサーバーで処理されるのでしょうか?
そのためには、トレーディングサーバーは1台あれば十分と思われました。
あるいは、MTでは、ストップロスがゲートウェイで処理される場合、注文なしで取引されることがあるのでしょうか。アクティベーションのために、オーダーが作成され、その旨がプラットフォームに通知されます。// 外部ゲートウェイによる
を流し込むと、トレードが出現します。
注文が満たされず、残りが取り下げられることは理解できる。
しかし、この注文が作成された時点で、それがストップロス注文であることを示すフラグを取引に追加することができます。
一番重要なのは、これがストップロスの注文であるという事象そのものです。
しかし、あなたはよくご存じなので、私は反論しませんが、非常に微妙なところです。
papaklass:
そして、その話をするのは誰なのか?
間違いなくあなたです。
荒らす気満々じゃん、何言ってんだ?
身だしなみを整える。
私たちとしては、端末を介さないエージェント間の独立した通信を考えています。例えば、あるエージェントが初期データを生成 し、フォアキャストで他のエージェント に送ることができます。
端末の関与がなければ、これでよいのです。
この「エージェントの一人」のデータは誰が作成するのでしょうか?スクリプトやインジケーターでできるようになるのでしょうか?
何のためのエージェント間のコミュニケーションなのか、できれば素人にもわかるように教えてください。
すでに数式計算機能をテストするためのスクリプトを書きましたが、いくつかの機能が不足しています)