¿Y cómo se comprueba si todavía no se ha abierto una posición en esta barra?
Tal vez deberíamos modificar un poco la función de Aleksey Vazhmikin y añadir una estructura para controlar la apertura de una posición en una nueva barra de esta manera:
struct open_bar {
bool IsPositionOpened; // Flagint bn; // Bar Numberdatetime bot; // Bar Open Timedouble bop; // Bar Open Price
};
open_bar BarOpen;
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime prevBarTime=0;
if(CopyTime(_Symbol,0,0,1,tm)<0)
{
Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
}
else
{
if(prevBarTime!=tm[0])
{
prevBarTime=tm[0];
BarOpen.IsPositionOpened=false;
BarOpen.bn++;
BarOpen.bot=iTime(NULL,PERIOD_CURRENT,0);
BarOpen.bop=iOpen(NULL,PERIOD_CURRENT,0);
returntrue;
}
returnfalse;
}
returntrue;
}
Y luego levantar la bandera de control en el Asesor Experto cuando una posición se abre con éxito:
BarOpen.IsPositionOpened=true;
Y controlarlo antes de abrir otra posición. ¿Es más fiable?
Gracias por toda su ayuda. He estudiado todo en detalle. Tengo un retraso de 5 segundos después de cada solicitud de comercio, pero todavía no ayuda. El problema es sólo en ICMarkets demo MT5 cobertura. Añadiré comprobaciones y emitiré los resultados del sondeo de estado. La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo y el cliente lo tiene regularmente, a pesar de que nos conectamos al mismo servidor.
Gracias por toda su ayuda. He estudiado todo en detalle. Tengo un retraso de 5 segundos después de cada solicitud de comercio, pero todavía no hay ayuda. El problema es sólo en ICMarkets demo MT5 cobertura. Añadiré comprobaciones y emitiré los resultados del sondeo de estado. La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo y el cliente lo tiene regularmente, a pesar de que nos conectamos al mismo servidor.
Creo que tiene algo que ver con la calidad de la conexión del cliente, por ejemplo, un ping alto. Sí tienes un retraso de 5 segundos, pero no está ahí, según entiendo de tu código. ¿Qué devuelve la clase m_trade? ¿Número de billete? ¿O verdadero o falso? Tiene una comprobación del resultado devuelto por este objeto, pero imagina que debido a un retraso en la conexión con el servidor no se ha recibido aún una respuesta positiva. ¿Cuál será el resultado de la ejecución de la sentencia if? Probablemente, será falso y como resultado su bucle pasará a una segunda iteración después de 5 segundos. Y por fin el servidor responderá, pero ya se iniciará la segunda iteración y se enviará una segunda petición para abrir una posición similar. El hecho de que haya algún delta en la hora de apertura de la orden se demuestra por el hecho de que ambas órdenes están desplazadas en el gráfico, lo que significa que se han ejecutado a horas y precios diferentes.
La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo, pero con el cliente ocurre regularmente, aunque nos conectemos al mismo servidor.
Compruebe en la barra, una posición por símbolo. Lo más probable es que te deshagas del problema.
Aquí está parte del código del script para Metatrader5:
#property copyright"Copyright 2019, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//---- показывать входные параметры#property script_show_inputs//---#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object//+------------------------------------------------------------------+//| Enum Stop or Limit |//+------------------------------------------------------------------+enum ENUM_STOP_OR_LIMIT
{
stop=0, // Buy stop and Sell stop
limit=1// Buy limit and Sell limit
};
//--- input parametersinputushort InpUpGap = 15; // Gap for pending orders UP from the current price (in points)inputushort InpUpStep = 30; // Step between orders UP (in points)inputushort InpDownGap = 15; // Gap for pending orders DOWN from the current price (in points)inputushort InpDownStep = 30; // Step between orders DOWN (in points)input ENUM_STOP_OR_LIMIT InpPending = stop; // Type of pending ordersinputuchar InpUpQuantity = 1; // UP quantity ordersinputuchar InpDownQuantity = 1; // DOWN quantity ordersinputdouble InpLots = 0.01; // Lotsinputushort InpStopLoss = 50; // Stop Loss (in points)inputushort InpTakeProfit = 50; // Take Profit (in points)//---ulong m_slippage=30; // slippagedouble ExtUpGap=0.0;
double ExtUpStep=0.0;
double ExtDownGap=0.0;
double ExtDownStep=0.0;
double ExtStopLoss=0.0;
double ExtTakeProfit=0.0;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---if(InpLots<=0.0)
{
Print("The \"Lots\" can't be smaller or equal to zero");
return;
}
//---if(!m_symbol.Name(Symbol())) // sets symbol namereturn;
if(!RefreshRates())
return;
string err_text="";
if(!CheckVolumeValue(InpLots,err_text))
{
Print(err_text);
return;
}
//---if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
m_trade.SetTypeFilling(ORDER_FILLING_FOK);
elseif(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
m_trade.SetTypeFilling(ORDER_FILLING_IOC);
else
m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
m_trade.SetDeviationInPoints(m_slippage);
m_trade.SetAsyncMode(true);
//---
ExtUpGap = m_symbol.Point() * InpUpGap;
ExtUpStep = m_symbol.Point() * InpUpStep;
ExtDownGap = m_symbol.Point() * InpDownGap;
ExtDownStep = m_symbol.Point() * InpDownStep;
ExtStopLoss = m_symbol.Point() * InpStopLoss;
ExtTakeProfit = m_symbol.Point() * InpTakeProfit;
//--- start workdouble start_price_ask=m_symbol.Ask()-ExtUpGap;
double start_price_bid=m_symbol.Bid()+ExtDownGap;
//--- set pending ordersfor(int i=0; i<InpUpQuantity; i++)
{
double price_ask = start_price_ask+i*ExtUpStep;
double price_bid = start_price_bid+i*ExtUpStep;
if(InpPending==stop)
{
double sl = (ExtStopLoss==0.0) ? 0.0 : price_ask - ExtStopLoss;
double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
m_symbol.NormalizePrice(sl),
m_symbol.NormalizePrice(tp));
}
else
{
double sl = (ExtStopLoss==0.0) ? 0.0 : price_bid + ExtStopLoss;
double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
m_symbol.NormalizePrice(sl),
m_symbol.NormalizePrice(tp));
}
}
for(int i=0; i<InpDownQuantity; i++)
{
double price_ask = start_price_ask-i*ExtDownStep;
double price_bid = start_price_bid-i*ExtDownStep;
if(InpPending==limit)
{
double sl = (ExtStopLoss==0.0) ? 0.0 : price_ask - ExtStopLoss;
double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
m_symbol.NormalizePrice(sl),
m_symbol.NormalizePrice(tp));
}
else
{
double sl = (ExtStopLoss==0.0) ? 0.0 : price_bid + ExtStopLoss;
double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
m_symbol.NormalizePrice(sl),
m_symbol.NormalizePrice(tp));
}
}
}
Han surgido preguntas:
1. Se supone que el script debe establecer órdenes limitadas pendientes a una determinada distancia de la oferta y la demanda, o bien órdenes stop. Las órdenespendientes de límite se fijan sin problemas pero las de stop no. Por favor, ayúdenme a averiguar por qué no se establecen las órdenes pendientes de Buy Stop y Sell Stop.
2. ¿Hay alguna posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?
¿Y cómo se comprueba si todavía no se ha abierto una posición en esta barra?
Tal vez deberíamos modificar un poco la función de Aleksey Vazhmikin y añadir una estructura para controlar la apertura de una posición en una nueva barra de esta manera:
Y luego levantar la bandera de control en el Asesor Experto cuando una posición se abre con éxito:
BarOpen.IsPositionOpened=true;Y controlarlo antes de abrir otra posición. ¿Es más fiable?
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno.
https://www.mql5.com/en/forum/271445
https://www.mql5.com/en/forum/308940
https://www.mql5.com/en/forum/271445
https://www.mql5.com/en/forum/308940
Gracias por toda su ayuda. He estudiado todo en detalle. Tengo un retraso de 5 segundos después de cada solicitud de comercio, pero todavía no ayuda. El problema es sólo en ICMarkets demo MT5 cobertura. Añadiré comprobaciones y emitiré los resultados del sondeo de estado. La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo y el cliente lo tiene regularmente, a pesar de que nos conectamos al mismo servidor.
¡Hola Señoras y Señores! ¿Hay alguien de Simferopol?
Así que crees que esto te ayudará de alguna manera en el aprendizaje de MQL5 :) . Este es un foro de programación MQL5, no un club de citas.
Así que crees que esto te ayudará de alguna manera en el aprendizaje de MQL5 :) . Este es un foro de programación MQL5, no un club de citas.
Gracias por toda su ayuda. He estudiado todo en detalle. Tengo un retraso de 5 segundos después de cada solicitud de comercio, pero todavía no hay ayuda. El problema es sólo en ICMarkets demo MT5 cobertura. Añadiré comprobaciones y emitiré los resultados del sondeo de estado. La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo y el cliente lo tiene regularmente, a pesar de que nos conectamos al mismo servidor.
Creo que tiene algo que ver con la calidad de la conexión del cliente, por ejemplo, un ping alto. Sí tienes un retraso de 5 segundos, pero no está ahí, según entiendo de tu código. ¿Qué devuelve la clase m_trade? ¿Número de billete? ¿O verdadero o falso? Tiene una comprobación del resultado devuelto por este objeto, pero imagina que debido a un retraso en la conexión con el servidor no se ha recibido aún una respuesta positiva. ¿Cuál será el resultado de la ejecución de la sentencia if? Probablemente, será falso y como resultado su bucle pasará a una segunda iteración después de 5 segundos. Y por fin el servidor responderá, pero ya se iniciará la segunda iteración y se enviará una segunda petición para abrir una posición similar. El hecho de que haya algún delta en la hora de apertura de la orden se demuestra por el hecho de que ambas órdenes están desplazadas en el gráfico, lo que significa que se han ejecutado a horas y precios diferentes.
La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo, pero con el cliente ocurre regularmente, aunque nos conectemos al mismo servidor.
Compruebe en la barra, una posición por símbolo. Lo más probable es que te deshagas del problema.
Compruebe en la barra, una posición por símbolo. Seguramente te librarás del problema.
Hay otro inconveniente. En esta situación es más fácil reescribir al estilo de MT4 que idear una muleta.
¡Buenos días a todos!
Aquí está parte del código del script para Metatrader5:
Han surgido preguntas:
1. Se supone que el script debe establecer órdenes limitadas pendientes a una determinada distancia de la oferta y la demanda, o bien órdenes stop. Las órdenespendientes de límite se fijan sin problemas pero las de stop no. Por favor, ayúdenme a averiguar por qué no se establecen las órdenes pendientes de Buy Stop y Sell Stop.
2. ¿Hay alguna posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?
Sinceramente, Vladimir.