Привет всем!!! На форуме впервые... Надеюсь поможете решить проблемку по фиксации профита...

 

Значит такая ситуация... Создал цикл проверки профита в виде:

while (true) // бесконечный цикл проверки профита
{
Sleep(1000); // проверяем профит каждую секунду
if ( AccountBalance() > AccountBalance_Old) //если текущий баланс больше ранее сохранёного

// баланса, значит получен профит

вот... Потом идет удаление ордеров... Профит получается результатом закрытия по ТэйкПрофиту одного из ордеров... Как можно заменить эту операцию? А то тестер стратегий зацикливается на данном этапе и не тестирует... Помогите пожалуйста!

 

Вы такую конструкцию сами придумали, или где-то подсмотрели?

Уберите цикл и "будет вам счастье". :)))

 
А что ваша ТС предусматривает в случае только убыточных позиций? Надо быть реалистом.
 
evillive:
А что ваша ТС предусматривает в случае только убыточных позиций? Надо быть реалистом.

Убыточная система также работает. Высчитывается баланс при условии проигрыша и сравнивается с ранее сохраненным.

 
Значит надо в цикле хоть один FALSE предусмотреть, а лучше не один.
 
Если цикл убрать тогда работать не будет наверное, он проверит один раз и пойдет дальше... Разве нет?
 
Вообще, мне нужно чтобы по закрытии ордера по тэйку исполнялось следующее условие по закрытию...
 
Вот цикл в целом... while (true)                                     // бесконечный цикл проверки профита    {             Sleep(1000);                           // проверяем профит каждую секунду       if (  AccountBalance() > AccountBalance_Old) //если текущий баланс больше ранее сохранёного                                                          // баланса, значит получен профит       {          Alert ("Баланс: ", DoubleToStr(AccountBalance(), 2), " Профит = ", AccountBalance()-AccountBalance_Old);// выводим значение баланса          Alert ("Удаляем ордера");          DeleteOrders();                           //удаляем все ордера          break;                                    // выходим из цикла проверки       }                   if ( AccountBalance()
 
Вот надо как то убрать всю эту байду и прописать без цикла... Кстати при удалении цикла программа не работает, как я и предполагал... Ребят помогите плиз составить корректно... Может функцию ордерпрофит использовать?
 
Menestrel:
Вот надо как то убрать всю эту байду и прописать без цикла... Кстати при удалении цикла программа не работает, как я и предполагал... Ребят помогите плиз составить корректно... Может функцию ордерпрофит использовать?


Предлагаю

double Pro = NormalizeDouble(AccountProfit()*100/AccountBalance(),2);

Условие сам составишь?

Если Pro в плюсе, имеем профит, в минусе убыток.

Можно так

if(Pro>=5)//имеем профит 5%
 

Прежде чем что-то програмить, надо представлять как вообще это все работает...

Функция OnTick отрабатывается при каждом тике. OnIinit только один раз при старте.

При этом за секунду может прийти несколько тиков. А если торговать по разным парам то и несколько десятков тиков.

Текущая прибыль по счету - это Equity. Так вот условие -

if (AccountEquty() - AccountBalance()  > x ) CloseAll(); 

При этом будут учитываться свопы и комиссии всех открытых ордеров.

Примерная функция закрытия всех ордеров для исполнению по маркету:

CloseAll ()
{
for (i=OrdersTotal()-1; i>=0; i--)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      OrderClose(OrderTicket(),OrderLots(),0,0,CLR_NONE);
   } 
} 
при исполнение Instant надо указывать цену закрытия. Ask или Bid. 
CloseAll ()
{
double priceclose =0;
for (i=OrdersTotal()-1; i>=0; i--)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if (OrderType()==OP_SELL) priseclose =  MarketInfo(OrderSymbol(),MODE_BID);
      if (OrderType()==OP_BUY)  priceclose =  MarketInfo(OrderSymbol(),MODE_ASK);
      OrderClose(OrderTicket(),OrderLots(),priseclose,0,CLR_NONE);
   } 
} 
код я не проверял, но думаю смысл понятен
Причина обращения: