Saludos. He visto el vídeo competente "De MQL4 a MQL5 - cómo reescribir EAs para Metatrader 5". Muchas gracias al autor. He decidido probarlo yo mismo. Decidí probarlo yo mismo. La idea es la siguiente: 1. He puesto dtriger = 1 en las entradas - Se abre la compra. 2. He puesto dtriger = -1 - Sell opens. 3. He puesto dtriger = 0 - todos los abiertos están cerrados. He leído en los manuales de MT5 que no es posible mantener posiciones opuestas, y yo los tengo. Pregunta: ¿Cómo puedo prescribir correctamente el cierre de una posición abierta La pregunta es: ¿Cómo registrar correctamente el cierre de una posición existente al abrir una inversa? Muchas gracias.
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>
CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;
inputint triger = 0;
inputdouble StartLot = 0.01;
inputdouble lpos_volume = 1.0;
inputint Step = 10;
inputint MagicNumber = 12345; // Magic nuaberinputint Slippage = 30; // slippageint dtriger;
int dStep;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
dStep = Step ;
dtriger = triger ;
if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);
RefreshRates();
o_trade.SetExpertMagicNumber(MagicNumber) ;
if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
elseif (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
else
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);
if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
datetime lpos_time = 0;
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
int pos_count = 0;
double sum_profit = 0;
for (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //OrderOpenTime();
lpos_price_open = o_position.PriceOpen(); //OrderOpenPrice();
lpos_type = o_position.PositionType() ; //OrderTipe();
}
pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}
// Считаем кол-во отложенных ордеровint stop_count=0;
for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}
if (!RefreshRates())
return ;
if(dtriger == 0 )
{
CloseAll();
return;
}
// + ----- Откраваем Первый ордер ++++++++++if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}
if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}
// + ----- Переворот ++++++++++++++++++++++++++++ if (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
if ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L +++++
}
}
if (lpos_type==POSITION_TYPE_SELL )
{
if ( dtriger == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y +++++
}
}
}
if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;
}
//-----------------------------------------------------------bool RefreshRates()
{
if (!o_symbol.RefreshRates())
return(false) ;
if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false);
return(true);
}
//--- --------------------------------------------------------- bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
return((filling && fill_type) == fill_type) ;
}
// -------------------------------------------------- void CloseAll()
{
for (int index = PositionsTotal()-1; index >=0; index--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket());
}
}
}
}
//----------------------------------------------------------- // Delete all pending orders//-------------------------------------void DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket());
}
}
//+------------------------------------------------------------------+
Saludos. He visto el útil clip "De MQL4 a MQL5 - cómo reescribir EAs para Metatrader 5". Me gustaría felicitar al autor. He decidido probarlo yo mismo. Yo lo escribí. Mi idea es la siguiente: 1. Pongo dtriger = 1 - abre Buy. 2. He puesto dtriger = -1 - Sell opens. 3. He puesto dtriger = 0 - todos los abiertos están cerrados. He leído en el FAQ que en MT5 no es posible mantener posiciones opuestas, y yo los tengo. Pregunta: ¿Cómo puedo prescribir correctamente el cierre de una posición abierta La pregunta es: ¿Cómo registrar correctamente el cierre de una posición existente al abrir una inversa? Muchas gracias.
Debes haber estado muy poco atento al leer la ficha técnica.
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
1.dtriger= 1-Se abre lacompra. 2. dtriger = -1 - Se abre la venta. 3. dtriger = 0 - Se cierran todas las abiertas.
El Asesor Experto debe hacer lo siguiente:
si necesita abrir la COMPRA - primero debe cerrar la VENTA (emita una orden para cerrar las posiciones de VENTA - no importa si están o no)
si necesita abrir la VENTA - entonces primero necesita cerrar la COMPRA (se emitirá una orden para cerrar las posiciones de COMPRA, sin importar si están ahí o no)
si el cliente necesita cerrar todo - entonces solo cierra todas las posiciones (no importa si COMPRA o VENTA)
Se necesitan dos algoritmos para la implementación (el número mágico también contribuye aquí) - puede ser desactivado.
//+------------------------------------------------------------------+//| Close positions |//+------------------------------------------------------------------+void ClosePositions(constENUM_POSITION_TYPE pos_type)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
if(m_position.PositionType()==pos_type) // gets the position type
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
и
//+------------------------------------------------------------------+//| Close all positions |//+------------------------------------------------------------------+void CloseAllPositions(void)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
La idea general es hacer un bucle alrededor de todas las posiciones desdePositionsTotal()-1 hasta 0. Es de PositionsTotal()-1 a 0, no de cero a PositionsTotal()-1. Esto es importante.
También un consejo: cuando se trabaja en MetaTrader 5, una orden es una ORDEN REMOVIDA. Por lo tanto, es muy recomendable que ni siquiera mencione la palabra "orden" en esta etapa inicial, para no crear confusión en su mente.
Vladimir Karputov: También un consejo: cuando se trabaja en MetaTrader 5, una orden es una ORDEN REMOVIDA. Por lo tanto, es muy recomendable que ni siquiera recuerde la palabra "orden" en esta etapa inicial, para no crear confusión en su mente.
También hay órdenes de mercado de compra y venta, así como órdenes CloseBy.
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Saludos. He visto el vídeo competente "De MQL4 a MQL5 - cómo reescribir EAs para Metatrader 5".
Muchas gracias al autor. He decidido probarlo yo mismo. Decidí probarlo yo mismo. La idea es la siguiente:
1. He puesto dtriger = 1 en las entradas - Se abre la compra.
2. He puesto dtriger = -1 - Sell opens.
3. He puesto dtriger = 0 - todos los abiertos están cerrados.
He leído en los manuales de MT5 que no es posible mantener posiciones opuestas,
y yo los tengo.
Pregunta: ¿Cómo puedo prescribir correctamente el cierre de una posición abierta
La pregunta es: ¿Cómo registrar correctamente el cierre de una posición existente al abrir una inversa?
Muchas gracias.
Saludos. He visto el útil clip "De MQL4 a MQL5 - cómo reescribir EAs para Metatrader 5".
Me gustaría felicitar al autor. He decidido probarlo yo mismo. Yo lo escribí. Mi idea es la siguiente:
1. Pongo dtriger = 1 - abre Buy.
2. He puesto dtriger = -1 - Sell opens.
3. He puesto dtriger = 0 - todos los abiertos están cerrados.
He leído en el FAQ que en MT5 no es posible mantener posiciones opuestas,
y yo los tengo.
Pregunta: ¿Cómo puedo prescribir correctamente el cierre de una posición abierta
La pregunta es: ¿Cómo registrar correctamente el cierre de una posición existente al abrir una inversa?
Muchas gracias.
Debes haber estado muy poco atento al leer la ficha técnica.
Referencia:Principios generales - Operaciones comerciales.
En resumen: MetaTrader 5 cuenta consistemas de Netting y Hedging.
Yo formularía su tarea de otra manera:
1.dtriger= 1-Se abre lacompra.
2. dtriger = -1 - Se abre la venta.
3. dtriger = 0 - Se cierran todas las abiertas.
El Asesor Experto debe hacer lo siguiente:
Se necesitan dos algoritmos para la implementación (el número mágico también contribuye aquí) - puede ser desactivado.
и
La idea general es hacer un bucle alrededor de todas las posiciones desdePositionsTotal()-1 hasta 0. Es de PositionsTotal()-1 a 0, no de cero a PositionsTotal()-1. Esto es importante.
También un consejo: cuando se trabaja en MetaTrader 5, una orden es una ORDEN REMOVIDA. Por lo tanto, es muy recomendable que ni siquiera recuerde la palabra "orden" en esta etapa inicial, para no crear confusión en su mente.
También hay órdenes de mercado de compra y venta, así como órdenes CloseBy.
Muchas gracias, como la música.
Muchas gracias, como la música.
Bueno, si eres tan amable, más entonces.
He puesto las entradas y he prescrito un pre-cierre, pero de nuevo las órdenes están colgadas ahí y ahí.
Bueno, si eres tan amable, más entonces.
He insertado las entradas y prescrito un pre-cierre, pero de nuevo hay órdenes colgantes aquí y allá.
Muchas gracias, al igual que las notas.
¿Cuál es la señal de apertura? Porque el código no está completo - sólo cerrar posiciones, pero también necesito abrir posiciones...
Comando de comercio.mq5
#versión de la propiedad "1.000"
Hasta ahora sólo realiza tres acciones: