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

 
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)
         continue;
      if(HistoryDealGetString(ticket, DEAL_SYMBOL) != _Symbol)
         continue;
      if(HistoryDealGetInteger(ticket, DEAL_MAGIC) != MagicNumber)
         continue;

      dealTime    = HistoryDealGetInteger(ticket, DEAL_TIME);
      dealPrice   = HistoryDealGetDouble(ticket, DEAL_PRICE);
      dealProfit  = HistoryDealGetDouble(ticket, DEAL_PROFIT)-HistoryDealGetDouble(ticket, DEAL_SWAP)-HistoryDealGetDouble(ticket, DEAL_COMMISSION);
      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);
     }
  }
 
Я очень благодарен всем за помощь до сих пор, но я считаю, что все, что остается, - это понять причину повторения значений. У меня только одна транзакция на свечу.

Может это потому, что я использую BuyStop и SellStop?



 
Тикет разный у отложки и позиции. Посмотрите в свойстве объекта его название.
 
diegotfcastro:
Я очень благодарен всем за помощь до сих пор, но я считаю, что все, что остается, - это понять причину повторения значений. У меня только одна транзакция на свечу.

Может это потому, что я использую BuyStop и SellStop?

Скорее всего да, у каждого отложенного ордера, свой тикет.

 
diegotfcastro:
Я очень благодарен всем за помощь до сих пор, но я считаю, что все, что остается, - это понять причину повторения значений. У меня только одна транзакция на свечу.

Может это потому, что я использую BuyStop и SellStop?

Добавьте проверку типа и все

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

А вообще у отложек прибыли нет.

 

Вот результат



 
diegotfcastro:

Вот результат

Вы старые объекты удаляете, перед проверкой?

P.S. Сразу внимание не обратил.

void DrawProfit(int MagicNumber)
  {
   long   dealTime   = 0;
   double dealPrice  = 0.0;
   double dealProfit = 0.0;
   ulong  ticket     = 0;
   static datetime CurrDate = 0;

   HistorySelect(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);
      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);
     }
     CurrDate = TimeCurrent()+1;
  }

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

 

да, я его удалил.


У меня есть система с Buystop и Sellstop

и эти приказы истекают через 60 секунд, если не выполнены.

Я считаю, что они мешают.

Мне нужно удалить быть с "0,0"



 

Я извиняюсь, будьте любопытны. Для программирования это очень сильно выручает. Щелкните два раза по объекту, посмотрите его имя, сравните с позициями, отложками. Напишите во всевозможных местах printf(). Появится понимание гораздо быстрее, и на будущее опыт.

Это не нравоучение, а дружеский совет :)

 

Ну и можно добавить проверку стоит ли вообще перебирать что-то.

void DrawProfit(int MagicNumber)
  {
   static datetime CurrDate = 0;
   if(CurrDate>=TimeCurrent())
      return;
   
   long   dealTime   = 0;
   double dealPrice  = 0.0;
   double dealProfit = 0.0;
   ulong  ticket     = 0;

   HistorySelect(CurrDate, TimeCurrent());
   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);
      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);
     }
  }

и можете вызывать ее хоть на каждом тике )