Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 475

 

@Artyom Trishkin@Konstantin Nikitin

Diga-me, é correto fazer uma pesquisa sobre a função de NOTIFICAÇÃO() dovazio através do int start? Há ali um loop constante! Talvez fosse mais correto colocar essa lógica diretamente em marcha? Para não sobrecarregar a função! E eu o escrevi originalmente de tal forma que seria mais agradável lê-lo eu mesmo!

 
Rewerpool:

@Artyom Trishkin@Konstantin Nikitin

Diga-me, é correto fazer uma pesquisa sobre a função de NOTIFICAÇÃO() dovazio através do int start? Há ali um loop constante! Talvez fosse mais lógico colocar essa lógica em marcha de uma só vez?

Use OnTick(). Tudo depende da lógica necessária.
 
Você pode me dizer onde inserir isto ?//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
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);
  }
 

O próprio código do Expert Advisor


enum t
{
e=1, // por indicador parabólico
};
enum tf
{
af=0, // corrente
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 dia
};

magia int externa = 123654789;
Slippage externo interno = 0;
Lotes duplos inttern = 1;
período int int rsi_periodo externo = 14;
int rsi_high = 50;
int rsi_price = PREÇO_CLOSE;
rsi_low int externo = 50;
int loss_stop = 5000;
lucro_interno externo = 5000;
duplo sar_step = 0,03;
duplo sar_max = 0,03;

int GeneralNoLoss = falso; // trilha a partir do ponto de equilíbrio
int parameters_trailing = e; // método de arrasto
int StartTrall = -5000; // lucro mínimo da rede de arrasto em pontos
int StepTrall = 1; //step trailing stop loss
entrada tf TF_Tralling = af; // indicadores tempo (0-corrente)
delta int externo = 50; // travessão a partir do nível de stop loss calculado

Passo duplo = 0,03; //Passo parabólico (método 4)
duplo Máximo = 0,03; //Parabólico Máximo (método 4)


cor texto_cor = cal; //cor da saída da informação

double ma, rsi, sar_1, sar_2, ma_1, ma_2, ma_3, ma_4, ma_5, ma_6;
datatime LastBuyTime, LastSellTime;

int STOPLEVEL;
int TF[10]={0,1,5,15,30,60,240,1440,10080,43200};
duplo SLB=0,SLS=0;


int OnInit()

{
//---

//---
retorno(0);
}

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

int b=0,s=0;
duplo OOP,price_b=0,price_s=0,lot=0,NLb=0,NLs=0,LS=0,LB=0;
int tip,Ticket;
erro de bool;
duplo SL,OSL;
int n=0;
se (b==0) SLB=0;
se (s==0) SLS=0;
para (int i=OrdensTotal(); i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS)==verdadeiro)
{
dica = OrderType();
se (dica<2 && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic ))
{
OSL = OrderStopLoss();
OOP = OrderOpenPrice();
Ticket = OrderTicket();
n++;
se (tip===OP_BUY)
{
se (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb);
se (SL < NLb+StartTrall*Point) continuar;
}
senão
{
SL = SlLastBar(OP_BUY,Bid,OOP);
se (SL < OOP+StartTrall*Point) continuar;
}
// se (OSL >= OOP && only_NoLoss) continuar;
if (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));
}
}
se (tip===OP_SELL)
{
se (GeneralNoLoss)
{
SL = SlLastBar(OP_SELL,Ask,NLs);
se (SL > NLs-StartTrall*Point) continuar;
}
senão
{
SL = SlLastBar(OP_SELL,Ask,OOP);
se (SL > OOP-StartTrall*Point) continuar;
}
// se (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);


se ((sar_step))
{
LastBuyTime = Tempo[0];
if(OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), Slippage, Ask - loss_stop*Point, Ask + take_profit*Point, "Order", Magic, 0, clrGreen) > 0){
Imprimir ("Buy Order has been sent sent!");
retornar;
}else Print("Buy Order Error");
}
se ((hhchhchhchhchhchhchhh))
{
LastSellTime = Tempo[0];
if(OrderSend(Symbol(), OP_SELLL, Lots, NormalizeDouble(Bid, Digits), Slippage, Bid + loss_stop*Point, Bid - take_profit*Point, "Order", Magic, 0, clrRed) > 0)
{
Imprimir ("Ordem de Venda foi enviada!");
retornar;
}else Print("Sell Order Error");
}
}

//--------------------------------------------------------------------
duplo SlLastBar(int tip,double price,double OOP)
{
duplo prc=0;
switch(parameters_trailing)
{
caso 1: // por indicador parabólico
prc = iSAR(Symbol(),TF[TF_Tralling],Step,Maximum,0);
se (tip===OP_BUY)
{
prc = NormalizeDouble(prc - delta*Point,Dígitos);
if(price-STOPLEVEL*Point < prc) prc=0;
ARROW("cm_SL_Buy", prc, 4, clrAqua);
}
se (tip===OP_SELL)
{
prc = NormalizeDuplo(prc + delta*Point,Dígitos);
if(price+STOPLEVEL*Point > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRRed);
}
pausa;
}
retorno(prc);
}

//--------------------------------------------------------------------
StrPer(int por)
{
se (per === 0) per=Periodo();
se (per === 1) retorno("M1");
se (per == 5) retorno("M5");
se (per === 15) retorno("M15");
se (per === 30) retornar("M30");
se (per === 60) retorno("H1");
se (per == 240) retornar("H4");
se (per == 1440) retornar("D1");
se (per == 10080) retorno("W1")
se (per == 43200) retorno("MN1")
retorno("period error");
}
//+------------------------------------------------------------------+
ARROTA nula(string Name, double Price, int ARROWCODE, cor c)
{
ObjectDelete(Nome);
ObjectCreate(Nome,OBJ_ARROW,0,Tempo[0],Preço,0,0,0,0);
ObjectSetInteger(0,Nome,OBJPROP_ARROWCODE,ARROWCODE);
ObjectSetInteger(0,Nome,OBJPROP_SELECTABLE, falso);
ObjectSetInteger(0,Name,OBJPROP_SELECTED, false);
ObjectSetInteger(0,Nome,OBJPROP_COLOR, c);
ObjectSetInteger(0,Nome,OBJPROP_WIDTH, 1);
}
//--------------------------------------------------------------------
cor(bool P,cor a,cor b)
{
se (P) retornar(a);
retorno(b);
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
Você pode me dizer onde inserir isto ?//+------------------------------------------------------------------+

Bem.... se tão crítico

faça com que isso aconteça:

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

agradável...))))

 
Alekseu Fedotov:

Bem.... se tão crítico

faça com que isso aconteça:

(lindo...)))

Mas sério ?)

 
Vladimir Ozharovskiy:

Mas sério?)

Se você se refere à função em si, copie e cole até o final do programa,

necessariamente fora da função OnTick() vazia

 
Vladimir Ozharovskiy:

Mas sério ?)

Presumo que esta função não tem licitação, verificações erelatórios

 
Alekseu Fedotov:

Se você se refere à função em si, copie e cole até o final do programa,

certifique-se de que está fora da função OnTick() vazia.

E então o que um homem deve fazer? Você tem que chamá-lo corretamente!

 
Parece ter ajudado... Obrigado!