Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 52

 
ilnur17021992:
можно ли в ценовой метке (OBJ_ARROW_LEFT_PRICE) вместо цены вывести свой текст, если да то как?
ObjectCreate(Name,OBJ_TEXT,Window,aTime,aPrice);
 
Доброго времени суток! Может кто нибудь объяснить, почему не совпадают цены на H4 и M15 графиках? На скриншоте на М15 цена пересекла красную линию(слева от вертикальной линии). А через минуту сделан скрин H4, где цена еще очень далеко до неё(справа от линии).
 А вот в той программе только у другого дц тень от свечи есть(свеча крайняя справа)
 
Equal:
Доброго времени суток! Может кто нибудь объяснить, почему не совпадают цены на H4 и M15 графиках? На скриншоте на М15 цена пересекла красную линию(слева от вертикальной линии). А через минуту сделан скрин H4, где цена еще очень далеко до неё(справа от линии).
 А вот в той программе только у другого дц тень от свечи есть(свеча крайняя справа)
Для вас в новинку, что котировки в разных ДЦ различаются? Да они различные даже для демо и реала в одном и том же ДЦ! Какой сюрприз (:
 

Пытаюсь написать что то подобное: IceFX DrawProfit

Код:

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

Все работает, но я использую сеточный советник, который в момент кроет пачку ордеров и в итоге профит накладывается друг на друга, хотелось бы что бы профит этой закрытой пачки суммировался и отображалась только сумма (как это реализовано в индикаторе IceFX DrawProfit), а не отдельно для каждого ордера как сейчас у меня. Помогите довести до ума :)  


Файлы:
 
Vitalie Postolache:
Для вас в новинку, что котировки в разных ДЦ различаются? Да они различные даже для демо и реала в одном и том же ДЦ! Какой сюрприз (:
Сюрприз в другом. Это ведь один и тот же реальный счет, и цена меняется(не совпадает) просто при переходе на другой таймфрейм.
В другом же дц тоже на реальном счете при смене графика все ок! То что у различных цена разная это понятно, не понятно что у одного как бы две цены сразу, на минутах одна на часах другая(сильно другая). Я понимаю что так быть как будто не должно, но где проблема может быть. Свечка та кстати "исправилась" где то через час после открытия следующей.
 
ilnur17021992:

Пытаюсь написать что то подобное: IceFX DrawProfit

Код:

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

Все работает, но я использую сеточный советник, который в момент кроет пачку ордеров и в итоге профит накладывается друг на друга, хотелось бы что бы профит этой закрытой пачки суммировался и отображалась только сумма (как это реализовано в индикаторе IceFX DrawProfit), а не отдельно для каждого ордера как сейчас у меня. Помогите довести до ума :)  


Профит считаем в отдельном цикле
 
Alekseu Fedotov:
Профит считаем в отдельном цикле
А именно?  Как определить что конкретные ордера являются группой и их профит нужно просуммировать? 
 
ilnur17021992:
А именно?  Как определить что конкретные ордера являются группой и их профит нужно просуммировать? 
А каким способом они закрываются, группой через функцию, или как-то по другому?
 
Vitaly Muzichenko:
А каким способом они закрываются, группой через функцию, или как-то по другому?
Ордера открывает робот сеточник,  для всей группы высчитывает и ставит один общий ТП, по которому они потом закрываются. 


Скрин прилагаю: 
Файлы:
 
ilnur17021992:
Ордера открывает робот сеточник,  для всей группы высчитывает и ставит один общий ТП, по которому они потом закрываются. 

Скрин прилагаю: 

Примерно так:

//+------------------------------------------------------------------+
//| 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);
}
Причина обращения: