He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.
Sólo la función CheckForOpen() es responsable de la apertura de posiciones:
enum opp_mode {
DoClose, // Close and reverse with initial lot
DoReverse, // Close and reverse (continue Martingale last lot)
DoHedge, // No closing reversal (Hedge mode)
};
// Trade & MM Sectioninput opp_mode Mode_opp = DoHedge; // Trading Mode//+------------------------------------------------------------------+//| Check for Open function |//+------------------------------------------------------------------+void CheckForOpen() {
if (!IsBarNew) return;
double lot=0;
positions=Positions();
if (Signal==OP_BUY) {
if (longs>0) return;
if (shorts==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (shorts>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode SELL by opposite signal.");
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing SELL by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_SELL);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging SELL by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
}
}
}
if (Signal==OP_SELL) {
if (shorts>0) return;
if (longs==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (longs>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode BUY by opposite signal.");
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing BUY by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_BUY);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging BUY by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
}
}
}
}
//+------------------------------------------------------------------+
La función que envía una solicitud para abrir una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando hago pruebas con la demo de MetaQuotes MT5.
//+------------------------------------------------------------------+//| Place Market Order function |//+------------------------------------------------------------------+bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) { // mn - Magic Numberdouble d_sl=0, d_tp=0;
MqlTick stTick;
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));
if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
if (oper==OP_BUY) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_ask=stTick.ask;
d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
if (oper==OP_SELL) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_bid=stTick.bid;
d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
return(false);
}
//+------------------------------------------------------------------+
La función de controlar la apertura de un nuevo bar:
//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+bool IsBarNew=false;
//+------------------------------------------------------------------+//| Bar refreshing function |//| true - new bar opened, false - not opened |//+------------------------------------------------------------------+bool IsNewBar() {
staticdatetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
datetime curTime =iTime(NULL,PERIOD_CURRENT,0);
if (curTime>SavedTime) {
SavedTime=curTime;
return(true);
}
elsereturn(false);
}
//+------------------------------------------------------------------+
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi MT5 demo ICMarkets hedge, así como el ordenador. Captura de pantalla del doblete.
He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.
La función OnTick()
Sólo la función CheckForOpen() es responsable de la apertura de posiciones:
La función que envía una solicitud para abrir una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando hago pruebas con la demo de MetaQuotes MT5.
La función de controlar la apertura de un nuevo bar:
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi cobertura MT5 demo ICMarkets, así como el ordenador. Captura de pantalla del doblete.
Todo el EA.
Utilizo esta función para controlar la nueva barra - a veces hay errores al copiar la fecha de la barra.
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает 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];
returntrue;
}
returnfalse;
}
returntrue;
}
Hay veces que hay errores al copiar la fecha de la barra.
Gracias. Intentaré reemplazarlo. Aunque hasta ahora la función que he utilizado ha funcionado bien también. Tengo una idea para imprimir la hora de apertura de la barra y el precio, entonces se vería claramente que el error es en este caso particular.
Sin embargo, me confunde el hecho de que los duplots aparezcan sólo en la apertura de la primera posición mientras que las posiciones posteriores se abren correctamente y el EA trabaja durante horas generando decenas de ellos. Y la función de control de apertura de la barra funciona siempre. Y de acuerdo con las condiciones el Asesor Experto abre la primera posición cuando no hay ninguna y las siguientes se abren sólo cuando el precio se ha movido lo suficiente después de que se abrió la primera.
He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.
La función OnTick()
Sólo la función CheckForOpen() es responsable de la apertura de posiciones:
La función que envía una solicitud de apertura de una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando pruebo con la demo de MetaQuotes MT5.
La función de controlar la apertura de un nuevo bar:
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi cobertura MT5 demo ICMarkets, así como el ordenador. Captura de pantalla del doblete.
Todo el EA.
¿Y cómo se comprueba que no se ha abierto ya una posición en esta barra?
Si se ha abierto una nueva barra, con su primer tick se puede abrir una posición,
Si no hay posiciones, se puede abrir la primera posición.
Es decir, por alguna razón se abren dos posiciones a la vez en el primer tick de una nueva barra. Y sólo se abren las primeras posiciones. Además, este fenómeno no se observa.
Si se ha abierto una nueva barra, con su primer tick se puede abrir una posición,
Si no hay posiciones, se puede abrir la primera posición.
Es decir, por alguna razón se abren dos posiciones a la vez en el primer tick de una nueva barra. Y sólo se abren las primeras posiciones. Además, este fenómeno no se observa.
No tengo tiempo para analizar lo que sucede allí. Pero intente comprobar el número de posiciones abiertas en la nueva barra. Si no es así, abre.
......
EA funciona, pero cuando intento abrirlo en el editor
......
no es un ejecutable, es un archivo mq5...
este es mi código...
Así que forme sus frases correctamente.
Sobre el tema. Suelo abrir estos problemas en el Bloc de notas++. Ayuda. Pero no siempre )))
Así que forme sus frases correctamente.
Sobre el tema. Suelo abrir estos problemas en el Bloc de notas++. Ayuda. Pero no siempre ))))
También decidí revisarlo con el Notepad++ y era casi todo ceros, aunque el archivo tenía el tamaño normal como debería ser...
He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.
La función OnTick()
Sólo la función CheckForOpen() es responsable de la apertura de posiciones:
La función que envía una solicitud para abrir una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando hago pruebas con la demo de MetaQuotes MT5.
La función de controlar la apertura de un nuevo bar:
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi MT5 demo ICMarkets hedge, así como el ordenador. Captura de pantalla del doblete.
Todo el EA.
He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.
La función OnTick()
Sólo la función CheckForOpen() es responsable de la apertura de posiciones:
La función que envía una solicitud para abrir una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando hago pruebas con la demo de MetaQuotes MT5.
La función de controlar la apertura de un nuevo bar:
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi cobertura MT5 demo ICMarkets, así como el ordenador. Captura de pantalla del doblete.
Todo el EA.
Utilizo esta función para controlar la nueva barra - a veces hay errores al copiar la fecha de la barra.
Hay veces que hay errores al copiar la fecha de la barra.
Gracias. Intentaré reemplazarlo. Aunque hasta ahora la función que he utilizado ha funcionado bien también. Tengo una idea para imprimir la hora de apertura de la barra y el precio, entonces se vería claramente que el error es en este caso particular.
Sin embargo, me confunde el hecho de que los duplots aparezcan sólo en la apertura de la primera posición mientras que las posiciones posteriores se abren correctamente y el EA trabaja durante horas generando decenas de ellos. Y la función de control de apertura de la barra funciona siempre. Y de acuerdo con las condiciones el Asesor Experto abre la primera posición cuando no hay ninguna y las siguientes se abren sólo cuando el precio se ha movido lo suficiente después de que se abrió la primera.
He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.
La función OnTick()
Sólo la función CheckForOpen() es responsable de la apertura de posiciones:
La función que envía una solicitud de apertura de una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando pruebo con la demo de MetaQuotes MT5.
La función de controlar la apertura de un nuevo bar:
La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi cobertura MT5 demo ICMarkets, así como el ordenador. Captura de pantalla del doblete.
Todo el EA.
¿Y cómo se comprueba que no se ha abierto ya una posición en esta barra?
¿Y cómo se comprueba que aún no se ha abierto ninguna posición en esta barra?
No, no existe tal control.
Hay controles de este tipo:
- Si se ha abierto una nueva barra, con su primer tick se puede abrir una posición,
- Si no hay posiciones, se puede abrir la primera posición.
Es decir, por alguna razón se abren dos posiciones a la vez en el primer tick de una nueva barra. Y sólo se abren las primeras posiciones. Además, este fenómeno no se observa.No, no existe tal control.
Hay controles de este tipo:
- Si se ha abierto una nueva barra, con su primer tick se puede abrir una posición,
- Si no hay posiciones, se puede abrir la primera posición.
Es decir, por alguna razón se abren dos posiciones a la vez en el primer tick de una nueva barra. Y sólo se abren las primeras posiciones. Además, este fenómeno no se observa.No tengo tiempo para analizar lo que sucede allí. Pero intente comprobar el número de posiciones abiertas en la nueva barra. Si no es así, abre.