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清楚地了解 何时激活止损,何时激活止盈。// 这可以从订单的评论中看出,而且从平台本身也可以看出。
这就是问题所在:他不明白,也不应该明白。
一切都要经过执行队列,订单被分成简单的买入/卖出,有通往流动性供应商和交易所的网关。不知道在现实中会如何执行(包括部分)。如果我们突然宣布我们保证停止旗帜,papaklass明天会义愤填膺地指责我们,"这对我没有用!"。
这就是问题所在:在现实中,它没有也不应该有。
一切都在执行队列中运行,订单被分成简单的买入/卖出,并通过网关进入流动性供应商和交易所。
是的,它正在分裂。
但这种拆分动作需要相当特殊的动作--激活止损/叠加利润。而这些动作是由MT的服务器处理 的,而不是由客户终端处理的。
即使在MT中没有激活止损,其结果仍然是为MT5创建一个真正的订单或事件。
我意识到,我不能进入MT5服务器的内部,但你只要再确认一次。是否可以通知有关行动,在此基础上下订单。
一旦服务器(或网关)激活了止损/止盈/止损等,回应就是无论如何都要下单。 //没有订单什么都不会发生!//没有订单什么都不会发生。
而在这里,在这个订单上,放上适当的标志--下这个订单 或事件的原因。
也许应该引入一个新的结构,只针对TradeTransaction?
它不是那么新:)它非常完整。
只缺少两个字段
- 位置标识符
- 下订单的原因
是的,它分裂了。
但这种分割的行动是非常具体的--激活止损/止盈。而这个动作是由MT服务器处理 的,而不是由客户终端处理的。
答案很简单--不能保证100%的标记。
因为有许多触发的来源和发起者,而且它不是唯一的交易服务器。
答案很简单--不能保证100%的标记。
因为有这么多的来源和触发因素,而这绝不是唯一的贸易服务器。
止损的激活是否真的由几个交易服务器处理?
在我看来,只有一个交易服务器就足以满足这一目的。
或者在MT中,如果止损是由网关处理的,可能会有没有订单的交易?对于激活,创建一个订单,并通知平台其创建。//由一个外部网关提供
然后,它被浇筑。而交易出现。
可以理解的是,订单可能无法完成,剩余部分将被撤回。
但在创建这个订单的时候,我们可以在交易中加入一个标志,说这是一个止损订单。
最重要的是事件本身,这是一个止损的订单。
但你更清楚,我不会争论。这是一个非常微妙的观点。
papaklass:
而谁在做所有的谈话?
肯定是你。
你想耍赖,有什么用?
表现自己。
就我们而言,我们考虑的是没有终端的代理人之间的独立通信。例如,其中一个代理可以生成初始数据 并通过fordcast将其发送给其他 。
没有终端的参与,这是好事。
谁将为这个 "代理人之一 "生成数据?脚本或指标能够做到吗?
代理人之间的沟通是为了什么,如果可以的话,给不懂的人指点一下。
已经写了一个脚本来测试数学计算能力,但缺少一些功能)