Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 475

 

@Artyom Trishkin@Konstantin Nikitin

Ist es richtig, die Funktionvoid NOTIFICATION() durch den int start abzufragen? Das ist eine Dauerschleife! Vielleicht wäre es richtiger, diese Logik direkt in den Start zu integrieren? Damit die Funktion nicht überlastet wird! Und ich habe ihn ursprünglich so geschrieben, dass es angenehmer wäre, ihn selbst zu lesen!

 
Rewerpool:

@Artyom Trishkin@Konstantin Nikitin

Ist es richtig, die Funktionvoid NOTIFICATION() durch den int start abzufragen? Das ist eine Dauerschleife! Vielleicht wäre es logischer, diese Logik gleich in Gang zu setzen?

OnTick() verwenden. Es hängt alles von der erforderlichen Logik ab.
 
Bitte sagen Sie mir, wo ich dies einfügen kann://+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
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);
  }
 

Der Code des Expert Advisors selbst


Aufzählung t
{
e=1, // durch den Parabolischen Indikator
};
Aufzählung tf
{
af=0, // aktuell
bf=1, // 1 Minute
cf=2, // 5 Minuten
df=3, // 15 Minuten
ef=4, // 30 Minuten
ff=5, // 1 Stunde
gf=6, // 4 Stunden
hf=7, // 1 Tag
};

extern int Magic = 123654789;
extern inttern Schlupf = 0;
inttern double Lots = 1;
extern int int rsi_period = 14;
extern int rsi_high = 50;
int rsi_price = PRICE_CLOSE;
extern int rsi_low = 50;
int verlust_stop = 5000;
extern int take_profit = 5000;
double sar_step = 0.03;
double sar_max = 0,03;

int GeneralNoLoss = false; // Nachlauf vom Breakeven-Punkt
int parameters_trailing = e; // Schleppnetzmethode
int StartTrall = -5000; // minimaler Schleppnetzgewinn in Punkten
int StepTrall = 1; //Schrittweiser nachlaufender Stopp-Loss
input tf TF_Tralling = af; // Indikatoren Zeitrahmen (0-aktuell)
extern int delta = 50; // Einrückung vom berechneten Stop-Loss-Level

double Step = 0.03; //Parabolischer Schritt (Methode 4)
double Maximum = 0.03; //Parabolisches Maximum (Methode 4)


color text_color = Lime; //Farbe der Informationsausgabe

double 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};
doppelt SLB=0,SLS=0;


int OnInit()

{
//---

//---
zurück(0);
}

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

int b=0,s=0;
double OOP,price_b=0,price_s=0,lot=0,NLb=0,NLs=0,LS=0,LB=0;
int tip,Ticket;
bool error;
doppelt SL,OSL;
int n=0;
wenn (b==0) SLB=0;
wenn (s==0) SLS=0;
for (int i=OrdersTotal(); i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
tip = OrderType();
if (tip<2 && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic ))
{
OSL = OrderStopLoss();
OOP = OrderOpenPrice();
Ticket = OrderTicket();
n++;
wenn (Tipp==OP_BUY)
{
wenn (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb);
wenn (SL < NLb+StartTrall*Point) weiter;
}
sonst
{
SL = SlLastBar(OP_BUY,Bid,OOP);
wenn (SL < OOP+StartTrall*Point) weiter;
}
//if (OSL >= OOP && only_NoLoss) continue;
wenn (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));
}
}
wenn (Tipp==OP_SELL)
{
wenn (GeneralNoLoss)
{
SL = SlLastBar(OP_SELL,Ask,NLs);
wenn (SL > NLs-StartTrall*Point) weiter;
}
sonst
{
SL = SlLastBar(OP_SELL,Ask,OOP);
wenn (SL > OOP-StartTrall*Point) weiter;
}
//if (OSL <= OOP && only_NoLoss) continue;
wenn ((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);


wenn ((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("Kaufauftrag wurde gesendet!");
Rückkehr;
}else Print("Buy Order Error");
}
wenn ((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("Sell Order has been sent!");
Rückkehr;
}else Print("Sell Order Error");
}
}

//--------------------------------------------------------------------
double SlLastBar(int tip,double price,double OOP)
{
double prc=0;
switch(parameter_trailing)
{
Fall 1: // durch Parabolindikator
prc = iSAR(Symbol(),TF[TF_Tralling],Step,Maximum,0);
wenn (Tipp==OP_BUY)
{
prc = NormalizeDouble(prc - delta*Point,Digits);
if(Preis-STOPLEVEL*Point < prc) prc=0;
PFEIL("cm_SL_Buy", prc, 4, clrAqua);
}
wenn (Tipp==OP_SELL)
{
prc = NormalizeDouble(prc + delta*Point,Digits);
if(Preis+STOPLEVEL*Point > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRed);
}
Pause;
}
zurück(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("Periodenfehler");
}
//+------------------------------------------------------------------+
void ARROW(string Name, double Preis, int ARROWCODE, Farbe c)
{
ObjectDelete(Name);
ObjectCreate(Name,OBJ_ARROW,0,Zeit[0],Preis,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);
}
//--------------------------------------------------------------------
Farbe Farbe(bool P,Farbe a,Farbe b)
{
if (P) return(a);
zurück(b);
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
Können Sie mir bitte sagen, wo ich das einfügen soll?//+------------------------------------------------------------------+

Nun.... wenn so kritisch

es so zu machen:

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

schön...)))

 
Alekseu Fedotov:

Nun.... wenn so kritisch

es so zu machen:

(wunderschön...)))

Aber ernsthaft?)

 
Vladimir Ozharovskiy:

Aber ernsthaft?)

Wenn Sie die Funktion selbst meinen, kopieren Sie sie und fügen Sie sie ganz am Ende des Programms ein,

notwendigerweise außerhalb der Funktion void OnTick()

 
Vladimir Ozharovskiy:

Aber ernsthaft?)

Ich nehme an, dass diese Funktion keine Gebote, Prüfungen undBerichte enthält.

 
Alekseu Fedotov:

Wenn Sie die Funktion selbst meinen, kopieren Sie sie und fügen Sie sie am Ende des Programms ein,

Stellen Sie sicher, dass es außerhalb der Funktion void OnTick() liegt.

Und was soll ein Mann dann tun? Sie müssen es richtig nennen!

 
Es schien zu helfen... Ich danke Ihnen!
Grund der Beschwerde: