Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 307

 
forexman77:

Lo he probado en otro DC y parece que está bien. La pregunta es por qué la llamada:

¿Imprime 0.01, pero imprime 131 en el bot?

Los lotes deben ser normalizados cuando se pasan a la función.

 
Artyom Trishkin:

Los lotes deben normalizarse cuando se transfieren a la función.


En realidad, escribí que estaba normalizando. Hay un límite en el número de lotes en el comercio automático.

No es necesario ser el Capitán Obvio aquí.
 
forexman77:

En realidad, escribí que estaba normalizando. Hay algún tipo de límite en el número de lotes en la negociación automática.

No te pongas en plan Capitán Obvio.

Pues mira tú mismo, si es así como quieres comunicarte.

 
rabanik:

Muchas gracias por la respuesta.

Aquí está la función completa, el punto es que abre una orden y luego añade valores constantes de stop loss y take profit a través de la modificación.

La orden se abre pero el stop loss y el take profit no se establecen (la función de cálculo en rojo, en la queOrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) da un error ((() )

//Función de orden abierta, variables: símbolo, tipo de orden, lote, precio abierto, método de cálculo de TP y SL (0 - fijado en el precio, 1 - fijado en puntos que deben ser calculados desde el precio abierto), stop loss, take profit)

/Símbolo/pareja, tipo de orden abierta - pendiente, precio abierto, interruptor = 1, SL B TP - ¡los valores de stop loss y take profit son constantes!

bool SendOrder(string Symb,int Type, double OP,int Mode) {
color CL;
double Pp = MarketInfo(Symb,MODE_POINT);
si (Tipo==0) CL=Azul;
si (Tipo==1) CL=Rojo;
if (Type==2 || Type==4) CL=DarkTurquoise;
si (Tipo==3 || Tipo==5) CL=Naranja;
//verificación del volumen
if(MarketInfo(Symb,MODE_LOTSTEP)==0,01) DG=2; si no, DG=1;
si (Lote<MarketInfo(Symb,MODE_MINLOT)) Lote=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lote=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("No hay suficiente dinero para abrir la operación",Type," volumen: ",DoubleToStr(Lot,DG)),0);
volver;
}
// comprobar los pedidos pendientes
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
si (Tipo>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //Límite del nivel de stop loss/stake profit en pips. Distancia mínima
double Tek_Ask = MarketInfo(Symb,MODE_ASK); /Último precio comercial recibido. Se almacena en la variable predefinida Ask para el símbolo actual
double Tek_Bid = MarketInfo(Symb,MODE_BID); //El último precio de oferta recibido. Se almacena en la variable predefinida Bid para el símbolo actual
double Tek_Point = MarketInfo(Symb,MODE_POINT); //Tamaño del punto en la moneda de cotización. Se almacena en la variable predefinida Punto para el símbolo actual
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//El número de dígitos después del punto decimal en el precio del símbolo. Para el símbolo actual se almacena en la variable predefinida Dígitos

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
si (Tipo>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv;
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// comprobar paradas
si (SL!=0 || TP!=0) {
si (Modo==0) {
si (MathAbs(OP-SL)<Slv && SL!=0) {
si (Tipo==0 || Tipo==2 | Tipo==4) SL=OP-Slv; si no SL=OP+Slv;
}
si (MathAbs(OP-TP)<Slv && TP!=0) {
si (Tipo==0 || Tipo==2 | Tipo==4) TP=OP+Slv; si no TP=OP-Slv;
}
}sin embargo{
si (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
si (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
//apertura
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Intentando abrir una orden, tipo:",Tipo," volumen:",Lote," precio:",OP),0);
si (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("No se puede abrir la orden ",k),0); Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Pedido abierto ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
¡// establecer paradas
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
si (Tipo==0 || Tipo==2 || Tipo==4) SL=Precio Abierto del Pedido()-SL*Pp;
si (Tipo==1 || Tipo==3 | Tipo==5) SL=Precio Abierto de la Orden()+SL*Pp;
}
si (¡TP!=0) {
si (Tipo==0 || Tipo==2 | Tipo==4) TP=Precio Abierto de la Orden()+TP*Pp;
if (Type==1 || Type==3 | Type==5) TP=OrderOpenPrice()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Intentando poner stops en la orden: ",Ticket," s/l: ",SL," t/p: ",TP),0);
si (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
}else{ PnC(StringConcatenate("No se puede modificar la orden ",k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Pedido modificado ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true);

}

Ahora el siguiente error en la líneaif (Type==0 || Type==2 | Type==4) SL=OrderOpenPrice()-SL*Pp;. La función OrderOpenPrice() devuelve el mismo error - La expresión no pudo ser evaluada. ¡¡¡Qué lío!!!
 
rabanik:
Ahora aquí está el siguiente error en la líneaif (Type==0 || Type==2 | Type==4) SL=OrderOpenPrice()-SL*Pp;. La función OrderOpenPrice() devuelve el mismo error - La expresión no pudo ser evaluada. ¡¡¡Qué lío!!!

Ya está todo solucionado. Perdón por la pregunta tonta. Tengo una variable principal SL de tipo int.

Y estoy tratando de conseguir SL con el tipo doble de nuevo. Pero el sistema devuelve 1.

Gracias.

 

¿Alguien puede sugerir cómo hacer que un EA funcione desde un lugar determinado hasta su inicio, sin seguir ejecutando más operadores?

 

Hola. La pregunta es la siguiente, el EA no abre una operación de venta. ¿Puedes echarle un vistazo?

 if (Digits==3||Digits==5) {sl=SL*10*Point;}
         else if (Digits==4||Digits==2) {sl=SL*Point;}
            if (OrdersTotal()==0)
              {
                if (Close[1]>TD2)
                OrderSend (Symbol(),OP_BUY,Lot,Ask,10,Ask-sl,0,NULL,Magic,0,clrBlue);
                else if (Close[1]<TD1)
                OrderSend (Symbol(),OP_SELL,Lot,Bid,10,Bid+sl,0,NULL,Magic,0,clrRed);
              }
 
6737998:

¿Alguien puede sugerir cómo hacer que un EA funcione desde un lugar determinado hasta su inicio, sin seguir ejecutando más operadores?

Оператор возврата return - Операторы - Основы языка - Справочник MQL4
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
 
danil77783:

Hola. La pregunta es la siguiente, el EA no abre una operación de venta. ¿Puedes echarle un vistazo?

¿Qué es TD1 y dónde se le asigna un valor?
 

Amigos, cómo salir correctamente de esta situación... El indicador dibuja dos líneas horizontales desde el CSV (Rojo - desde el principio del día hasta el final del día) Azul - Rayo procedente de los últimos días, a diferentes niveles de precios. Pero hay días en que estos niveles tienen el mismo valor/precio. Cuál es la forma correcta de salir de esta situación, para que cuando las líneas coincidan, se muestre el Rayo(Azul), y la línea Roja no sea visible en el gráfico, pero esté físicamente presente... es decir, sea transparente.

Ahora - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); deja de dibujar la línea, pero el Rayo tampoco es visible desde abajo. Gracias.

Razón de la queja: