伟大而可怕的MT4永远(或如何制定过渡策略) - 页 20

 
Andrey Khatimlianskii:

你不能用你的舌头说话。你应该教我。我,请。

有一个问题,而且不仅仅是在这个经纪人那里。
问题不在于等待特定订单的执行(那是另一回事),而在于在订单执行 的那一刻,它们从所有列表中暂时消失了(开仓、平仓、交易、头寸)。

当然,我们可以使用另一个拐杖。但我们希望找到一个人性化的解决方案。于是,fxsaber公开工作,听着路过的祝福者的叫声。

我个人希望你能理解文件的内容

当专家顾问使用OnTradeTransaction()处理程序处理交易时,终端继续处理新到达的交易。因此,在OnTradeTransaction()运行时,交易账户的状态已经可以改变。例如,当MQL5程序处理添加新订单的事件时,它可能被执行,从开放的列表中删除,并移到历史记录中。再 往后,该计划将被通知所有这些事件。
而这不仅适用于OnTradeTransaction() 事件处理程序,也适用于OrderSend()发送后的任何部分代码等待交易的完成。没有其他选择,也不会有任何选择。 只要想想为什么在mql4中一切都那么简单?嗯,这是因为这些期望是在离你眼睛很远的地方布置的。而在MQL5中,你不知为何认为所有的检查和期望都是拐杖。为什么?
 
Alexey Viktorov:

就个人而言,我希望你对这样的文件字句有足够的洞察力

这不仅涉及OnTradeTransaction() 事件处理程序,而且还 涉及OrderSend()发送后的任何部分代码等待交易的完成。没有其他选择,也不会有任何选择。 只要想想为什么在mql4中一切都那么简单?嗯,这是因为这些期望是在离你的眼睛很远的地方奠定的。而在MQL5中,你不知为何认为所有的检查和期望都是拐杖。为什么?

阿列克谢,你偏离了主题。抱歉,没有时间或意愿再解释一遍。

 

这样试了一下。

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

我运行了5次我的代码,直到正好有10个位置开放

 
Igor Makanu:

这样试了一下。

运行我的代码5次,直到正好有10个位置开放

看起来是在设置HistorySelect 输入时出了错。

 
fxsaber:

看起来是在设置HistorySelect 输入时出现了错误。

想法,以达到服务器并进行同步

把它改写成了剧本。

//+------------------------------------------------------------------+
void OnStart()
{
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) return;
   }
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

运行了几次,也打开了10个位置,添加了脚本的当前开始时间

 
Igor Makanu:

到达服务器并同步的想法

把它改写成了剧本。

运行了几次,也打开了10个位置,添加了脚本的当前开始时间

这种变化将显示什么?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

这种变化将显示什么?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh is On.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start) ] = 4 mcs.

职位仍然是10个百分点,还没有翻倍
 
Igor Makanu:

职位仍然是10个,还没有翻倍。

HistorySelect的执行时间很好地表明,它没有向贸易服务器请求任何东西。


有几个版本。

  1. 你很幸运。
  2. 这个分支在终端的新构建中引起了安静的变化。这很容易确认,如果在旧有的人中有一个反击。
  3. 当From>=To时,HistorySelect的 不正常行为。
  4. 贸易服务器。名称?


试着用同样的方法来摆脱这里的翻倍。

关于交易、自动交易系统和策略测试的论坛

伟大而强大的永远的MT4(或如何正确地制定策略来切换)。

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

在一个空的模拟账户上运行这段代码,看看是否在几秒钟内有两个仓位开仓。

 

我偶然来到这里,读到了它--这是一个耻辱 !

任何人都不应该被信任 !
 
fxsaber:

你可以从HistorySelect的执行时间清楚地看到,它没有向贸易服务器请求任何东西。


有几个版本。

  1. 你很幸运。
  2. 这个分支在终端的新构建中引起了安静的变化。这一点很容易确认,如果在旧有的基础上有一个反击。
  3. 当From>=To时,HistorySelect的 不正常行为。
  4. 贸易服务器。名称?


试着用同样的方法来摆脱这里的双重性。

1.唉,没有它就无法在我们的业务中生存))。

2.我几天前问过什么版本(不是测试版)是相关的,沉默不语,我决定不更新,在笔记本和电脑上很难理解什么版本是相关的--我已经有几个月没有用终端工作了,我不懂。现在在PC上构建2903。

3.我就不说了,这个宴会由你负责,开发商不说话,我猜...竖起大拇指,我认为问题出在网络延迟上,而且多个套接字?终端,没有同步,一个套接字价格,另一个OrderSend,另一个OnTrade().....,所以数据包从哪里飞到哪里

4.我有robotforex + 100 mbps的光纤(ETTH),我有一个糟糕的移动互联网和fhopin在我的笔记本电脑之前


我试了2分钟,脚本甩了2分钟,总是一个位置,没有反转,我用手把脚本拿下来了