如何在MT5中正确使用OrderSend? - 页 9

 
prostotrader:
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:

对不起,没有意愿去处理你的脚本

由以下人员添加

但有一个办法可以解决这个问题。

由于OrderrSend()函数是同步的,在收到订单后,我们

确保历史记录在OnTradeTransaction()中是同步的。

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
    switch(trans.type)
     {
      case TRADE_TRANSACTION_ORDER_UPDATE:
         switch(trans.order_state)
           {
            case ORDER_STATE_PLACED:
               if(order_ticket==trans.order)
                 {
                  Print(__FUNCTION__," Order plased done. Ticket = ",trans.order);
                  if(order_ticket>0)
                    {
                     if(OrderSelect(order_ticket))
                       {
                        //Ордер синхронизирован с историей
                       }
                     else
                       {
                        Print(__FUNCTION__," Order not select! Ticket = ",trans.order);
                       }
                    }
                  else
                    {
                     Print(__FUNCTION__," Wrong order ticket = ",trans.order);
                    }
                 }
               break;
           }
         break;
     }
  }

而且不能跳舞!

 
prostotrader:

不要跳舞!

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

如何在MT5中正确使用OrderSend?

fxsaber, 2016.11.10 10:00

请注意,这是一个脚本,不可能有任何Event-over。唯一的出路是一个愚蠢的睡眠。

如果你用SB重写这个脚本,什么也不会改变。

 
fxsaber:
你可以通过Sleep....,尽情地扭曲自己的想法。
 
prostotrader:
你可以随心所欲地搞砸睡眠....

为什么要重复以前别人已经建议 和表达过的事情?

该主题说的都是OnTradeTransaction可能出现的问题。特别是,它涉及同时操作多个专家顾问系统。

人们在制作拐杖,这并不意味着他们不熟悉文档,不知道如何使用功能。

OnTrade和OnTradeTransaction正是为此目的而开发的。当他们开始时,开发人员认为在一个账户中同时处理一个以上的专家顾问是很白痴的。

好吧,他们在这方面错了。

试着在你的专家顾问中编写以下函数

  1. i = 0.
  2. 我们在符号[i]处开了一个头寸。
  3. 如果i++>=5,我们退出。
  4. 如果没有滑移,我们就回到第2步,如果有滑移,我们就退出。
 
fxsaber:

为什么要重复以前别人已经建议 和表达过的事情?

该主题说的都是OnTradeTransaction可能出现的问题。特别是,它涉及同时操作多个专家顾问系统。

人们在制作拐杖,这并不意味着他们不熟悉文档,不知道如何使用功能。

OnTrade和OnTradeTransaction正是为此目的而开发的。当他们开始时,开发人员认为在一个账户中同时处理一个以上的专家顾问是很愚蠢的。

好吧,他们在这方面错了。

试着在你的专家顾问中编写以下函数

  1. i = 0.
  2. 我们在符号[i]处开了一个头寸。
  3. 如果i++>=5,我们退出。
  4. 如果没有滑移,我们就回到第2步,如果有滑移,我们就退出。

目前,我有41个专家顾问在一个真实账户上工作(在一个终端中),在一个交易日中一起工作

他们设置了2000个订单的开仓和平仓,我完全没有遇到任何困难!"。

添加

至于我们拥有的功能,应该是基于我们所拥有的,而不是基于我们 "需要 "的。

开发人员,如果可能的话,修复bug和bug,考虑到的愿望是

用户(尽管非常缓慢)。

我想他们很快也会处理OederSend()。

 
prostotrader:

我的真实账户上有41个专家顾问(在一个终端),在一个交易日内全部工作。

他们设置了2000个订单,开仓和平仓,我一点问题都没有!"。

这就是所谓的偏离主题。

当涉及到即使是最简单的逻辑。

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

如何在MT5中正确使用OrderSend?

fxsaber, 2016.11.15 13:30

尝试在你的EA中编写以下函数

  1. i = 0.
  2. 在符号[i]上开立一个头寸。
  3. 如果i++>=5,我们退出。
  4. 如果新的头寸没有滑点,我们回到第二步。 如果有滑点,我们退出。
有人立即将其交易。
// MQL4&5-code

#property strict

#include <MT4Orders.mqh>    // https://www.mql5.com/ru/code/16006

void Func( const string &Symbols[] )
{
  const int Total = ArraySize(Symbols);
  
  for (int i = 0; i < Total; i++)
  {
    const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
    const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
    
    if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
        (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // если не получилось открыть или есть проскальзывание - выходим
      break;
  }
}

void OnStart() // OnTick
{
  const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
  
  Func(Symbols);
}

还有人在等待开发商的法力。
 

我已经说过,你可以随意扭曲它(每个人都有这个权利)。

 
prostotrader:

我已经说过,你可以随心所欲地扭曲(每个人都有这个权利)。

那是很久以前的事了,但我记得这个人,嗯,这个fxsaber 创造了奇迹。

他的代码仍然保存在MT4代码库中,他在WinInet上读取网站的代码

仍然被很多程序员所使用...

因此,在我看来,他不是一个变态......

 
从这里的库中翻出了OrderSendSync
uint OrderSend_MaxPause = 1000000; // максимальное время на синхронизацию в мкс.

const bool IsTester = (::MQLInfoInteger(MQL_TESTER) || ::MQLInfoInteger(MQL_OPTIMIZATION) ||
                       ::MQLInfoInteger(MQL_VISUAL_MODE) || ::MQLInfoInteger(MQL_FRAME_MODE));
                      
                      

bool Waiting( const bool FlagInit = false )
{
  static ulong StartTime = 0;

  if (FlagInit)
    StartTime = ::GetMicrosecondCount();

  const bool Res = (::GetMicrosecondCount() - StartTime < OrderSend_MaxPause);

  if (Res)
    ::Sleep(0);

  return(Res);
}

bool EqualPrices( const double Price1, const double Price2, const int digits)
{
  return(::NormalizeDouble(Price1 - Price2, digits) == 0);
}

#define WHILE(A) while (!(Res = (A)) && Waiting())

bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
  bool Res = ::OrderSend(Request, Result);

  if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR) && (OrderSend_MaxPause > 0))
  {
    Res = (Result.retcode == TRADE_RETCODE_DONE);
    Waiting(true);

    if (Request.action == TRADE_ACTION_DEAL)
    {
      WHILE(::HistoryOrderSelect(Result.order))
        ;

      Res = Res && (((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_FILLED) ||
                    ((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_PARTIAL));

      if (Res)
        WHILE(::HistoryDealSelect(Result.deal))
          ;
    }
    else if (Request.action == TRADE_ACTION_PENDING)
    {
      if (Res)
        WHILE(::OrderSelect(Result.order))
          ;
      else
      {
        WHILE(::HistoryOrderSelect(Result.order))
          ;

        Res = false;
      }
    }
    else if (Request.action == TRADE_ACTION_SLTP)
    {
      if (Res)
      {
        bool EqualSL = false;
        bool EqualTP = false;

        const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);

        if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
        {
          EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
          EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
        }

        WHILE((EqualSL && EqualTP))
          if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
          {
            EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
            EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
          }
      }
    }
    else if (Request.action == TRADE_ACTION_MODIFY)
    {
      if (Res)
      {
        bool EqualSL = false;
        bool EqualTP = false;

        const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);

        if (::OrderSelect(Result.order))
        {
          EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
          EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
        }

        WHILE((EqualSL && EqualTP))
          if (::OrderSelect(Result.order))
          {
            EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
            EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
          }
      }
    }
    else if (Request.action == TRADE_ACTION_REMOVE)
      if (Res)
        WHILE(::HistoryOrderSelect(Result.order))
          ;
  }

  return(Res);
}

#undef WHILE
代码的想法应该是明确的。我可能忽略了一些东西。我没有注意到操作中的任何错误。
原因: