Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 52

 
ilnur17021992:
¿Puede la etiqueta de precio(OBJ_ARROW_LEFT_PRICE) tener su propio texto en lugar del precio?
ObjectCreate(Name,OBJ_TEXT,Window,aTime,aPrice);
 
Buenos días, ¿alguien puede explicar por qué los precios en los gráficos H4 y M15 no coinciden? En la captura de pantalla de M15 el precio ha cruzado la línea roja (a la izquierda de la línea vertical). Y un minuto más tarde hay una captura de pantalla de H4 donde el precio está todavía muy lejos de él (a la derecha de la línea).
Y aquí en ese programa sólo otro dtz tiene una sombra de la vela (la vela es más exterior a la derecha)
 
Equal:
Buenos días, ¿alguien puede explicar por qué los precios de los gráficos H4 y M15 no coinciden? En la captura de pantalla de M15 el precio ha cruzado la línea roja (a la izquierda de la línea vertical). Y un minuto más tarde hay una captura de pantalla de H4 donde el precio está todavía muy lejos de él (a la derecha de la línea).
Y aquí está la captura de pantalla de ese programa, pero otro dtz tiene una sombra de la vela (la vela es más externa a la derecha)
¿Es nuevo para usted que las cotizaciones en las distintas empresas de corretaje son diferentes? ¡Son diferentes incluso para la demo y la real en una misma empresa de corretaje! Qué sorpresa (:
 

Tratando de escribir algo similar:IceFX DrawProfit

Código:

void start()
{
   for(int i=0;i<OrdersHistoryTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && OrderType()<=1)
      History();
   }
}
  
void History()
{
   string Ticket=IntegerToString(OrderTicket());
   color col=Red;
   if(OrderType()==0)col=Blue;
   datetime a=OrderOpenTime();
   double b=OrderOpenPrice();
   datetime c=OrderCloseTime();
   double d=OrderClosePrice();
   double profit=OrderProfit();
  
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
      
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
      
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
      
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_WIDTH,2);
   ObjectSetText(Ticket+"Profit",DoubleToString(profit,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d+Point*5);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+10000);      
}

Todo funciona, pero estoy utilizando un asesor de rejilla, que en este momento cubre un montón de órdenes y como resultado el beneficio se superpone entre sí, me gustaría que el beneficio de este montón cerrado se totalice y sólo se muestre la cantidad (como se implementa en el indicadorIceFX DrawProfit), en lugar de por separado para cada orden como tengo ahora. Ayúdame a hacerlo bien :)


Archivos adjuntos:
 
Vitalie Postolache:
¿Es nuevo para usted que las cotizaciones en las distintas empresas de corretaje son diferentes? ¡Sí, son diferentes incluso para la demostración y el comercio real en una misma empresa de corretaje! Qué sorpresa (:
La sorpresa es diferente. Se trata de una misma cuenta real y el precio cambia (no es el mismo) sólo por cambiar de marco temporal.
¡En otra empresa de corretaje también en una cuenta real al cambiar el gráfico todo está bien! El hecho de que los precios sean diferentes está claro, no está claro que uno tenga como si dos precios a la vez, uno en los minutos, otro en las horas sea diferente (muy diferente). Entiendo que no debería ser así pero me pregunto dónde puede estar el problema. Por cierto la vela "corrigió" en una hora después de la apertura de la siguiente.
 
ilnur17021992:

Tratando de escribir algo similar:IceFX DrawProfit

Código:

void start()
{
   for(int i=0;i<OrdersHistoryTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && OrderType()<=1)
      History();
   }
}
  
void History()
{
   string Ticket=IntegerToString(OrderTicket());
   color col=Red;
   if(OrderType()==0)col=Blue;
   datetime a=OrderOpenTime();
   double b=OrderOpenPrice();
   datetime c=OrderCloseTime();
   double d=OrderClosePrice();
   double profit=OrderProfit();
  
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
      
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
      
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
      
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_WIDTH,2);
   ObjectSetText(Ticket+"Profit",DoubleToString(profit,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d+Point*5);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+10000);      
}

Todo funciona, pero estoy utilizando un asesor de rejilla, que en este momento cubre un montón de órdenes y como resultado el beneficio se superpone entre sí, me gustaría que el beneficio de este montón cerrado se totalice y sólo se muestre la cantidad (como se implementa en el indicadorIceFX DrawProfit), en lugar de por separado para cada orden como tengo ahora. Ayúdame a hacerlo bien :)


El beneficio se calcula en un ciclo separado
 
Alekseu Fedotov:
Los beneficios se contabilizan en un ciclo separado
¿Cuál? ¿Cómo sé que las órdenes específicas son un grupo y sus beneficios deben ser sumados?
 
ilnur17021992:
¿Cuál es? ¿Cómo puedo determinar que los pedidos específicos son un grupo y su beneficio debe ser sumado?
¿Y cuál es el método para cerrarlas, un grupo a través de una función, o alguna otra forma?
 
Vitaly Muzichenko:
¿Cómo se cierran, se cierran como grupo a través de una función o de alguna otra manera?
Las órdenes son abiertas por el robot netmaker, para todo el grupo calcula y establece un TP común, por el que luego se cierran.


Adjunto una captura de pantalla:
Archivos adjuntos:
 
ilnur17021992:
Las órdenes son abiertas por el robot netmaker, para todo el grupo calcula y pone un TP común, al que luego se cierran.

Se adjunta captura de pantalla:

Es así:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int TotalPos=-1;
void OnTick()
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

      ...
     }
  }}} TotalPos=OrdersTotal(); // запомним количество

//--
}

//+------------------------------------------------------------------+
//| Create Object istory                                             |
//+------------------------------------------------------------------+
void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
      
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
      
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
  
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",/*White*/clrBlack);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}
Razón de la queja: