Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 35

 

¡Hola!
Para arreglar el indicador, había que sustituir todos los puntos "." por un "" en blanco.

Archivos adjuntos:
supDem.zip  68 kb
 

Saludos.

He cambiado el tipo de selección depedidos en la función escrita de determinados recuentos de pedidos, de selección por pedido a selección por ticket.

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

Después de eso, cuando se ejecutan unas pocas docenas de velas, todo funciona correctamente y después se repiten los errores en el registro:

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: ticket 2 desconocido para la función OrderModify

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // Número de entrada no válido.

Aquí está el texto completo, lo he cambiado en las cuatro funciones:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


Y aquí hay un momento - después de que cambié la función de selección, la función de modificación de la orden comenzó a generar un error y sólo después de algún tiempo deprueba, al principio todo era normal.

¿Por qué ocurre esto y cómo solucionarlo?


 
spoiltboy:

Saludos.

He cambiado el tipo de selección depedidos en la función escrita de determinados recuentos de pedidos, de selección por pedido a selección por ticket.

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

Después de eso, cuando se ejecutan unas pocas docenas de velas, todo funciona correctamente y después se repiten los errores en el registro:

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: ticket 2 desconocido para la función OrderModify

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // Número de entrada no válido.

Aquí está el texto completo, lo he cambiado en las cuatro funciones:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


Y aquí hay un momento - después de que cambié la función de selección, la función de modificación de la orden comenzó a generar un error y sólo después de algún tiempo deprueba, al principio todo era normal.

¿Por qué ocurre esto y cómo solucionarlo?


Lo más probable es que este error se deba a que está intentando modificar una orden que ya ha sido activada o eliminada. Debería borrar las variables donde se almacena el ticket de la orden pendiente, por ejemplo, cuando la orden pendiente ha sido activada.
 
Sergey Gritsay:
Probablemente este error se debe a que está intentando modificar una orden pendiente que ya ha sido activada o eliminada. Es necesario restablecer las variables donde se almacena la entrada pendiente, por ejemplo, cuando la orden pendiente ha sido activada.
¿Sabe cómo hacerlo correctamente? No tengo ni idea de cómo hacerlo.
 

Hola a todos, ayúdenme a entender lo que está mal.

mi Asesor Experto abre ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green);

cerrar МТ4, abrir МТ4 y comprobar el trabajo previo del EA

for(int prev=0; prev<OrdersTotal();prev++) //Comprobación de la operación EA anterior

{

ViborOrdera=OrderSelect(prev,SELECT_BY_POS);

if(OrderSymbol()==Symbol())

//*************************************

//-------Comprobar el ciclo de compras--------

if(OrderType()==OP_BUY && OrderMagicNumber()==1111)

{

PriceAsk=OrderOpenPrice();//precio abierto, necesario para el trabajo posterior del EA

}

pregunta, ¿dónde está el error, no hay comprobación? El cuerpo del bucle está en el Inite.

 

No hay tiempo para resolverlo..........

Intenta leer y colocar en los lugares adecuados.

boolRefreshRates();

///
 
ed3sss:

Hola a todos, ayúdenme a entender lo que está mal.

mi Asesor Experto abre ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green);

cerrar МТ4, abrir МТ4 y comprobar el trabajo previo del EA


Pregunta, ¿dónde está el error, no hay comprobación? El cuerpo del bucle está en Inite.

Y demostrar que es el bucle que no entra en el bucle. Además, ¿por qué comprobar TODOS los pedidos, desde el principio de la vida de la cuenta, si se necesitan los últimos?
 
Mikhail Kozhemyako:

No hay tiempo para resolverlo..........

Intenta leer y colocar en los lugares adecuados.

boolRefreshRates();

///
No ayudó(
 
Vitalie Postolache:
Y demostrar que es el ciclo el que no entra. Además, ¿por qué debemos comprobar TODOS los pedidos desde el principio de la vida de la cuenta si necesitamos los más recientes?

Prueba: Print("PrecioPrevio-",PrecioPrevio); el registro está vacío.

Además, ¿por qué debemos comprobar TODOS los pedidos desde el principio de la vida de la cuenta, si necesitamos los más recientes? - ¿Cómo hacerlo si hay 10 pares de divisas abiertos?


 

Todo estaba bien hasta que cambiamos ViborOrdera=OrderSelect(prev,SELECT_BY_POS) en MQL;

Antes eraOrderSelect(prev,SELECT_BY_POS);. Fue hace mucho tiempo), pero funcionó.

Razón de la queja: