Скачать MetaTrader 5

Сравнение баланса до открытия ордера и после

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не можешь найти ответ на вопрос? Воспользуйся поиском!
Rice
319
Rice 2015.06.11 22:14 

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

К примеру, исходный баланс у нас 1000. Открываем позицию, закрыли, имеем профит 100.

Если текущий баланс больше "предыдущего", увеличиваем лот. Если нет, ставим исходный.

                  Bal=AccountInfoDouble(ACCOUNT_BALANCE); // начальный баланс 1000 до сделки

                  // Закрытие ордера

                  if(AccountInfoDouble(ACCOUNT_BALANCE)>Bal) // текущий баланс 1000+100

                 {

                  L=L+0.1;

                  }

                  else // если получили -100

                  {

                  L=0.1;

                  }

                  Bal=AccountInfoDouble(ACCOUNT_BALANCE);

Этот код работает некорректно. Не могу понять логику и правильную ли я беру переменную?

Спасибо. 

Vladimir Pastushak
68930
Vladimir Pastushak 2015.06.11 22:16  
Rice:

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

К примеру, исходный баланс у нас 1000. Открываем позицию, закрыли, имеем профит 100.

Если текущий баланс больше "предыдущего", увеличиваем лот. Если нет, ставим исходный.

                  Bal=AccountInfoDouble(ACCOUNT_BALANCE); // начальный баланс 1000 до сделки

                  // Закрытие ордера

                  if(AccountInfoDouble(ACCOUNT_BALANCE)>Bal) // текущий баланс 1000+100

                 {

                  L=L+0.1;

                  }

                  else // если получили -100

                  {

                  L=0.1;

                  }

                  Bal=AccountInfoDouble(ACCOUNT_BALANCE);

Этот код работает некорректно. Не могу понять логику и правильную ли я беру переменную?

Спасибо. 

Лучще проверить последний ордер или позицию, если она закрылась сприбылью то увеличим лот если с минусом то .....
Vitalie Postolache
12135
Vitalie Postolache 2015.06.11 23:52  
Код и будет работать некорректно, так как данные теряются при любом перезапуске советника. Лучше проверять историю торгов, там вся информация о прибыли уже есть.
Rice
319
Rice 2015.06.12 08:30  
Vladimir Pastushak:
Лучще проверить последний ордер или позицию, если она закрылась сприбылью то увеличим лот если с минусом то .....
Я сразу так и думал, AccountInfoDouble(ACCOUNT_PROFIT)>0, но это условие почему-то не выполняется, поэтому ставится 0.1
Rice
319
Rice 2015.06.12 08:33  
Vitalie Postolache:
Код и будет работать некорректно, так как данные теряются при любом перезапуске советника. Лучше проверять историю торгов, там вся информация о прибыли уже есть.

Почему же некорректно?

Вначале задаём переменной исходный баланс на момент запуска.

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

Выполняем условие и приравниваем текущий баланс переменной. И так далее. 

Alexander Laur
7692
Alexander Laur 2015.06.12 08:51  
Rice:

Почему же некорректно?

Вначале задаём переменной исходный баланс на момент запуска.

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

Выполняем условие и приравниваем текущий баланс переменной. И так далее. 

Баланс Вы должны проверять после сделки, а не на каждом тике, баре и т.д. В Вашем коде значение баланса сохраняется на каждой отработке советника.

Нужно примерно так:

double startBalance;
double L;
//+------------------------------------------------------------------+

int OnInit()
{
//---
   startBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   L = 0.1;
   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

void OnTick()
{
//---
   if (PositionsTotal() == 0)
   {
      double bal = AccountInfoDouble(ACCOUNT_BALANCE);
      
      if (bal > startBalance)
      {
         startBalance = bal;
         L += 0.1;
      }
      else
      {
         startBalance = bal;
         L = 0.1;
      }
   }
   
}
//+------------------------------------------------------------------+
Rice
319
Rice 2015.06.12 08:52  

Порылся в справке, через десятые ссылки нашёл. :)

if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_HISTORY))

if(OrderProfit()>0)

{

L=L+0.1;

}

else

{

L=0.1;

}

 Работает. 

Rice
319
Rice 2015.06.12 08:53  
Alexander Laur:

Баланс Вы должны проверять после сделки, а не на каждом тике, баре и т.д. В Вашем коде значение баланса сохраняется на каждой отработке советника.

Нужно примерно так:

Спасибо, учту. :)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий