Cómo trabajar correctamente en MT5 con OrderSend - página 9

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

Lo siento, no tengo ganas de lidiar con tus guiones

Añadido por

Pero hay una forma de salir de ella.

Como la función OrderrSend() es sincrónica, después de recibir la orden

asegúrese de que el historial está sincronizado en 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;
     }
  }

¡Y no se puede bailar!

 
prostotrader:

¡No bailes!

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cómo trabajar correctamente en MT5 con OrderSend

fxsaber, 2016.11.10 10:00

Tenga en cuenta que se trata de un script y no puede haber ningún Event-overs. La única salida es un Sueño tonto.

Si reescribes este script con SB, nada cambiará.

 
fxsaber:
Puedes ser tan retorcido como quieras con Sleep....
 
prostotrader:
Puedes joder el sueño como quieras....

¿Por qué repetir lo mismo que ya fue sugerido y expresado antes por otros?

El hilo dice todo sobre los posibles problemas con OnTradeTransaction. En particular, se trata de la operación de múltiples Asesores Expertos simultáneamente.

La gente hace muletillas, no quiere decir que no conozcan la documentación y no sepan utilizar las funciones.

OnTrade y OnTradeTransaction se han desarrollado exactamente para este propósito. Cuando lo iniciaron, los desarrolladores pensaron que sería una idiotez manejar más de un Asesor Experto simultáneamente en una cuenta.

Pues bien, en eso se equivocaron.

Intente escribir la siguiente función en su Asesor Experto

  1. i = 0.
  2. Abrimos una posición en el símbolo[i].
  3. Si i++ >= 5, salimos.
  4. Si no hay deslizamiento, volvemos al paso 2. Si hay deslizamiento, salimos.
 
fxsaber:

¿Por qué repetir lo mismo que ya fue sugerido y expresado antes por otros?

El hilo dice todo sobre los posibles problemas con OnTradeTransaction. En particular, se trata de la operación de múltiples Asesores Expertos simultáneamente.

La gente hace muletillas, no quiere decir que no conozcan la documentación y no sepan utilizar las funciones.

OnTrade y OnTradeTransaction se han desarrollado exactamente para este propósito. Cuando lo iniciaron, los desarrolladores pensaron que sería una idiotez manejar más de un Asesor Experto simultáneamente en una cuenta.

Pues bien, en eso se equivocaron.

Intente escribir la siguiente función en su Asesor Experto

  1. i = 0.
  2. Abrimos una posición en el símbolo[i].
  3. Si i++ >= 5, salimos.
  4. Si no hay deslizamiento, volvemos al paso 2. Si hay deslizamiento, salimos.

Actualmente tengo 41 Asesores Expertos trabajando en una cuenta real (en un terminal) que juntos durante un día de negociación

Han establecido 2000 órdenes de apertura y cierre de posiciones y no estoy experimentando ninguna dificultad.

Añadido

En cuanto a la funcionalidad que tenemos, debería basarse en lo que tenemos y no en lo que "necesitamos".

Los desarrolladores, en la medida de lo posible, arreglan los fallos y los errores, teniendo en cuenta los deseos de

usuarios (aunque muy lentamente).

Creo que pronto se ocuparán también de OederSend().

 
prostotrader:

Tengo 41 Asesores Expertos en mi cuenta real (en un terminal) trabajando todos juntos durante un día de negociación.

Establecen 2000 órdenes, abren y cierran posiciones y no tengo ningún problema.

Esto se llama salirse del tema.

Cuando se trata de la lógica más simple.

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Cómo trabajar correctamente en MT5 con OrderSend

fxsaber, 2016.11.15 13:30

Intente escribir la siguiente función en su EA

  1. i = 0.
  2. Abre una posición en el símbolo[i].
  3. Si i++ >= 5, salimos.
  4. Si la nueva posición no tiene deslizamiento, volvemos al paso 2. Si hay deslizamiento, salimos.
Alguien lo intercambia inmediatamente.
// 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);
}

Y alguien espera el maná de los desarrolladores.
 

Ya he dicho que eres libre de tergiversarlo como quieras (todo el mundo tiene ese derecho).

 
prostotrader:

Ya he dicho que eres libre de tergiversar como quieras (todo el mundo tiene ese derecho).

fue hace mucho tiempo, pero recuerdo que este tipo, bueno, estefxsaber hizo maravillas,

sus códigos siguen almacenados en la base de código de MT4, su código para leer sitios en WinInet

sigue siendo utilizado por muchos programadores...

y por lo tanto, me parece, no es un pervertido...

 
He aquí el OrderSendSync de la biblioteca
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
La idea del código debe ser clara. Puede que me haya perdido algo. No he notado ningún error de funcionamiento.
Razón de la queja: