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

 

@Artyom Trishkin@Konstantin Nikitin

Dime, ¿es correcto sondear la funciónvoid NOTIFICATION() a través del int start? ¡Hay un bucle constante ahí! ¿Tal vez sería más correcto poner esta lógica directamente en el inicio? Para no sobrecargar la función ¡Y originalmente lo escribí de tal manera que sería más agradable leerlo yo mismo!

 
Rewerpool:

@Artyom Trishkin@Konstantin Nikitin

Dime, ¿es correcto sondear la funciónvoid NOTIFICATION() a través del int start? ¡Hay un bucle constante ahí! ¿Tal vez sería más lógico poner en marcha esta lógica de una vez?

Utilice OnTick(). Todo depende de la lógica requerida.
 
Por favor, dígame dónde insertar esto//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
 

El código del Asesor Experto en sí mismo


enumera t
{
e=1, // por indicador Parabólico
};
enum tf
{
af=0, // actual
bf=1, // 1 minuto
cf=2, // 5 minutos
df=3, // 15 minutos
ef=4, // 30 minutos
ff=5, // 1 hora
gf=6, // 4 horas
hf=7, // 1 día
};

extern int Magia = 123654789;
externo inttern Deslizamiento = 0;
inttern double Lots = 1;
extern int rsi_period = 14;
extern int rsi_high = 50;
int rsi_price = PRICE_CLOSE;
extern int rsi_low = 50;
int parada_pérdida = 5000;
extern int toma_ganancia = 5000;
double sar_step = 0,03;
double sar_max = 0,03;

int GeneralNoLoss = false; // a partir del punto de equilibrio
int parameters_trailing = e; // método de arrastre
int StartTrall = -5000; // ganancia mínima de arrastre en puntos
int StepTrall = 1; //step trailing stop loss
input tf TF_Tralling = af; // indicadores timeframe (0-actual)
extern int delta = 50; // sangría del nivel de stop loss calculado

double Paso = 0.03; //Paso Parabólico (método 4)
double Máximo = 0.03; //Máximo Parabólico (método 4)


color text_color = Lime; //color de la información de salida

doble ma, rsi, sar_1, sar_2, ma_1, ma_2, ma_3, ma_4, ma_5, ma_6;
datetime LastBuyTime, LastSellTime;

int NIVEL DE PARADA;
int TF[10]={0,1,5,15,30,60,240,1440,10080,43200};
doble SLB=0,SLS=0;


int OnInit()

{
//---

//---
return(0);
}

void OnTick(){
STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);

int b=0,s=0;
doble OOP,precio_b=0,precio_s=0,lote=0,NLb=0,NLs=0,LS=0,LB=0;
int punta,Billete;
bool error;
doble SL,OSL;
int n=0;
si (b==0) SLB=0;
si (s==0) SLS=0;
for (int i=Total de pedidos(); i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
punta = OrderType();
if (tip<2 && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic ))
{
OSL = OrderStopLoss();
OOP = OrderOpenPrice();
Ticket = OrderTicket();
n++;
if (tip==OP_BUY)
{
si (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb);
si (SL < NLb+StartTrall*Punto) continuar;
}
si no
{
SL = SlLastBar(OP_BUY,Bid,OOP);
si (SL < OOP+StartTrall*Point) continuar;
}
//si (OSL >= OOP && only_NoLoss) continuar;
si (SL >= OSL + StepTrall*Point && (Bid-SL)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White);
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
if (tip==OP_SELL)
{
si (GeneralNoLoss)
{
SL = SlLastBar(OP_SELL,Ask,NLs);
si (SL > NLs-StartTrall*Point) continuar;
}
si no
{
SL = SlLastBar(OP_SELL,Ask,OOP);
si (SL > OOP-StartTrall*Point) continuar;
}
//si (OSL <= OOP && only_NoLoss) continuar;
if ((SL <= OSL-StepTrall*Point || OSL==0) && (SL-Ask)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White);
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
}
}
}
ma = iMA(Symbol(), 0, 70, 0, MODE_SMA, PRICE_CLOSE, 1);
rsi = iRSI(Symbol(), 0, rsi_period, rsi_price, 1);
sar_1 = iSAR(Symbol(), 0, sar_step, sar_max, 1);
sar_2 = iSAR(Symbol(), 0, sar_step, sar_max, 2);


si ((sar_step))
{
LastBuyTime = Time[0];
if(OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), Slippage, Ask - loss_stop*Point, Ask + take_profit*Point, "Order", Magic, 0, clrGreen) > 0){
Print("¡La orden de compra ha sido enviada!");
volver;
}else Print("Error en la orden de compra");
}
si ((hhchhchhchhchhchh))
{
LastSellTime = Time[0];
if(OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), Slippage, Bid + loss_stop*Point, Bid - take_profit*Point, "Order", Magic, 0, clrRed) > 0)
{
Print("¡La orden de venta ha sido enviada!");
volver;
}else Print("Error en la orden de venta");
}
}

//--------------------------------------------------------------------
double SlLastBar(int tip,double price,double OOP)
{
doble prc=0;
switch(parametros_de_trabajo)
{
caso 1: // por indicador Parabólico
prc = iSAR(Símbolo(),TF[TF_Tralling],Paso,Máximo,0);
if (tip==OP_BUY)
{
prc = NormalizarDoble(prc - delta*Punto,Dígitos);
if(precio-STOPLEVEL*Punto < prc) prc=0;
ARROW("cm_SL_Buy", prc, 4, clrAqua);
}
if (tip==OP_SELL)
{
prc = NormalizarDoble(prc + delta*Punto,Dígitos);
if(precio+STOPLEVEL*Punto > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRed);
}
romper;
}
return(prc);
}

//--------------------------------------------------------------------
string StrPer(int per)
{
if (per == 0) per=Period();
if (per == 1) return("M1");
if (per == 5) return("M5");
if (per == 15) return("M15");
if (per == 30) return("M30");
if (per == 60) return("H1");
if (per == 240) return("H4");
if (per == 1440) return("D1");
if (per == 10080) return("W1")
if (per == 43200) return("MN1")
return("error de periodo");
}
//+------------------------------------------------------------------+
void FLECHA(cadena Nombre, doble Precio, int CODIGO FLECHA, color c)
{
BorrarObjeto(Nombre);
ObjectCreate(Name,OBJ_ARROW,0,Time[0],Price,0,0,0);
ObjectSetInteger(0,Name,OBJPROP_ARROWCODE,ARROWCODE);
ObjectSetInteger(0,Name,OBJPROP_SELECTABLE, false);
ObjectSetInteger(0,Name,OBJPROP_SELECTED, false);
ObjectSetInteger(0,Nombre,OBJPROP_COLOR, c);
ObjectSetInteger(0,Name,OBJPROP_WIDTH, 1);
}
//--------------------------------------------------------------------
color Color(bool P,color a,color b)
{
si (P) return(a);
volver(b);
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
¿Puede decirme dónde insertar esto?//+------------------------------------------------------------------+

Bueno.... si es tan crítico

que lo haga:

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+

bonito...))

 
Alekseu Fedotov:

Bueno.... si es tan crítico

que lo haga:

(hermoso...))

Pero en serio...)

 
Vladimir Ozharovskiy:

Pero en serio...)

Si te refieres a la función en sí, cópiala y pégala al final del programa,

necesariamente fuera de la función void OnTick()

 
Vladimir Ozharovskiy:

Pero en serio...)

Supongo que esta función no tiene ofertas, controles einformes

 
Alekseu Fedotov:

Si te refieres a la función en sí, cópiala y pégala al final del programa,

asegúrese de que está fuera de la función void OnTick().

¿Y entonces qué debe hacer un hombre? Hay que llamarlo correctamente.

 
Parece que ha ayudado... Gracias.
Razón de la queja: