Нарисуйте прибыль на свече, закрывшей сделку - страница 3

 
все норм. но что за манипуляции с
CurrDate

не проще

...StringToTime(CurrDate)...
 заменить на
iTime(Symbol(),PERIOD_D1,0)
и убрать строчку с 

string CurrDate = TimeToString(TimeCurrent(), TIME_DATE);

?

 
diegotfcastro:

Теперь мне просто нужно выяснить, почему он ставит вдвое больше

ну, ... тут три варианта надо попробовать, чтобы исправить этот косяк

либо заставить перерисовать чарт в начале тика командой:

https://www.mql5.com/ru/docs/chart_operations/chartredraw

либо удалять объект каждый раз перед созданием:

ObjectDelete(0,name);

либо тут:

ObjectCreate(_Symbol,StringFormat("Profit %s",profit),OBJ_TEXT,0,0,0);

сделать так:

ObjectCreate(0,IntegerToString(i),OBJ_TEXT,0,0,0);
ну и далее проставить 
IntegerToString(i)
вместо name
Документация по MQL5: Операции с графиками / ChartRedraw
Документация по MQL5: Операции с графиками / ChartRedraw
  • www.mql5.com
ChartRedraw - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Renat Akhtyamov:
все норм. но что за манипуляции с

не проще

?

Да тут наверно еще проще ему запомнить время закрытия ближайшей найденной сделки и потом от него искать.

P.S. Я об этом потом подумал, когда код скинул, но влом уже было писать с таким вариантом.

 
Konstantin Nikitin:

Да тут наверно еще проще ему запомнить время закрытия ближайшей найденной сделки и потом от него искать.

P.S. Я об этом потом подумал, когда код скинул, но влом уже было писать с таким вариантом.

согласен, не критично
 

Привет всем,

Очень рад сказать, что код работает как надо, результат пишет правильно.


Но я заметил, что OBJ_TEXT не позволяет редактировать фон, то есть вы не можете сделать поле значением внутри, как в примере.


Я провел небольшое исследование, и нам нужно переключиться на OBJ_EDIT, но я не знаю, как сделать так, чтобы расстояния X и Y следовали за свечой.


Сейчас немного, будет круто

Пожалуйста, помогите мне в этой миссии, было весело учиться у вас.


void DrawProfit(int Magic)
  {
   long   dealTime   = 0;
   double dealPrice  = 0.0;
   double dealProfit = 0.0;
   ulong  ticket     = 0;
   string CurrDate   = TimeToString(TimeCurrent(), TIME_DATE);

   HistorySelect(StringToTime(CurrDate), TimeCurrent());
   for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
     {
      ticket = HistoryDealGetTicket(i);
      if(ticket == 0)
         continue;
      if(HistoryDealGetString(ticket, DEAL_SYMBOL) != _Symbol)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_MAGIC) != MagicNumber)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_TYPE) != ORDER_TYPE_BUY &&
         HistoryDealGetInteger(ticket, DEAL_TYPE) != ORDER_TYPE_SELL)
         continue;

      dealTime    = HistoryDealGetInteger(ticket, DEAL_TIME);
      dealPrice   = HistoryDealGetDouble(ticket, DEAL_PRICE);
      dealProfit  = HistoryDealGetDouble(ticket, DEAL_PROFIT)-HistoryDealGetDouble(ticket, DEAL_SWAP)-HistoryDealGetDouble(ticket, DEAL_COMMISSION);

      if(dealProfit != 0.0)
        {

         string name = (string)ticket;
         ObjectCreate(0,name, OBJ_TEXT, 0, dealTime, dealPrice+30*_Point);
         ObjectSetInteger(0,name,OBJPROP_FONTSIZE,15);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,0,ANCHOR_TOP);
         ObjectSetInteger(0,name,OBJPROP_COLOR,clrYellow);
         ObjectSetString(0,name,OBJPROP_TEXT,(string)dealProfit);
         ChartRedraw();
        }

     }


  }
//+------------------------------------------------------------------+
 
diegotfcastro:

Привет всем,

Очень рад сказать, что код работает как надо, результат пишет правильно.


Но я заметил, что OBJ_TEXT не позволяет редактировать фон, то есть вы не можете сделать поле значением внутри, как в примере.


Я провел небольшое исследование, и нам нужно переключиться на OBJ_EDIT, но я не знаю, как сделать так, чтобы расстояния X и Y следовали за свечой.


Сейчас немного, будет круто

Пожалуйста, помогите мне в этой миссии, было весело учиться у вас.

ну и гуд

 

Цель достигнута, миссия выполнена.



void DrawProfit(int Magic)
  {
   long   dealTime   = 0;
   double dealPrice  = 0.0;
   double dealProfit = 0.0;
   ulong  ticket     = 0;
   string CurrDate   = TimeToString(TimeCurrent(), TIME_DATE);

   HistorySelect(StringToTime(CurrDate), TimeCurrent());
   for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
     {
      ticket = HistoryDealGetTicket(i);
      if(ticket == 0)
         continue;
      if(HistoryDealGetString(ticket, DEAL_SYMBOL) != _Symbol)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_MAGIC) != Magic)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_TYPE) != ORDER_TYPE_BUY &&
         HistoryDealGetInteger(ticket, DEAL_TYPE) != ORDER_TYPE_SELL)
         continue;

      dealTime    = HistoryDealGetInteger(ticket, DEAL_TIME);
      dealPrice   = HistoryDealGetDouble(ticket, DEAL_PRICE);
      dealProfit  = HistoryDealGetDouble(ticket, DEAL_PROFIT)-HistoryDealGetDouble(ticket, DEAL_SWAP)-HistoryDealGetDouble(ticket, DEAL_COMMISSION);

      if(dealProfit != 0.0)
        {

         string name = (string)ticket;
         int timeXY;
         int priceXY;
         
         color cor = (dealProfit>0)?clrDarkGreen:clrCrimson;

         ObjectCreate(0,name, OBJ_EDIT,0, 0, 0);
         ChartTimePriceToXY(0,0,dealTime,dealPrice, timeXY, priceXY);    
         ObjectSetInteger(0,name,OBJPROP_XDISTANCE,timeXY);
         ObjectSetInteger(0,name,OBJPROP_YDISTANCE,priceXY);
         ObjectSetString(0,name,OBJPROP_TEXT,(string)dealProfit);
         ObjectSetString(0,name,OBJPROP_FONT,"Arial");
         ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
         ObjectSetInteger(0,name,OBJPROP_ALIGN,ALIGN_CENTER);
         ObjectSetInteger(0,name,OBJPROP_READONLY,false);
         ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
         ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
         ObjectSetInteger(0,name,OBJPROP_BGCOLOR,cor);
         ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,clrWhite);
         ObjectSetInteger(0,name,OBJPROP_BACK,false);
         ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
         ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
         ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
         ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
         ChartRedraw();
        }

     }

  }
//+------------------------------------------------------------------+
 

И все-же вы продолжаете наступать на те-же грабли. Зачем переводить в строку время, а потом гнать его обратно. Если достаточно просто его знать в секундах.

void DrawProfit(int Magic)
  {
   static datetime CurrTime = 0;
   if(CurrTime >= TimeCurrent()) // Если текущее время равно или меньше начало проверки истории
      return;                    // выходим ни чего не делая.

   HistorySelect(CurrTime, TimeCurrent());
   for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
     {
      ulong ticket = HistoryDealGetTicket(i);
      if(ticket == 0)
         continue;
      if(HistoryDealGetString(ticket, DEAL_SYMBOL) != _Symbol)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_MAGIC) != Magic)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_TYPE) != ORDER_TYPE_BUY &&
         HistoryDealGetInteger(ticket, DEAL_TYPE) != ORDER_TYPE_SELL)
         continue;

      datetime dealTime  = HistoryDealGetInteger(ticket, DEAL_TIME);
      if(dealTime > CurrTime)      // Если время совершения сделки больше
         CurrTime = dealTime+1;    // запоминаем его и далее ищем уже с этого промежутка.
      double dealPrice   = HistoryDealGetDouble(ticket, DEAL_PRICE);
      double dealProfit  = HistoryDealGetDouble(ticket, DEAL_PROFIT)-HistoryDealGetDouble(ticket, DEAL_SWAP)-HistoryDealGetDouble(ticket, DEAL_COMMISSION);

      if(dealProfit != 0.0)
        {

         string name = (string)ticket;
         int timeXY;
         int priceXY;
         color cor = (dealProfit>0)?clrDarkGreen:clrCrimson;

         ObjectCreate(0,name, OBJ_EDIT,0, 0, 0);
         ChartTimePriceToXY(0,0,dealTime,dealPrice, timeXY, priceXY);
         ObjectSetInteger(0,name,OBJPROP_XDISTANCE,timeXY);
         ObjectSetInteger(0,name,OBJPROP_YDISTANCE,priceXY);
         ObjectSetString(0,name,OBJPROP_TEXT,(string)dealProfit);
         ObjectSetString(0,name,OBJPROP_FONT,"Arial");
         ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
         ObjectSetInteger(0,name,OBJPROP_ALIGN,ALIGN_CENTER);
         ObjectSetInteger(0,name,OBJPROP_READONLY,false);
         ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
         ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
         ObjectSetInteger(0,name,OBJPROP_BGCOLOR,cor);
         ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,clrWhite);
         ObjectSetInteger(0,name,OBJPROP_BACK,false);
         ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
         ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
         ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
         ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
         ChartRedraw();
        }

     }

  }

Ну и добавил то что обещал.  Запоминания времени последней найденной сделки плюс 1 секунда (плюс, для того чтоб не зацепить снова эту сделку).

P.S. Запомнить время намного проще чем устраивать танцы с бубном, вокруг начала даты. И это еще не только в этой функции танцы, а перед ее вызовом происходят. Чтоб вызвать на последних секундах текущего дня. Зачем это нужно, если можно просто допустим вызывать ее в начале каждого бара и все.
Причина обращения: