Причина закрытия последней позиции. Как узнать?

 

Пытаюсь прикрутить что-то типа "мести" за Stoploss - позиция большим лотом на маленький Takeprofit (10 пунктов). Чтоб узнать закрылся ли последний ордер по Stoploss, я пробую использовать следующий метод:

int start()
  {
//----
double LastDealProfit;
//+-----------------------Проверка того, как закрылся последний ордер----------------------------------+
if (OrdersTotal () == 0 && OrdersHistoryTotal() != 0)
     {
     OrderSelect (0, SELECT_BY_POS, MODE_HISTORY);
     LastDealProfit = OrderProfit();
     }
...

ну и потом в условие открытия "мстительной" позиции закладывается условие что LastDealProfit должен быть меньше нуля.

Компилируем, тестируем, получаем такую картинку... мда, картинко как говорится не грузиццо (10 кб, а в течении 7-8 минут никак не загружается). Отвлёкся. Продолжу. Вобщем на одном периоде (период чемпионата 2007) эта мстительная позиция открывается по нескольку раз подряд, несмотря на то, что последний ордер закрыт положительно по тейку. На другом периоде (март-май 2008) вообще не срабатывает сие писание, работа идёт заранее регламентированным лотом, несмотря на редкие закрытия по стопу, т. е. мстительные позиции вообще не открываются.

Внимание вопрос! Является ли моё мнение правильным таким образом узнавать результат закрытия последней позиции? И являются ли эти перебои открытия мстительной позиции недочётом самого тестирования (особенностями тестера стратегий)?

Увидев неоднозначность понимания тестером того, что я хочу, я решил пойти иначе и заменить выше указаный код другим:

int start()
  {
//----
double LastDealProfit = 0;
//+-----------------------Проверка того, как закрылся последний ордер----------------------------------+
if (OrdersTotal () == 0 && OrdersHistoryTotal() != 0)
     {
     OrderSelect (0, SELECT_BY_POS, MODE_HISTORY);
     if (OrderClosePrice () == OrderStopLoss ())       //Если цена закрытия ордера = стоплоссу, то ордер закрылся в убыток
          {
          LastDealProfit = -1;
          }
     }
//------Открытие позиции восполняющей последний убыток--------
if (OrdersTotal () == 0 && LastDealProfit == -1 && TradeConditions () == 1 && LastDeal == -1) // LastDeal - это тип последней сделки (-1 Sell, 1 Buy)
     {
OrderSend(Symbol(),OP_BUY,Lots+1,Ask,3,Ask-SL2*Point,Ask+TP2*Point,0,16385,0,Green);
     }
if (OrdersTotal () == 0 && LastDealProfit == -1 && TradeConditions () == -1 && LastDeal == 1)           
     {                                                                                                 
     OrderSend(Symbol(),OP_SELL,Lots+1,Bid,3,Bid+SL2*Point,Bid-TP2*Point,0,16385,0,White);             
     }

Но результат опять точно тот же самый что и с прошлым кодом. Почему эти восполняющие ордера срабатывают иногда по нескольку раз подряд, несмотря что последний ордер закрылся тейком, или на другом периоде не срабатывают вообще.  Ведь переменная LastDealProfit чётко регламентирует результат закрытия последней позиции. Или нет? Что она тогда выдаёт?

Вобщем главный вопрос остался один: как корректно узнать что последний ордер закрылся по Stoploss или Takeprofit, для дальнейшего введения фильтра открываемой позиции?

 

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

OrderSelect (OrderHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY);

 
А еще лучше заглянуть сюда
 
Meat писал (а) >>

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

OrderSelect (OrderHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY);

Вот это да! После всего. Спасибо. А я понял как с барами, раз нулевой, значит последний.

xrust писал (а) >>
А еще лучше заглянуть сюда


Ну а за это вообще благодарствую. У KimIV наверно есть функции на все случаи жизни.

 
Проверил только что с функцией от KimIV, работает как часы. Прибыль за два месяца увеличилась с 72000 до 85000.
 
Climber писал (а) >>
Проверил только что с функцией от KimIV, работает как часы. Прибыль за два месяца увеличилась с 72000 до 85000.

каким лотом? на какой паре? тф?

 

есть одна неприятная особенность работы тестера и реала или демо

void stats()
{

int iO;
iO = 0;


while ( true )
{
if ( OrderSelect(iO,SELECT_BY_POS,MODE_HISTORY) == true )
{

if ( OrderClosePrice() != 0 )
{

// в тестере приходит только СЮДА

Print( "1 OT="+TimeToStr( OrderClosePrice(), TIME_MINUTES|TIME_SECONDS)+" CT="+TimeToStr( OrderOpenTime(), TIME_MINUTES|TIME_SECONDS) );

}
else
{

// 22.06.08 СЮДА НИКОГДА НЕ ПРИЙДЕТ В ТЕСТЕРЕ! в реале естественно всегода будет приходють именно сюда


23.06.08 это я ошибся


Print( " 2 OT="+TimeToStr( OrderClosePrice(), TIME_MINUTES|TIME_SECONDS)+" CT="+TimeToStr( OrderOpenTime(), TIME_MINUTES|TIME_SECONDS) );
}
iO++;
}
else
break;
}

}

я всего лишь пытался как то

в deinit в режиме тестера

после тестирования - пробежаться по готовой истории - и собрать время удержания позиций

делать это во время тестирования и потом дальнейшей работы эксперта как то не хотелось да и не логично

---

в реале конечно проблем не возникало

----

 
xrust писал (а) >>

каким лотом? на какой паре? тф?

картинка к сожалению не грузится.

Strategy Tester: Expert в нормал
Strategy Tester Report
Expert в нормал
Ukrsotsbank-MT4 (Build 216)

СимволAUDUSD (Australian Dollar vs US Dollar)
Период4 Часа (H4) 2008.03.03 00:00 - 2008.05.16 20:00 (2008.03.01 - 2008.05.19)
МодельВсе тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
ПараметрыTP=80; SL=1; TP2=10; SL2=30; Lots=7;
Баров в истории1332Смоделировано тиков635616Качество моделирования52.30%
Ошибки рассогласования графиков0
Начальный депозит10000.00
Чистая прибыль74345.40Общая прибыль121328.30Общий убыток-46982.90
Прибыльность2.58Матожидание выигрыша1004.67
Абсолютная просадка1200.00Максимальная просадка14145.20 (15.39%)Относительная просадка48.18% (8960.00)
Всего сделок74Короткие позиции (% выигравших)36 (61.11%)Длинные позиции (% выигравших)38 (76.32%)
Прибыльные сделки (% от всех)51 (68.92%)Убыточные сделки (% от всех)23 (31.08%)
Самая большаяприбыльная сделка5622.40убыточная сделка-4620.00
Средняяприбыльная сделка2378.99убыточная сделка-2042.73
Максимальное количествонепрерывных выигрышей (прибыль)7 (21450.80)непрерывных проигрышей (убыток)3 (-2240.00)
Максимальнаянепрерывная прибыль (число выигрышей)21450.80 (7)непрерывный убыток (число проигрышей)-8145.20 (2)
Среднийнепрерывный выигрыш3непрерывный проигрыш1
 
YuraZ писал (а) >>


if ( OrderSelect(iO,SELECT_BY_POS,MODE_HISTORY) == true )
{

if ( OrderClosePrice() != 0 )
{

// в тестере приходит только СЮДА
}
else
{

// СЮДА НИКОГДА НЕ ПРИЙДЕТ В ТЕСТЕРЕ! в реале естественно всегода будет приходють именно сюда

}

С чего это вдруг? OrderClosePrice() всегда больше нуля для всех закрытых ордеров. С какой стати будет приходить в "else" в реале?

 

2 Climber, коллега будте добры постоянным лотом в 0,1 оптимизация любых два месяца этого года, и прогон с начала года по сей момент.

ЗЫ хотя все это совершенно бесполезно - т.к. в приведенном вами брокере авто трейдинг запрещен

 
Meat писал (а) >>

С чего это вдруг? OrderClosePrice() всегда больше нуля для всех закрытых ордеров. С какой стати будет приходить в "else" в реале?

опс... ошибся... устал наверно вчера :-)


---

проблема была вот какая!

в тестере я не мог пробегая по истории получить время открытия и время закрытия одного и того же

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