Modify Pending Order
Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:
action
order
price
sl
tp
type_time
expiration
Пример торговой операции TRADE_ACTION_MODIFY для модификации уровней цен отложенного ордера:
这很清楚。我后面是一个例子,代码如下。
#define EXPERT_MAGIC 123456// MagicNumber эксперта//+------------------------------------------------------------------+//| Модификация отложенных ордеров |//+------------------------------------------------------------------+voidOnStart()
{
//-- объявление и инициализация запроса и результатаMqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // количество установленных отложенных ордеров//--- перебор всех установленных отложенных ордеровfor(int i=0; i<total; i++)
{
//--- параметры ордераulong order_ticket=OrderGetTicket(i); // тикет ордераstring order_symbol=Symbol(); // символint digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // количество знаков после запятойulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber ордераdouble volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // текущий объем ордераdouble sl=OrderGetDouble(ORDER_SL); // текущий Stop Loss ордераdouble tp=OrderGetDouble(ORDER_TP); // текущий Take Profit ордераENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордераint offset = 50; // отступ от текущей цены для установки ордера, в пунктахdouble price; // цена срабатывания ордераdouble point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // размер пункта//--- вывод информации об ордереPrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- если MagicNumber совпадает, Stop Loss и Take Profit не заданыif(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // тип торговой операции
request.order = OrderGetTicket(i); // тикет ордера
request.symbol =Symbol(); // символ
request.deviation=5; // допустимое отклонение от цены//--- установка уровня цены, тейк-профит и стоп-лосс ордера в зависимости от его типаif(type==ORDER_TYPE_BUY_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
//--- отправка запросаif(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки//--- информация об операции PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- обнуление значений запроса и результатаZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
谢谢你,谢尔盖,谢谢你的答复你的回答让我更加疑惑。怎么可能呢?当我运行该脚本时,所有设定的挂单都被询问了。正如我们在图片中看到的,图表上有两个,同时,一个票被选中,另一个没有?这一点并不十分清楚。
你能更详细地解释一下吗?
我问这个问题不是出于空闲的好奇心,而是为了继续自我学习。
问候,弗拉基米尔。
所以,你有一个循环,你把迭代器i从最大索引改为0,里面发生了什么?好吧,情况是这样的:你尝试的第一个命令是获得ORDER_SYMBOL参数。但是,你想从哪个顺序得到它,因为这个顺序将在下面三行中选择!
谢谢你,谢尔盖,感谢你非常详细和易懂的解释!我把带有待定单票的一行放在循环开始后,一切都很顺利。
是的......。注意并再次注意。这就是我真正缺乏的东西。再次感谢!
真诚的,弗拉基米尔。
尊敬的专家们,早上好!
今天,我又遇到了两个我不理解的问题,但在一个完全取自MQL5参考的代码中。这一次我没有自己写什么,只是拿了一个现成的例子。
我打开MQL5参考/常量、枚举和结构/数据结构/交易请求的结构。我在那里找到它。
贸易请求的结构这很清楚。我后面是一个例子,代码如下。
我试图理解黄色标示的那一行。一个问题马上出现了:如果这个例子与挂单有关, PositionGetDouble(POSITION_PRICE_OPEN) 与它有什么关系?也许,应该有一条这样的线。
我只在 "专家 "选项卡中发现这个问题。 尊敬的专家,请帮助我理解这个例子,为什么它在目录中,但它的代码却不工作?
问候,弗拉基米尔。
尊敬的专家请帮助我理解这个例子,为什么它在参考书中,但它的代码却不能工作?
真诚的,弗拉基米尔。
我在几页前就写过这个问题。
这是一个关于交易、自动交易系统和策略测试的论坛。
新手对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论
Alexey Viktorov, 2022.02.20 10:24
萨沙,你想不出有什么 比使用文档中的例子 或tumblr的例子更糟糕的了。而且你也在某处丢失了强制终止while循环的标志。总而言之......无话可说。我在几页前就写过这个问题
你好,Alexey!
这样一个严肃的公司对手册的态度如此之差,这非常令人难过。
真诚的,弗拉基米尔。
你好,Alexey!
如此严肃的公司对手册有如此不严肃的态度,这非常可悲。
真诚的,弗拉基米尔。
这个例子中还有一个错误。或完全失明。
在列出的必填字段中,有一个过期时间,但在例子的代码中,我没有看到过期时间被分配到哪里。相反,允许的偏离价格的情况被指定。
这个例子中仍有一个错误。还是我已经完全瞎了...
在列出的必填字段中,有过期时间,但在示例代码中,我没有看到过期时间被分配到哪里。相反,规定了与价格的可允许偏差。
不仅是过期 时间,而且也应该有。
真诚的,弗拉基米尔。
不仅如此,还应该有一个过期 时间。
真诚的,弗拉基米尔。
我在向Artem Trishkin讲话,他是这个分会的主持人和组织者
就您而言,您是否有可能通过与MQL5指南有关的所有问题?
如果不是太麻烦的话,你能不能至少更新一下这个页面?
真诚的,弗拉基米尔。我是针对Artem Trishkin的,他是这个主题的版主和组织者!
就您而言,您是否有可能将所有与MQL5指南有关的问题传递给MQL5?
如果你不介意的话,至少可以更新这个页面?
尊敬的弗拉基米尔。你也可以在这个主题中 报告。
你也可以在这个主题中 报告。
谢谢你的提示,Alexey!我会先在这个主题中等待答案,如果没有结果,我会在 "错误、缺陷、问题"主题中报告它。
真诚的,弗拉基米尔。