Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 544

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

------robot utilise le chalut dans le %balance, veuillez indiquer comment ajouter des changements d'étape ici. Si je comprends bien, il est nécessaire pour Tralingprocent. Par exemple, si l'étape =2%, le pourcentage de suivi augmente d'au moins 2%.
 
khorosh:

Artyom Trishkin:

Objets - ils peuvent être émis dans n'importe quelle fenêtre du terminal et ses sous-fenêtres.

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

J'ai essayé comme ça, mais ça ne marche pas.

Il y a peut-être un problème avec la numérotation des fenêtres. S'il y a une fenêtre séparée dans le graphique, son numéro ==1 ?

wndNum numéro de la fenêtre à afficher

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, je ne peux pas répondre en privé - le chat ne fonctionne pas !
 
Vitaly Muzichenko:

wndNum numéro de la fenêtre à afficher

P.S.khorosh, je ne peux pas vous répondre en privé - le chat ne fonctionne pas !

Merci, Vitaliy ! Et comment l'attacher à l'extrémité de la courbe d'un indicateur qui se trouve dans une fenêtre séparée ? J'ai essayé de définir Time[0] et la valeur du tampon de courbe sur la barre de zéro comme coordonnées, mais cela n'a pas fonctionné.

 
khorosh:

Merci, Vitaly ! Et comment le lier à l'extrémité de la courbe de l'indicateur qui est dans la fenêtre séparée ? J'ai essayé de définir Time[0] et la valeur du tampon de la courbe sur la barre de zéro comme coordonnées, mais cela ne fonctionne pas.

C'est ainsi qu'il a répondu à cette question. La seule nuance qui apparaît souvent est la valeur wndNum elle-même. La valeur de wndNum n'est pas une constante. Elle doit faire l'objet d'un suivi constant. L'utilisateur peut supprimer la sous-fenêtre de l'indicateur qui précède la fenêtre actuelle. Ne cherchez pas non plus l'indicateur lui-même dans OnInit(). Ce code devrait être déplacé vers OnCalculate(). Dans tous les cas, vous devez toujours vérifier si l'indice de la sous-fenêtre est correct.

 
Ihor Herasko:

C'est ainsi qu'il a répondu à la question. La seule nuance qui apparaît souvent est la valeur wndNum elle-même. La valeur de wndNum n'est pas une constante. Elle doit faire l'objet d'un suivi constant. L'utilisateur peut supprimer la sous-fenêtre de l'indicateur qui précède la fenêtre actuelle. Ne cherchez pas non plus l'indicateur lui-même dans OnInit(). Ce code devrait être déplacé vers OnCalculate(). Dans tous les cas, vous devez toujours vérifier si l'indice de la sous-fenêtre est correct.

Son exemple montre que les coordonnées de l'objet sont initialement supposées être en pixels (objet statique). Mais j'ai besoin de me lier à une courbe indicatrice. Donc, nous devons d'abord calculer ces coordonnées. Cela n'apparaît pas dans son travail. J'ai essayé de cette façon, mais cela ne fonctionne pas (dans la variable LevLabelSpread, il y a une valeur de tampon de courbe sur la première barre) :

....
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:

Il présente un exemple où les coordonnées d'un objet sont initialement supposées être en pixels (objet statique). Mais je dois le relier à une courbe indicatrice. Je dois donc calculer ces coordonnées à l'avance. Cela n'apparaît pas dans son travail. J'ai essayé de cette façon mais cela ne fonctionne pas (la variable LevLabelSpread a la valeur du tampon de courbe sur la première barre) :

Pourquoi dois-je calculer le prix en pixels pour un objet de type TEXTE ? Il est positionné par le temps et le prix de la barre. Je l'ai comme ça :

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);
}

Résultat :


 
Ihor Herasko:

Pourquoi calculer le prix en pixels d'un objet TEXTE ? Il est positionné par le temps et le prix de la barre. Je vois ça comme ça :

Résultat :


Merci beaucoup.

 
Ihor Herasko:


Ça a bien marché :


 
Veuillez expliquer la signification et le but des deux concepts : poignée de carte etidentifiant de carte. Quelle est la différence entre eux et comment et quand ils sont utilisés.
 
khorosh:
Veuillez expliquer la signification et l'objectif de deux notions : poignée de carte etidentifiant de carte. Quelle est la différence entre eux et comment et quand ils sont utilisés.

Montre-moi comment tu obtiens les deux. Jusqu'à présent, il semble que nous parlions de la même chose.

Raison: