Как запомнить баланс при открытии ордера?

 

Здравствуйте.

При переборе ордеров в архиве определяю профит,объём,и никак не могу найти какой был баланс, на момент открытия выбранного ордера,который в убыток попал.Пытался: записать его в комент, и через OrderComment() вытащить, не получилось; при открытии ордера в Print записать, через OrderPrint() из журнала тоже достать не смог.

 
Комментарий (может быть изменён сервером), магик (неудобно по отношению к другим советникам), глобальные переменные (удаляются через некоторое время, если не использовались (вроде 30 дней было)), файл. Без кода не понятно, что именно не получается
 
По идее, только сохранение текущего значения баланса каким-либо своим способом подойдет (например, в файл). Что-то типа таблицы для каждого ордера.
 
Valerii Mazurenko:
Комментарий (может быть изменён сервером), магик (неудобно по отношению к другим советникам), глобальные переменные (удаляются через некоторое время, если не использовались (вроде 30 дней было)), файл. Без кода не понятно, что именно не получается
int start()
{

//нужна эта строчка ниже
if(профит<0) balans=print();// если последняя сделка закрылась с минусом,то балансу присвоим прошлый баланс




ticket1 = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,"", Magic, 0, Blue);
        if (ticket1 > 0)
           {
             Print("Баланс на время открытия ордера",AccountBalance());        
           }
   
   return(0);
}

//+------------------------------------------------------------------+ 

string print()
{
datetime time=0; 

 for(int f=OrdersHistoryTotal()-1; f>=0; f--)
 {
   if(OrderSelect(f,SELECT_BY_POS,MODE_HISTORY))
   {
      if(OrderSymbol()==Symbol())
      {
         if(OrderMagicNumber()==Magic)// || Magic==-1)
         {
            if(OrderCloseTime()>time) 
              {
               time=OrderCloseTime();            
               string print=OrderPrint(); // для профита так double profit=OrderProfit();    
              
              }


           }
       }
    }
   }
    return(print); 
 }
//-----------------------------------------------------------
 
Dima DD:
ticket1 = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "" , Magic, 0, Blue);

Так вы ведь не задали баланс при выставлении ордера. Вставьте вместо кавычек что-то вроде (выделяем чем-то, что-бы суметь вытащить, если ДЦ поменяет комментарий):

"_" + DoubleToStr(AccountBalance() + "_"

ну и найти значение из OrderComment():

comment = OrderComment();
int firstTag = StringFind(comment, "_");
int finishTag = StringFind(comment, "_", firstTag + 1);
double positionBalance = 0;
if (finishTag > firstTag) {
    positionBalance = StrToDouble(StringSubstr(comment, firstTag + 1, finishTag - firstTag - 1);
} else {
    positionBalance = 0;//не удалось найти
}
P. S. Накидал на глаз, не проверял, но суть должна быть ясна и для дебага информация тоже есть
 
Valerii Mazurenko:

Так вы ведь не задали баланс при выставлении ордера. Вставьте вместо кавычек что-то вроде (выделяем чем-то, что-бы суметь вытащить, если ДЦ поменяет комментарий):

ну и найти значение из OrderComment():

P. S. Накидал на глаз, не проверял, но суть должна быть ясна и для дебага информация тоже есть
   Я string присваивал double без преобразования, поэтому не получалось.Спасибо.
 

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

 
Andrey Khatimlianskii:

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

Не понял Разве люди здесь не говорят об МТ4

Где примерной код?

А то в МТ4 такое чудище:

 printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));

нигде не найдёшь. 

 
Stefan Stoyanov:

Не понял Разве люди здесь не говорят об МТ4

Где примерной код?

А то в МТ4 такое чудище:

 printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));

нигде не найдёшь. 

Плохо искали, AccountInfoDouble в МТ4 давно работает.