Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 475

 

@Artyom Trishkin@Konstantin Nikitin

Ditemi, è corretto eseguire il polling della funzionevoid NOTIFICATION() attraverso l'int start? C'è un ciclo costante lì! Forse sarebbe più corretto mettere questa logica direttamente in start? Per non sovraccaricare la funzione! E all'inizio l'ho scritto in modo tale che sarebbe stato più piacevole leggerlo da solo!

 
Rewerpool:

@Artyom Trishkin@Konstantin Nikitin

Ditemi, è corretto eseguire il polling della funzionevoid NOTIFICATION() attraverso l'int start? C'è un ciclo costante lì! Forse sarebbe più logico mettere in moto questa logica in una volta sola?

Usa OnTick(). Tutto dipende dalla logica richiesta.
 
Per favore ditemi dove inserire questo ?//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
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);
  }
 

Il codice di Expert Advisor stesso


enum t
{
e=1, // per indicatore parabolico
};
enum tf
{
af=0, // corrente
bf=1, // 1 minuto
cf=2, // 5 minuti
df=3, // 15 minuti
ef=4, // 30 minuti
ff=5, // 1 ora
gf=6, // 4 ore
hf=7, // 1 giorno
};

extern int Magic = 123654789;
extern inttern Slippage = 0;
inttern doppio Lots = 1;
extern int int rsi_period = 14;
extern int rsi_high = 50;
int rsi_price = PRICE_CLOSE;
extern int rsi_low = 50;
int loss_stop = 5000;
extern int take_profit = 5000;
doppio sar_step = 0,03;
doppio sar_max = 0,03;

int GeneralNoLoss = false; // trailing dal punto di pareggio
int parameters_trailing = e; // metodo trawl
int StartTrall = -5000; // profitto minimo della pesca a strascico in punti
int StepTrall = 1; //step trailing stop loss
input tf TF_Tralling = af; // indicatori timeframe (0-corrente)
extern int delta = 50; // rientro dal livello di stop loss calcolato

double Step = 0.03; //Parabolic Step (metodo 4)
doppio Massimo = 0,03; //massimo parabolico (metodo 4)


colore text_color = Lime; //colore delle informazioni in uscita

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

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


int OnInit()

{
//---

//---
ritorno(0);
}

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

int b=0,s=0;
doppio OOP, prezzo_b=0, prezzo_s=0, lotto=0, NLb=0, NLs=0, LS=0, LB=0;
int tip,Ticket;
bool error;
doppio SL, OSL;
int n=0;
se (b==0) SLB=0;
se (s==0) SLS=0;
per (int i=OrdiniTotali(); i>=0; i--)
{
se (OrderSelect(i, SELECT_BY_POS)==true)
{
tip = OrderType();
if (tip<2 && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magico ))
{
OSL = OrderStopLoss();
OOP = OrderOpenPrice();
Ticket = OrderTicket();
n++;
se (tip==OP_BUY)
{
se (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb);
se (SL < NLb+StartTrall*Point) continua;
}
else
{
SL = SlLastBar(OP_BUY,Bid,OOP);
se (SL < OOP+StartTrall*Point) continua;
}
//if (OSL >= OOP && only_NoLoss) continua;
se (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) continua;
}
else
{
SL = SlLastBar(OP_SELL,Ask,OOP);
se (SL > OOP-StartTrall*Point) continua;
}
//if (OSL <= OOP && only_NoLoss) continua;
se ((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 = 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("L'ordine di acquisto è stato inviato!");
ritorno;
}else Print("Buy Order Error");
}
se ((hhchhchhchhchhchhchh))
{
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("L'ordine di vendita è stato inviato!");
ritorno;
}else Print("Sell Order Error");
}
}

//--------------------------------------------------------------------
doppio SlLastBar(int tip,double price,double OOP)
{
doppio prc=0;
switch(parametri_trailing)
{
caso 1: // da indicatore Parabolic
prc = iSAR(Symbol(),TF[TF_Tralling],Step,Maximum,0);
se (tip==OP_BUY)
{
prc = NormalizeDouble(prc - delta*Point,Digits);
if(price-STOPLEVEL*Point < prc) prc=0;
ARROW("cm_SL_Buy", prc, 4, clrAqua);
}
se (tip==OP_SELL)
{
prc = NormalizeDouble(prc + delta*Point,Digits);
se(prezzo+STOPLEVEL*Point > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRed);
}
pausa;
}
ritorno(prc);
}

//--------------------------------------------------------------------
stringa StrPer(int per)
{
if (per == 0) per=Periodo();
se (per == 1) return("M1");
se (per == 5) return("M5");
se (per == 15) return("M15");
se (per == 30) return("M30");
se (per == 60) return("H1");
se (per == 240) return("H4");
se (per == 1440) return("D1");
se (per == 10080) return("W1")
se (per == 43200) return("MN1")
return("errore di periodo");
}
//+------------------------------------------------------------------+
void ARROW(string Name, double Price, int ARROWCODE, color c)
{
ObjectDelete(Name);
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,Name,OBJPROP_COLOR, c);
ObjectSetInteger(0,Name,OBJPROP_WIDTH, 1);
}
//--------------------------------------------------------------------
colore Colore(bool P, colore a, colore b)
{
se (P) ritorno(a);
ritorno(b);
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
Puoi dirmi per favore dove inserire questo?//+------------------------------------------------------------------+

Bene.... se così critico

fare in modo che sia così:

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

bello...)))

 
Alekseu Fedotov:

Bene.... se così critico

fare in modo che sia così:

(bellissimo...))

Ma seriamente?)

 
Vladimir Ozharovskiy:

Ma sul serio?).

Se intendete la funzione stessa, copiate e incollate alla fine del programma,

necessariamente al di fuori della funzione void OnTick()

 
Vladimir Ozharovskiy:

Ma seriamente?)

Immagino che questa funzione non abbia offerte, controlli erapporti

 
Alekseu Fedotov:

Se intendi la funzione stessa, copiala e incollala alla fine del programma,

assicuratevi che sia al di fuori della funzione void OnTick().

E poi cosa dovrebbe fare un uomo? Bisogna chiamarlo correttamente!

 
Sembrava aiutare... Grazie!