В событии OnTrade беру следующие цены:
ORDER_SL и ORDER_TP не меняются ни при каких транзакциях. Меняются только ORDER_PRICE_CURRENT и ORDER_PRICE_OPEN. После ооооочень длительных мучений я таки решил фиксировать установленные стопы... не по стопам а по "цене открытия" исторического ордера. Минус подхода в том, что я не знаю, что изменилось - тейкпрофит или стоплосс. Так что делаю с учетом выполненной последовательности.
Что то напутали в консерватории?!
В торговой истории сохраняются текущие уровни SL и TP которые были у позиции на момент закрытия.
Если бы каждая модификация позиции сохранялась в торговую историю - никакого хранилища бы не хватило.
В торговой истории сохраняются текущие уровни SL и TP которые были у позиции на момент закрытия.
Если бы каждая модификация позиции сохранялась в торговую историю - никакого хранилища бы не хватило.
МТ5 классная прога, но OnTrade работает неправильно!!
Пример минимальный в студию. Особенно интересует, как получаете и изменяете order_ticket
В моей стратегии я должен вести учет текущий и исторический. При этом исторический меня интересует не дальше последнего бая и селла.
Поэтому я решил создать 2 массива positions_int и positions_double, в которых и учитывать все что нужно. Вопрос встал, как заполнить стопы. В итоге я заполняю их после положительного изменения: ctrade.ResultRetcode()
В OnTrade оставил только записи об открытии новых сделок и закрытии по стопам имеющихся:
void OnTrade(){ trade_event_is_processed = false; HistorySelect(0, _TimeCurrent+10); bool order_position_id_found = false; int i, j, orders_total = HistoryOrdersTotal(); int position_id, reason; ulong order_ticket; int positions_index = ArrayRange(positions_int, 0); for(i=0; i<orders_total; i++){ if((order_ticket = HistoryOrderGetTicket(i)) > 0){ if(HistoryOrderGetString(order_ticket, ORDER_SYMBOL) == _Symbol){ if(HistoryOrderGetInteger(order_ticket, ORDER_MAGIC) == 8121983){ position_id = (int) HistoryOrderGetInteger(order_ticket, ORDER_POSITION_ID); if(position_id != 0){ order_position_id_found = false; reason = (int) HistoryOrderGetInteger(order_ticket, ORDER_REASON); for(j=0; j<ArrayRange(positions_int, 0); j++){ if(positions_int[j][0] == position_id){ order_position_id_found = true; // еще не закрыто if(positions_int[j][3] == 0){ // это закрытие if(reason == ORDER_REASON_SL || reason == ORDER_REASON_TP){ positions_int[j][3] = (int) HistoryOrderGetInteger(order_ticket, ORDER_TIME_DONE); } // и вот где-то здесь хотелось бы получать стопы, но стопы, как написал в посте выше, всегда равны нуль // } } } // если ордер не найден, значит, новая позиция if(!order_position_id_found){ ArrayResize(positions_double, positions_index+1); ArrayResize(positions_int, positions_index+1); positions_int[positions_index][0] = position_id; positions_int[positions_index][1] = (int) HistoryOrderGetInteger(order_ticket, ORDER_TYPE); positions_int[positions_index][2] = (int) HistoryOrderGetInteger(order_ticket, ORDER_TIME_DONE); positions_int[positions_index][3] = 0; positions_double[positions_index][0] = HistoryOrderGetDouble(order_ticket, ORDER_PRICE_OPEN); positions_double[positions_index][1] = 0; positions_double[positions_index][2] = 0; } } } } } } }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В событии OnTrade беру следующие цены:
ORDER_SL и ORDER_TP не меняются ни при каких транзакциях. Меняются только ORDER_PRICE_CURRENT и ORDER_PRICE_OPEN. После ооооочень длительных мучений я таки решил фиксировать установленные стопы... не по стопам а по "цене открытия" исторического ордера. Минус подхода в том, что я не знаю, что изменилось - тейкпрофит или стоплосс. Так что делаю с учетом выполненной последовательности.
Что то напутали в консерватории?!
P.S. После того как написал, понял что и это неправильно. И сдался. Ушел есть мороженое.