
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias
Cómo trabajar correctamente en MT5 con OrderSend
fxsaber, 2016.11.14 20:20
Los guiones tienen un problema con eso.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!
¡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á.
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
¿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
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().
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
#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).
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...
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