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

 
Artyom Trishkin:
用俄语?用西班牙语?用英语?哪一个?

自然是终端支持的所有语言

格式并不重要--它可以是一个类的形式的SB,其中构造函数获得语言作为一个参数。

或者它可以是一组自定义函数,语言结尾为GetTxtErrDescription_RU()。

甚至是像GetLastError()这样的普通函数

如果你愿意


好吧,算了吧,我什么都有,我的级别不允许照顾普遍的福祉,让受过专门训练的人处理可用性和用户友好性的问题。

 

我猜到了为什么你的位置是双倍的。) ) )因为你在CodeBase中放置了两个库))))。


 

你为什么不喜欢GetTickCount();它不会拖慢整个代码,不像Sleep,如果ping很高,你至少可以增加500ms。

在我的多符号中,在OrderSend 之后,每一对单独的计数器被激活,其余的逻辑继续工作。

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();
//---
   while(1 && !IsStopped())
     {
      static uint LastOnCalculate = GetTickCount();
      if(GetTickCount() - LastOnCalculate > 5)
         //---
        {
         BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         OrderSend(BuyRequest, result);
         LastOnCalculate = GetTickCount();
         continue;
        }
      if(PositionGetTicket(0) > 0 && PositionsTotal() >= 10)
        {
         Sleep(100);
         Print(PositionsTotal());
         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);
  }
//+------------------------------------------------------------------+
 
Fast235:

你为什么不喜欢GetTickCount();它不像Sleep那样拖慢整个代码,如果ping很高,你至少可以增加500ms。

这是一个主动循环,它吃掉了处理器。如果终端中有50个这样的专家顾问怎么办?在一个对子上有8个,所有8个将在一个尖峰上发送订单。

 
traveller00:

这是一个活跃的循环,它吃掉了CPU。如果终端中有50个这样的专家顾问怎么办?一对有8个,其中在发夹上的8个都会发出指令。

它被激活了半秒钟,只有在订单发送 后,才没有任何指令,然后它首先检查是否存在未结头寸。

我优化了我的代码,它变得更快,并开始一次打开2个位置)起初,睡眠是有帮助的,但它使事情变慢了,我有7个字符
 
fxsaber:

我自己还没有试过MT4风格。 理论上它应该可以。我还没有机会去看它。

它是有效的。比较两个版本(有位置等待和没有位置等待)很有意思。


OrderSend 之后有位置等待。

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


不需要等待位置,结果是即时的。

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


我确信第二种变体的速度更快。结果是在执行的时间上是平等的。


当等待位置ByPass.Is()时,代码返回了一次false,而不等待则返回了740次。总而言之,这根拐杖似乎很有效。

 
似乎是提出的唯一可行的解决方案。

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

伟大而可怕的MT4永远(或如何建立你的迁移策略)

Igor Makanu, 2021.05.10 10:28

它似乎是有效的。

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 30)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 30) return;
   }
}

但是非常慢,而且解决方案也很一般。

它的速度是可以的。缺乏同步性37次。

 
fxsaber:

其速度是正常的。缺乏同步性37次。

我在fx上检查了一下:这个脚本开10个单子快了5次,最后一次快了,当我在demo上开10个单子10秒钟时,关单也不快。

这里是11143290号订单的日志上的一个划痕。

LL 0 11:19:31.444 交易 '20615687': 订单 #11143290 在市场上买入 0.1 / 0.1 EURUSD 在 1580.643 ms 内完成。

PO 0 11:19:33.621 交易 '20615687': 交易#1865643在1.21460买入0.1 EURUSD完成(基于订单#11143290)。

CL 0 11:19:33.622 交易 '20615687': 市场买入 0.1 EURUSD

JF 0 11:19:33.679 交易 '20615687': 接受市场买入 0.1 EURUSD

QO 0 11:19:33.679 交易 '20615687': 市场买入 0.1 EURUSD,已放置执行。

KM 0 11:22:41.224 交易 '20615687': 市场卖出 0.1 EURUSD, 收盘 #11143290 买入 0.1 EURUSD 1.21460

DR 0 11:22:41.280 交易 '20615687': 接受市场卖出 0.1 EURUSD,收盘 #11143290 买入 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 交易 '20615687': 市场卖出0.1 EURUSD,收盘#11143290 买入0.1 EURUSD 1.21460放置执行。

ON 0 11:22:43.824 交易 '20615687': 市场卖出 0.1 EURUSD, 收盘 #11143290 买入 0.1 EURUSD 1.21460

DO 2 11:22:43.880 交易 '20615687': 市场卖出 0.1 EURUSD,关闭 #11143290 买入 0.1 EURUSD 1.21460 [关闭此位置的订单已经存在]

JN 0 11:22:46.280 交易 '20615687': 市场卖出 0.1 EURUSD, 收盘 #11143290 买入 0.1 EURUSD 1.21460

OL 2 11:22:46.336 交易 '20615687': 市场卖出 0.1 EURUSD,关闭 #11143290 买入 0.1 EURUSD 1.21460 [关闭此位置的订单已经存在]

 
Igor Makanu:

我刚刚检查了fx...n。

我必须看一下那个服务器。不妨看看这里建议的拐杖,对谁来说,这似乎很重要。

过了一段时间再来谈这个话题,就会很不情愿了。如果有任何错误,最好马上指出来。

 
fxsaber:

我们必须看一下这个服务器。不妨看看这里建议的拐杖,对谁来说,这似乎很重要。

如果过了一段时间再来讨论这个话题,那就太可惜了。如果有的话,最好立即指出错误。

在PM中放弃了服务器