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

 
if(TralProcent!=0)
{ NewProfProc=Gewinn(-1)/(Kontostand()/100); if(NewProfProc>0 && (GewinnProzent==0 || GewinnProzent<NewProfProc)) {GewinnProzent=NormalizeDouble(NewProfProc, 2);} if(GewinnProzent>0 && ProfitProcent>(TralProcent+TralStartProcent)) {TrallingProcent=ProfitProcent-TralProcent;} //+------------------------------------------------------------------+ if(NewProfProc>0 && TrallingProcent!=0 && NewProfProc<=TrallingProcent) {CloserS(); CloserB(); ProfitProcent=0; TrallingProcent=0;}

------robot verwendet Schleppnetz in %balance, bitte beraten Sie, wie Sie hier Schrittänderungen hinzufügen können. Wenn ich es richtig verstehe, wird es für Tralingprocent benötigt. Wenn z.B. Schritt =2%, dann erhöht sich der nachlaufende Prozentsatz um mindestens 2%.
 
khorosh:

Artyom Trishkin:

Objekte - sie können in jedem Terminalfenster und seinen Unterfenstern ausgegeben werden.

--------------------------------------------------------------------------------------------------------------------------------------

Ich habe es auf diese Weise versucht, aber es funktioniert nicht.

Vielleicht stimmt etwas mit der Nummerierung der Fenster nicht. Wenn es ein separates Fenster im Diagramm gibt, ist seine Nummer ==1?

wndNum Nummer des Fensters, in dem angezeigt werden soll

int wndNum=1;

int OnInit()
 {
 string short_name=MQLInfoString(MQL_PROGRAM_NAME);
 short_name+=": MyIndicator";
 IndicatorSetString(INDICATOR_SHORTNAME,short_name);
 wndNum=ChartWindowFind(0,short_name);
 //---
   return(INIT_SUCCEEDED);
 }

// Функция создания объекта
void SetLabel(string nm,string text,long xd,long yd,int fs,string font,int cr,int an,color cl,string tooltip,bool sel) {
 if(ObjectFind(0,nm)<0) {
    ObjectCreate(0,nm,OBJ_LABEL,wndNum,0,0);
    ObjectSetInteger(0,nm,OBJPROP_CORNER,cr);
    ObjectSetInteger(0,nm,OBJPROP_ANCHOR,an);
    ObjectSetString (0,nm,OBJPROP_FONT,font);
    ObjectSetInteger(0,nm,OBJPROP_FONTSIZE,fs);
    ObjectSetInteger(0,nm,OBJPROP_BACK,false);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,sel);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,sel);
    ObjectSetString (0,nm,OBJPROP_TOOLTIP,tooltip);
  }
    ObjectSetInteger(0,nm,OBJPROP_YDISTANCE,yd);
    ObjectSetInteger(0,nm,OBJPROP_XDISTANCE,xd);
    ObjectSetString (0,nm,OBJPROP_TEXT,text);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,cl); 
 }
P.S.khorosh, ich kann nicht privat antworten - der Chat funktioniert nicht!
 
Vitaly Muzichenko:

wndNum Nummer des Fensters, in dem angezeigt werden soll

P.S.khorosh, ich kann dir nicht privat antworten - der Chat funktioniert nicht!

Vielen Dank, Vitaliy! Und wie kann ich ihn an der Spitze der Kurve eines Indikators anbringen, der sich in einem separaten Fenster befindet? Ich habe versucht, Time[0] und den Wert des Kurvenpuffers am Nulldurchgang als Koordinaten zu setzen, aber es hat nicht funktioniert.

 
khorosh:

Danke, Vitaly! Und wie kann man es mit der Spitze der Kurve des Indikators verbinden, der sich in einem separaten Fenster befindet? Ich habe versucht, Time[0] und den Kurvenpufferwert auf der Nullleiste als Koordinaten zu setzen, aber das funktioniert nicht.

So hat er auf diese Frage geantwortet. Die einzige Nuance, die oft auftaucht, ist der wndNum-Wert selbst. Der Wert von wndNum ist keine Konstante. Sie muss ständig überwacht werden. Der Benutzer kann das Teilfenster des Indikators löschen, das dem aktuellen Fenster vorausgeht. Suchen Sie auch nicht nach dem Indikator selbst in OnInit(). Dieser Code sollte in OnCalculate() verschoben werden. Auf jeden Fall sollten Sie immer prüfen, ob der Index des Teilfensters korrekt ist.

 
Ihor Herasko:

So hat er die Frage beantwortet. Die einzige Nuance, die oft auftaucht, ist der wndNum-Wert selbst. Der Wert von wndNum ist keine Konstante. Sie muss ständig überwacht werden. Der Benutzer kann das Teilfenster des Indikators löschen, das dem aktuellen Fenster vorausgeht. Suchen Sie auch nicht nach dem Indikator selbst in OnInit(). Dieser Code sollte in OnCalculate() verschoben werden. In jedem Fall müssen Sie immer prüfen, ob der Index des Teilfensters korrekt ist.

Er hat ein Beispiel, bei dem die Objektkoordinaten zunächst als Pixel angenommen werden (statisches Objekt). Aber ich muss an eine Indikatorkurve gebunden werden. Wir müssen also zunächst diese Koordinaten berechnen. Sie wird in seinem Werk nicht gezeigt. Ich habe es auf diese Weise versucht, aber es funktioniert nicht (in der Variable LevLabelSpread gibt es einen Kurvenpufferwert für den ersten Balken):

....
int X=0,Y=0;
   wndNum=ChartWindowFind(0,Shortname);  
   ChartTimePriceToXY( 0,wndNum,Time[1],LevLabelSpread,X,Y); Print("X=",X," Y=",Y);    
   if(ObjectFind("_Spread")<0) 
     {
      ObjectCreate(0,"_Spread", OBJ_TEXT, wndNum, 0,0);
      ObjectSetText("_Spread", "                Spread", 10, "Arial", clrYellow);
     }
   else
     {
      ObjectSetInteger(0,"_Spread",OBJPROP_YDISTANCE,Y);
      ObjectSetInteger(0,"_Spread",OBJPROP_XDISTANCE,X);
      ObjectSetString (0,"_Spread",OBJPROP_TEXT,"                Spread");
     } 

.... 
 
khorosh:

Er hat ein Beispiel, bei dem die Objektkoordinaten zunächst als Pixel angenommen werden (statisches Objekt). Aber ich muss sie mit einer Indikatorkurve verknüpfen. Ich muss diese Koordinaten also vorher berechnen. Sie wird in seinem Werk nicht gezeigt. Ich habe es auf diese Weise versucht, aber es funktioniert nicht (die Variable LevLabelSpread hat den Kurvenpufferwert des ersten Balkens):

Warum sollte ich für ein Objekt vom Typ TEXT den Preis in Pixel berechnen? Er wird nach Uhrzeit und Preis positioniert. Bei mir sieht es so aus:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int nWndIndex = ChartWindowFind();
   if (nWndIndex < 0)
      return 0;
      
   string sName = "MyText";
   if (ObjectFind(0, sName) < 0)
      ObjectCreate(0, sName, OBJ_TEXT, nWndIndex, time[rates_total - 1], <здесь значение индикатора>);
      
   ObjectSetInteger(0, sName, OBJPROP_ANCHOR, ANCHOR_LEFT);
   ObjectSetString(0, sName, OBJPROP_TEXT, "Sample text");

   return(rates_total);
}

Ergebnis:


 
Ihor Herasko:

Warum wird der Preis für ein TEXT-Objekt in Pixel berechnet? Er wird nach Uhrzeit und Preis positioniert. Ich habe es so verstanden:

Ergebnis:


Ich danke Ihnen vielmals.

 
Ihor Herasko:


Es hat gut funktioniert:


 
Erläutern Sie bitte die Bedeutung und den Zweck der beiden Begriffe "Chart Handle" und "Chart Identifier". Was ist der Unterschied zwischen ihnen und wie und wann werden sie eingesetzt?
 
khorosh:
Erläutern Sie bitte die Bedeutung und den Zweck von zwei Begriffen: Chart-Handle undChart-Identifier. Was ist der Unterschied zwischen ihnen und wie und wann werden sie eingesetzt?

Zeigen Sie mir, wie Sie beides bekommen. Bisher scheint es, dass wir über dieselbe Sache sprechen.