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

 
Привет ребята,

Я пытаюсь создать элемент, который записывает прибыль от последней транзакции выше на свече, завершившей транзакцию.

Пока мне удалось добраться сюда, но я все еще не смог заставить его делать то, что мне нужно.


void DrawProfit()
{
     double profit = 0;
     ulong  ticket;
     string CurrDate = TimeToString(TimeCurrent(), TIME_DATE);

     HistorySelect(StringToTime(CurrDate), TimeCurrent());
     for(int i = HistoryDealsTotal() - 1; i >= 0; i--) {
          ticket = HistoryDealGetTicket(i);
          if(ticket > 0) {
               if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber) {
                    profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
                    ObjectCreate(_Symbol,StringFormat("Profit %s",profit),OBJ_TEXT,0,0,0);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_FONTSIZE,8);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_COLOR,clrWhite);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_BGCOLOR,clrGreen);
                    ObjectSetString(0,StringFormat("Profit %s",profit),OBJPROP_TEXT,profit);
                    break;
               }
          }
     }
}


В качестве демонстрации следую моей цели:



 
int  iBarShift( 
   string           symbol,          // символ 
   int              timeframe,       // период 
   datetime         time,            // время 
   bool             exact=false      // режим 
   );

Вставляете время закрытия позиции и получаете номер бара

int shift=iBarShift(NULL,0,closePos); 
 

Это все еще не работает.


input ulong MagicNumber = 999;

void OnTick()
  {
      DrawProfit();
  }
//+------------------------------------------------------------------+
void DrawProfit()
{
     double profit = 0;
     ulong  ticket;
     string CurrDate = TimeToString(TimeCurrent(), TIME_DATE);

     HistorySelect(StringToTime(CurrDate), TimeCurrent());
     for(int i = HistoryDealsTotal() - 1; i >= 0; i--) {
          ticket = HistoryDealGetTicket(i);
          if(ticket > 0) {
               if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber) {
                    profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
                    long  closePos = HistoryDealGetInteger(ticket, DEAL_TIME);
                    int shift= iBarShift ( NULL , 0 ,closePos);
                    ObjectCreate(0,StringFormat("Profit %s",profit),OBJ_TEXT,0,shift,profit);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_FONTSIZE,8);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_COLOR,clrWhite);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_BGCOLOR,clrGreen);
                    ObjectSetString(0,StringFormat("Profit %s",profit),OBJPROP_TEXT,(string)profit);
                    break;
               }
          }
     }
}
 
diegotfcastro:

Это все еще не работает.

У функцию создания объекта вставляется дата и цена, а не индекс бара и цена. Так же делайте это datetime (так понятнее что это).

datetime closePos = (datetime) HistoryDealGetInteger(ticket, DEAL_TIME);
                    
ObjectCreate(0,StringFormat("Profit %s",profit),OBJ_TEXT,0,closePos,profit);

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

string name = StringFormat("Profit %s",profit);
ObjectCreate(0,name,OBJ_TEXT,0,closePos,profit);
и т.д.
 

Я не знаю, что случилось, это не работает;


input ulong MagicNumber = 999;

void OnTick()
  {
      DrawProfit();
  }
//+------------------------------------------------------------------+
void DrawProfit()
{
     double profit = 0;
     ulong  ticket;
     string CurrDate = TimeToString(TimeCurrent(), TIME_DATE);

     HistorySelect(StringToTime(CurrDate), TimeCurrent());
     for(int i = HistoryDealsTotal() - 1; i >= 0; i--) {
          ticket = HistoryDealGetTicket(i);
          if(ticket > 0) {
               if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber) {
                    profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
                    long  closePos = HistoryDealGetInteger(ticket, DEAL_TIME);
                    int shift= iBarShift (_Symbol ,Period() ,closePos);
                    string name = StringFormat ( "Profit %s" ,profit);
                    ObjectCreate ( 0 ,name, OBJ_TEXT , 0 ,closePos,profit);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_FONTSIZE,8);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_COLOR,clrWhite);
                    ObjectSetInteger(0,StringFormat("Profit %s",profit),OBJPROP_BGCOLOR,clrGreen);
                    ObjectSetString(0,StringFormat("Profit %s",profit),OBJPROP_TEXT,(string)profit);
               }
          }
     }
}
 
diegotfcastro:

Я не знаю, что случилось, это не работает;

Везде, где

StringFormat("Profit %s",profit)

замените на

name 
 

Мы приближаемся к цели, но все еще не работает.

Я увидел, что информация появляется в окне объекта.

Но на графике его нет.


input ulong MagicNumber = 999;

void OnTick()
  {
      DrawProfit();
  }
//+------------------------------------------------------------------+
void DrawProfit()
{
     double profit = 0;
     ulong  ticket;
     string CurrDate = TimeToString(TimeCurrent(), TIME_DATE);

     HistorySelect(StringToTime(CurrDate), TimeCurrent());
     for(int i = HistoryDealsTotal() - 1; i >= 0; i--) {
          ticket = HistoryDealGetTicket(i);
          if(ticket > 0) {
               if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber) {
                    profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
                    long  closePos = HistoryDealGetInteger(ticket, DEAL_TIME);
                    int shift= iBarShift (_Symbol ,Period() ,closePos);
                    string name = (string) ticket;
                    ObjectCreate (0 ,name, OBJ_TEXT , 0 ,closePos,profit);
                    ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8);
                    ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
                    ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrGreen);
                    ObjectSetString(0,name,OBJPROP_TEXT,(string)profit);
               }
          }
     }
}



 
Нужно добавить фильтр. Либо по способу изменения позиции (вход в рынок или выход из него). Либо по профиту. Грубо говоря, все что имеет результат отличный от нуля.

Покажите параметры объекта (цену и дату)
 
void DrawProfit(int MagicNumber)
{
   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) 
      {
         if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber) 
         {
            dealTime    = HistoryDealGetInteger(ticket, DEAL_TIME);
            dealPrice   = HistoryDealGetDouble(ticket, DEAL_PRICE); 
            dealProfit  = HistoryDealGetDouble(ticket, DEAL_PROFIT);                     
            string name = (string)ticket;                    
            
            ObjectCreate (0 ,name, OBJ_TEXT , 0 , dealTime, dealPrice);
            ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8);
            ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
            ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrGreen);
            ObjectSetString(0,name,OBJPROP_TEXT,(string)dealProfit);
         }
      }
   }
}
 
Оба, ты сделал это!
Спасибо, вы были великолепны!
 

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

Причина обращения: